2008-09-16 4 views
19

Ich versuche, mein GreaseMonkey-Skript von fire auf window.onload in window.DOMContentLoaded zu ändern, aber dieses Ereignis wird nie ausgelöst.Wie implementiert man das "DOM Ready" -Ereignis in einem GreaseMonkey-Skript?

ich FireFox 2.0.0.16/Greasemonkey 0.8.20080609

This ist das vollständige Skript bin mit, die ich zu ändern bin versucht, zu ändern:

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

zu

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

Antwort

24

Also googelte ich greasemonkey dom ready und die first result schien zu sagen, dass das Greasemonkey-Skript tatsächlich bei "DOM ready" läuft, so dass Sie nur entfernen müssen der Onload-Aufruf und führen Sie das Skript sofort aus.

Ich entfernte die window.addEventListener ("load", function() { und }, false); Verpackung und es funktionierte perfekt. Es ist viel so reaktionsschneller, die Seite erscheint sofort mit Ihrem Skript angewendet und alle ungesehenen Fragen markiert, kein Flimmern überhaupt. Und es gab viel Freude .... ja.

10

GreaseMonkey-Skripte werden selbst auf DOMContentLoaded ausgeführt, es ist also nicht notwendig, einen Load-Event-Handler hinzuzufügen - lassen Sie Ihr Skript einfach alles tun, was es benötigt.

http://wiki.greasespot.net/DOMContentLoaded

+0

Mit Firefox 3.6 Pre-Release, ich hatte versucht, einen einfachen Benutzer Skript zu schreiben, wie die horizontal ausgerichteten Anzeigen in der Google-Suche zu färben Das war früher (ich klickte tatsächlich auf einen Link, um mich auf eine von der Gasindustrie gesponserte Seite zu bringen, wenn ich nach "Gasland" suchte) und es hat nicht funktioniert. Ich versuchte dann die oberste Antwort: addEventListener für "load" Ereignis, und es hat funktioniert. –

1

@ Sam: Ja, ich habe versucht, das gleiche:

// ==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) 
    } 

})(); 
Verwandte Themen