Сценарий greasemonkey пытается получить доступ к элементу, прежде чем он существует, и получает значение null - PullRequest
0 голосов
/ 16 января 2011

У меня есть небольшой скрипт, запущенный на "google.com/*" с помощью Greasemonkey
в основном мой скрипт добавляет несколько пунктов меню в меню Google (где вы можете найти изображения видео карты новости покупки и т. д.);

это меню внутри qbar div, поэтому оно выглядит так:

<div id="gbar"> ...menu code ... </div>

следующая строка в моем скрипте работает нормально, если вы переходите на веб-страницу Google (www.google.com):

var gbar = var gbar = document.getElementById("gbar");
if (qbar != null) alert("qbar exist!");
else alert("qbar is null");

этот код предупреждает о существовании qbar, и это хорошо.

Теперь, если я найду любое слово в Google, например, поиск по запросу "безумец" приведет вас на эту страницу:

http://www.google.com/#sclient=psy&hl=en&q=madman&aq=f&aqi=g5&aql=&oq=&pbx=1&fp=fd0f73886609171d

теперь скрипт все еще работает, только теперь он предупреждает "gbar is null"

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

1 Ответ

4 голосов
/ 16 января 2011

Вы можете настроить событие мутации DOM . В основном, вот шаги:

  • Выполните начальный поиск document.getElementById('gbar') и обработайте его, если он найден.

  • Настройка обработчика событий DOMNodeInserted для документа.

    • Если вставленный элемент имеет id="gbar", то вы знаете, что gbar вставлен.
    • Если нет, найдите во вставленном элементе элемент с id="gbar" и обработайте его, если он найден.

Вы можете увидеть рабочий пример код. При добавлении gbar к документу добавляется 5 восклицательных знаков.

...