2008-09-16 8 views
19

Estoy intentando modificar mi script de GreaseMonkey para que no se active en window.onload a window.DOMContentLoaded, pero este evento nunca se dispara.¿Cómo implementar el evento "DOM Ready" en un script de GreaseMonkey?

estoy usando Firefox 2.0.0.16/Greasemonkey 0.8.20080609

This es el guión completo que estoy tratando de modificar, cambiar:

window.addEventListener ("load", doStuff, false); 

a

window.addEventListener ("DOMContentLoaded", doStuff, false); 

Respuesta

24

Así que busqué en Google greasemonkey dom ready y el first result parecía decir que el script de greasemonkey se está ejecutando realmente en "DOM listo" por lo que solo tiene que eliminar la llamada de carga y ejecutar el script de inmediato.

Quité el window.addEventListener ("load", function() { y }, false); envoltura y funcionó perfectamente. Es mucho más receptivo de esta manera, la página aparece de inmediato con su script aplicado y todas las preguntas ocultas resaltadas, sin parpadeo alguno. Y hubo mucho regocijo ... sí.

10

Los scripts de GreaseMonkey se ejecutan en DOMContentLoaded, por lo que no es necesario agregar un controlador de eventos de carga; solo haga que su script haga lo que necesite de inmediato.

http://wiki.greasespot.net/DOMContentLoaded

+0

El uso de Firefox 3.6 pre-lanzamiento, que estaba tratando de escribir un script de usuario sencilla para colorear los anuncios orientados horizontalmente en la búsqueda de Google como solían ser (hice clic en un enlace para llevarme a una página patrocinada por la industria del gas cuando buscaba "gasland") y no funcionó. Luego probé la respuesta principal: addEventListener para el evento 'load', y funcionó. –

1

@ Sam: Sí, yo estaba tratando de la misma:

// ==UserScript== 
// @name   Stack Overflow highlight viewed questions 
// @namespace  * 
// @include  http://stackoverflow.com/questions 
// @include  http://stackoverflow.com/questions?* 
// @include  http://stackoverflow.com/questions 
// @include  http://stackoverflow.com/questions?* 
// @version  0.55 (DOM-Ready instead of onload) 
// ==/UserScript== 

(function() { 

    // Customizable items 
    // var fav_tags = ["python", "database", "mysql"];   // Your favorite tags 
    const UNSEEN_BACK_COLOR = "rgb(225,210,210)";  // Backcolor for the question already seen 
    const FAV_TAG_BACK_COLOR = "rgb(210,210,225)"; // Backcolor for the favorite tags 

    // Internal to the DOM 
    // const QUESTION_URL = "http:\/\/stackoverflow.com\/questions\/([0-9]+)\/"; 
    const QUESTION_URL = "http:\/\/stackoverflow.com\/questions\/([0-9]+)\/"; 
    const TAG_PREFIX = "show questions tagged "; 

    const SEEN_MARK = "x"; 
    // 

    var seen_q = []; 
    var seen_q_str = ""; 

    var seen_q_str = GM_getValue ("seen_q", ""); 
    var seen_q = seen_q_str.split("|"); 

    var fav_tags_str = GM_getValue ("fav_tags", "") 
    var fav_tags = fav_tags_str.split(" ") 

    var already_run = false; 

    GM_registerMenuCommand ("Set favorite tags", askTags); 

    // window.addEventListener ("DOMContentLoaded", doStuff, false); 
    if (! doStuff()) { 
     window.addEventListener ("load", doStuff, false); 
    } 

    function doStuff() { 

     var elements = window.document.getElementsByTagName('A'); 

     if (! elements || already_run) { 
      return false; 
     } else { 
      already_run = true; 
     } 

     GM_log ("here"); 

     for (elem = 0; elem < elements.length; elem++) { 
      if (elements[elem].href.match (QUESTION_URL)) { 
       curr_q = RegExp.$1; 

       // Already seen? 
       if ((seen_q.length < curr_q) || (seen_q [curr_q] != SEEN_MARK)) { 
        elements[elem].style.backgroundColor = UNSEEN_BACK_COLOR; 
        seen_q [curr_q] = SEEN_MARK; 
       } 

       // Is a favorite tag? 
       node = elements[elem].parentNode.parentNode; 
       for (tag = 0; tag <= fav_tags.length; tag++) { 
        if (node.innerHTML.match ("'" + fav_tags[tag] + "'")) { 
         node.style.backgroundColor = FAV_TAG_BACK_COLOR; 
         break; 
        } 
       } 

       // return (0); 
      } 
     } 

     seen_q_str = seen_q.join("|"); 
     GM_setValue ("seen_q", seen_q_str); 

     return true; 
    } 


    function askTags() { 
     fav_tags_str = prompt("Favorite tags (separated by spaces)", fav_tags_str); 
     GM_setValue ("fav_tags", fav_tags_str) 
    } 

})(); 
Cuestiones relacionadas