Понимание того, как Greasemonkey запускает пользовательские скрипты - PullRequest
13 голосов
/ 07 января 2012

Я изучаю Greasemonkey в надежде внести некоторые улучшения в веб-страницу.

Я думаю, что хорошо разбираюсь в JavaScript, но не понимаю, в какой момент при визуализации документапользовательский скрипт Greasemonkey выполняется.

Например, что если внутри документа есть встроенный JavaScript, который вставляет некоторые элементы на страницу.Я хочу, чтобы мой скрипт Greasemonkey запускался только после завершения JS.

Допустим, это документ, который я пытаюсь изменить с помощью Greasemonkey

<html>
 <script>
   //insert a button with id="mybutton"
 </script>
</html>

Я хочу, чтобы код <script> завершился до запуска моего скрипта Greasemonkey, потому что я хочуизменить цвет фона.

1 Ответ

24 голосов
/ 08 января 2012

Greasemonkey по умолчанию запускается при событии DOMContentLoaded .Это означает, что все будет на странице, за исключением возможно больших изображений и материалов, добавленных некоторыми javascripts (сценариями, которые запускают событие load или это содержимое в формате AJAX).

Если вы хотите подождать, пока даже большой носитель не загрузится и не запустятся сценарии «onload», используйте:

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

function Greasemonkey_main () {

    //***** PUT YOUR GREASEMONKEY CODE HERE.
}

Не используйте unsafeWindow.onload = function(){ ... } или window.onload = function() { /* logic here */ }, как предлагали другие, Это не только плохая практика / не будет работать в GM , но unsafeWindow является ненужным риском для безопасности в этом случае.



Однако, работа сСодержимое, добавленное в JS:

Поскольку вы указали, что интересующий вас узел добавлен с помощью javascript, ожидание события load часто не работает.JS может добавлять, удалять или редактировать узлы в любое время.

Наилучший подход в подобных случаях - опросить интересующий вас элемент ("#mybutton").См. этот ответ на «Сценарий Fire Greasemonkey по запросу AJAX» .

...