Совместимость скрипта Greasemonkey с Firefox, Safari, Opera и Chrome (событие onload)

Допустим, вы хотите, чтобы сценарий Greasemonkey был совместим с Safari и Chrome.

В то время как в Firefox скрипты Greasemonkey запускаются только тогда, когда DOM готова. Кажется, что Chrome, Safari и Opera запускают скрипты Greasemonkey до того, как DOM будет готов.

Итак, то, что я ищу, - это решение, которое будет запускать только прослушиватель на странице, ожидая события загрузки / готовности DOM и, получив это событие, затем запускать остальную часть скрипта. Если они используют браузер Chrome, Safari или Opera. Если они используют Firefox, просто сразу запустите сценарий и не беспокойтесь о прослушивателе событий.

Как это закодировать?

@NV

Спасибо, NV, знаете ли вы, совместим ли этот скрипт с Google Chrome?

Будет ли код

(function(){

    // Code here run after 'load' event in all browsers.

})();

также работать на DOM, готовом в Google Chrome?


person Community    schedule 12.10.2009    source источник


Ответы (3)


Прежде всего, взгляните на Хорошее предупреждение UserJS. Он работает с Greasemonkey, Opera и Safari Greasekit.

Если вы хотите запустить какой-то код после загрузки страницы, прослушиватели событий вообще не нужны.

... safari + opera, похоже, запускает скрипты gm до того, как dom будет готов.

Нет. На самом деле все сложнее. В Opera есть режим совместимости с greasemokey. Все скрипты с именем yada-yada .user .js запускаются в совместимом режиме и запускаются после готовности DOM.

ПРИМЕЧАНИЕ: оберните свой код в анонимную функцию, чтобы предотвратить утечку переменной в глобальный объект окна (это происходит в Opera).

(function(){

  // Some code

})();

Safari Greasekit в этом случае работает как Firefox Greasemonkey.

person Community    schedule 15.10.2009
comment
Простое включение кода в анонимную функцию НЕ откладывает выполнение до окончания события загрузки. Таким образом, первая часть приведенного выше ответа неверна и вводит в заблуждение. - person hallvors; 06.12.2009
comment
холлворс, вы правы! Может я нечетко говорю. Я обновил ответ. - person NVI; 07.12.2009

Я взял миниатюрный jQuery и скопировал его в свой пользовательский скрипт, а затем сделал классический

  $(document).ready(function() {
      // Put all your jQuery goodness in here.
  });

Который имеет дополнительный бонус в виде предоставления jQuery, заключенного в функцию, упомянутую в другом вопросе:

(function(){

  // Some code.

})();

Вы можете использовать материал Greasemonkey для импорта jQuery через URL-адрес вверху, но это специфично для Greasemonkey, Chrome / Opera и т. Д. Не будут совместимы, если вы сделаете это таким образом.

person Tom J Nowell    schedule 05.01.2010

Я полагаю, вы могли бы посмотреть, как библиотеки JavaScript, такие как JQuery, справляются с этим. Вероятно, было бы слишком тяжело использовать его, но они, безусловно, уже решили эту проблему.

person spieden    schedule 14.10.2009