Как да получите достъп до променлива, прикачена към уеб страницата с помощта на contentscript в - contentscript с помощта на конструктор на добавки

Създадох добавка с помощта на създателя на добавки. Прикачих скрипт за съдържание към pageMod в main.js

Моят скрипт за съдържание отчита броя на динамичните тагове, създадени с помощта на document.createElement(). Това се прави чрез създаване на кука към document.createElement() и добавяне на тази функция към уеб страницата чрез създаване на таг на скрипт. Моят код е както следва.

contentscriptFile:

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
къде трябва да променя документа.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