Как получить доступ к переменной, прикрепленной к веб-странице, с помощью сценария содержимого в сценарии содержимого с помощью построителя надстроек

Я создал надстройку с помощью конструктора надстроек. Я прикрепил контент-скрипт к pageMod в main.js

Мой сценарий контента подсчитывает количество динамических тегов, созданных с помощью document.createElement(). Это делается путем создания хука для document.createElement() и добавления этой функции на веб-страницу путем создания тега скрипта. Мой код выглядит следующим образом.

файл сценария содержимого:

addJS_Node ("var count=0;");
function LogDocCreateElement ()
{
    var oldDocumentCreateElement = document.createElement;   
    document.createElement = function(tagName)
    {
       var elem = oldDocumentCreateElement.apply (document, arguments);     
       console.log("Dynamically created a(n)", tagName);
       count++;     
       return elem;
    } 
}
addJS_Node (null, null, LogDocCreateElement);
function addJS_Node (text, s_URL, funcToRun) {
     var D                                   = document;
     var scriptNode                          = D.createElement ('script');
     scriptNode.type                         = "text/javascript";
     if (text)       scriptNode.textContent  = text;
     if (s_URL)      scriptNode.src          = s_URL;
     if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';
     var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
     targ.appendChild (scriptNode);    
}
window.addEventListener("load", function() {alert(count) }, false);

Теперь я получаю неперехваченное исключение: ReferenceError: count is not defined.

Как я могу получить доступ к этой переменной count?


person user1335906    schedule 03.05.2012    source источник


Ответы (1)


См. документацию о том, как скрипты содержимого получают доступ к веб-страницам — они не видят никаких пользовательских свойств и методов, добавленных веб-страницей в модель DOM. В вашем случае вам нужно будет получить доступ к переменной count через объект unsafeWindow:

unsafeWindow.count++;

Однако, как отмечается в документации, вам следует избегать использования unsafeWindow, если это возможно. Здесь очевидным направлением действий было бы вообще избегать создания переменной count на странице. Итак, вместо этого:

addJS_Node ("var count=0;");

Вы бы просто объявили переменную:

var count = 0;

Но вам нужно будет заменить unsafeWindow.document.createElement, а не document.createElement, чтобы это изменение было видно на веб-странице. Избежать unsafeWindow здесь будет намного сложнее, может быть, вместо этого вы можете использовать события мутации?

person Wladimir Palant    schedule 03.05.2012
comment
Но предупреждение будет отображать 0, если я объявлю var count=0 - person user1335906; 03.05.2012
comment
@ user1335906: Правильно — ваша функция document.createElement никогда не вызывается, потому что веб-страница ее не видит. Смотрите последний абзац моего ответа. - person Wladimir Palant; 03.05.2012
comment
где я должен изменить document.createElement в LogDocCreateElement () или addJSNOde() извините, я вас не понял - person user1335906; 03.05.2012
comment
не могли бы вы указать, где я должен изменить - person user1335906; 03.05.2012
comment
Я включил unsafeWindow.count++; в свой код, но получаю сообщение об ошибке «unsafeWindow не определено». Как я могу решить это - person user1335906; 04.05.2012
comment
Я только что проверил, unsafeWindow определенно определен как глобальная переменная в сценариях содержимого. - person Wladimir Palant; 04.05.2012
comment
я должен определить переменную с unsafeWindow я имею в виду unsafeWindow.count=0 - person user1335906; 04.05.2012