Сценарий содержимого расширения Chrome не обращается к DOM страницы, в которую он вводится

Я пытаюсь извлечь данные со страницы, которую просматривает пользователь, и отправить эти данные во всплывающее окно расширения. У меня возникли проблемы с извлечением информации с текущей страницы. Изучив руководства по коду Google, я настроил свой манифест и сценарий содержимого, как показано ниже. Когда я перехожу на тестовую страницу, которая имеет диапазон с id="comments", моя переменная из внедренного скрипта содержимого всегда заканчивается нулевым значением. Кто-нибудь знает, что я мог упустить? Спасибо!

manifest.json
=================
{
    "name": "Sample Extension",
    "version": "0.0.1",
    "description": "Sample extension",
    "icons": {"128": "icon.png"},
    "permissions": [
        "tabs", "<all_urls>"
    ],
    "browser_action": {
        "default_icon": "browseraction.png",
        "default_title": "Sample",
        "popup": "popup.html"
    },
    "content_scripts": [
        {
            "matches": ["http://*/*", "<all_urls>" ],
            "js": ["scripts/contentscript.js"]
        }
    ]
}

contentscript.js
===================
var comments = document.getElementById("comments");
alert( comments.innerText );

person sojo2600    schedule 14.06.2012    source источник


Ответы (1)


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

Попробуйте установить это в манифесте:

        "run_at" : "document_end",

Или, если вы подозреваете загрузку AJAX, вызовите свой код позже с помощью setTimeout.

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

person Denys Séguret    schedule 14.06.2012
comment
Спасибо ребята! Я использовал оба предложения, используя run_at и textContent, и они отлично сработали. - person sojo2600; 15.06.2012
comment
innerText рекомендуется в руководстве разработчика расширений Chrome. – Не нужно избегать этого здесь. - person Robert Siemer; 19.04.2013
comment
@Xan Говоря о innerText, теперь он поддерживается в Chrome, поэтому я сократил свой ответ. - person Denys Séguret; 05.06.2015