Расширения Chrome: подключите «Content Script» с внедренным DOM - PullRequest
0 голосов
/ 07 ноября 2011

Я понял, что мы можем работать с общим DOM ( в соответствии с руководством ) из скриптов контента.

Мы можем связать внедренный контент DOM с нашими скриптами контента через

element.addEventListener('click',function(){ ourController.fnCallback(); });
// or
element.onclick = ourController.fnCallback;

Но при инъекции DOM реализует что-то вроде этого:

<a href="javascript:ourController.fnCallback();">Click Me!</a>

выдается ошибка cannot call fnCallback() on undefined ourController (не совсем переписанные сообщения об ошибках)

Есть ли какой-нибудь способ, которым мы можем общаться с нашим объектом javascript из введенного dom, как я пытался во втором примере?

Объект определен в content_script.js следующим образом:

var ourController = {
    fnCallback: function(){
        // code here
    }
};

и этот код помещается непосредственно в скрипт, загруженный в соответствии с манифестом, подобным этому:

"content_scripts": [ {
  "js": [ "content_script.js" ],
  "matches": [ "http://*/*", "https://*/*", "ftp://*/*" ],
  "run_at": "document_start"
}],

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Решение этой проблемы вытекает из документации:

Среда исполнения

Сценарии содержимого выполняются в специальной среде, называемой изолированным миром. Они имеют доступ к DOM страницы, в которую они внедрены, но не к каким-либо переменным или функциям JavaScript, созданным этой страницей. Каждый скрипт содержимого выглядит так, как будто на странице, на которой он запущен, нет другого JavaScript-кода. То же самое верно и в обратном: JavaScript, работающий на странице, не может вызывать какие-либо функции или обращаться к любым переменным, определенным скриптами содержимого.

Таким образом, любой внедренный контент не может работать со скриптом контента. Единственное решение - использовать такой код , не используя скрипты содержимого

document.getElementById("elmID").addEventListener('click',function(){
        var data = //get the data from DOM or window state, not from content script
        chrome.extension.sendRequest({
            'request_data': data
        });
    })

Будет добавлена ​​функция события клика, которая может взаимодействовать с content_script

1 голос
/ 07 ноября 2011

Похоже, вы не определили ourController или fnCallback в одном и том же скрипте содержимого.

Было бы полезно, если бы вы опубликовали весь сценарий. Где существует функция, пространство имен?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...