Регистрация DOMContentLoaded в Google Chrome - PullRequest
10 голосов
/ 22 февраля 2011

В Firefox и Safari мне удалось зарегистрировать событие DOMContentLoaded с помощью window.addEventListener ('DOMContentLoaded', PageShowHandler, false); , вставив этот оператор в сценарий js, который вставляется, или, более четко, выполняются после загрузки dom страницы, мои конкретные функции удается запускать каждый раз при загрузке DOM этой конкретной страницы.

Кажется, я не могу сделать это в Chrome. Я сделал некоторый трюк с событиями chrome.tabs.onUpdated и др., Но он работает не во всех случаях; все эти события не суммируют с тем, чего достигает DOMContentLoaded. Например, когда я нажимаю на определенные ссылки на моей веб-странице, это не внедряет мой код, как могло бы произойти мое событие DOMContentLoaded.

window.addEventListener('DOMContentLoaded', PageShowHandler, false);

введено в inject.js , похоже, не регистрирует событие.

Это манифест:

{
"name" : "gMail Adder ",
"version" : "1.0",
"description" : "Google Chrome Gmail Adder",
"options_page": "options.html",
"background_page": "background.html",
"run_at": "document_start",
"permissions": [
   "tabs",
   "history",
   "http://*/*",
   "https://*/*"
],
"content_scripts": [
  {
   "matches": ["*://*.google.mail.com/*", "https://*.google.mail.com/*"     ,"http://mail.google.com/*" ,"https://mail.google.com/*", "https://www.google.com/*", "http://www.google.com/*", "file:///*"],
   "css": ["toggle.css"],
   "js": ["jquery-1.4.4.min.js", "inject.js"]
  }
],
"browser_action" : {
"default_icon" : "Quest Icon 11.png",
"default_popup": "popup.html"
}
}

Ответы [ 2 ]

23 голосов
/ 22 февраля 2011

Если вы добавите флаг "run_at":"document_start" в сценарии содержимого в манифесте, они будут внедрены до создания DOM, поэтому DOMContentLoaded должен запускаться каждый раз:

"content_scripts": [
  {
   "matches": ["*://*.google.mail.com/*", "https://*.google.mail.com/*"     ,"http://mail.google.com/*" ,"https://mail.google.com/*", "https://www.google.com/*", "http://www.google.com/*", "file:///*"],
   "css": ["toggle.css"],
   "js": ["jquery-1.4.4.min.js", "inject.js"],
   "run_at": "document_start"
  }
],

(подробнее о порядке выполнения *)1006 * здесь )

1 голос
/ 23 февраля 2011

Мне удалось заставить все работать, используя событие DOMFocusIn в моем внедренном скрипте.Это событие правильно имитирует поведение триггера, которого DOMContentLoaded достигает в Firefox и Safari.

window.addEventListener('DOMFocusIn', PageShowHandler, false);

Это не будет работать должным образом, если я не установлю true поле "all_frames" в "contents_scripts" :

{
"name" : "gMail Adder ",
"version" : "1.0",
"description" : "Google Chrome Gmail Adder",
"options_page": "options.html",
"background_page": "background.html",
"run_at": "document_start",
"permissions": [
   "tabs",
   "history",
   "http://*/*",
   "https://*/*"
],
"content_scripts": [
  {
   "matches": ["*://*.google.mail.com/*", "https://*.google.mail.com/*" ,"http://mail.google.com/*" ,"https://mail.google.com/*", "https://www.google.com/*", "http://www.google.com/*", "file:///*"],
   "css": ["toggle.css"],
   "js": ["jquery-1.4.4.min.js", "inject.js"],
   "all_frames" : true
  }
],
"browser_action" : {
"default_icon" : "Quest Icon 11.png",
"default_popup": "dialog.html"
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...