2008-09-16 3 views
19

Я пытаюсь изменить свой сценарий GreaseMonkey при запуске window.onload в window.DOMContentLoaded, но это событие никогда не срабатывает.Как реализовать событие «DOM Ready» в сценарии GreaseMonkey?

Я использую FireFox 2.0.0.16/Greasemonkey 0.8.20080609

This это полный сценарий, который я пытаюсь изменить, изменяя:

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

в

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

ответ

24

Итак, я googled greasemonkey dom ready и first result, казалось, сказал, что сценарий greasemonkey на самом деле работает на «DOM ready», поэтому вам просто нужно удалить вызов onload и запустить скрипт сразу.

Я удалил window.addEventListener ("load", function() { и }, false); обертку, и она работала отлично. Это much более отзывчивый таким образом, страница появляется сразу с вашим сценарием, примененным к ней, и все невидимые вопросы выделены, а не мерцание вообще. И было много радости ... да.

10

Сценарии GreaseMonkey сами выполняются на DOMContentLoaded, поэтому нет необходимости добавлять обработчик событий загрузки - просто попросите свой скрипт сделать все, что ему нужно, чтобы немедленно.

http://wiki.greasespot.net/DOMContentLoaded

+0

Использования Firefox 3.6 предварительной версии, я пытался написать простой скрипт пользователя, чтобы окрасить горизонтально ориентированные объявления в поиске Google, как Раньше они были (я на самом деле нажал ссылку, чтобы отвезти меня на страницу, спонсируемую газовой отраслью при поиске «gasland»), и это не сработало. Затем я попробовал верхний ответ: addEventListener для события «load», и он сработал. – 2011-02-02 02:46:36

1

@ Сэм: Да, я пытался то же самое:

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

})();