2016-05-27 4 views
0

Я вводили два .js файлы (Давайте скажем, например, a.js и b.js) в веб-страницы, используя скрипт контента, используя технику, упомянутые здесь:Chrome Расширение Вызов функции из Введенный Script

Access window variable from Content Script

function injectScript(file, node) { 
    var th = document.getElementsByTagName(node)[0]; 
    var s = document.createElement('script'); 
    s.setAttribute('type', 'text/javascript'); 
    s.setAttribute('src', file); 
    th.appendChild(s); 
} 
injectScript(chrome.extension.getURL('/js/my_file.js'), 'body'); 

Оба экземпляра скрипта успешны. Теперь 'a.js' имеет функцию FuncA() {}. Теперь, когда я пытаюсь вызвать FuncA() из b.js, я получаю следующую ошибку.

b.js:6 Uncaught ReferenceError: FuncA is not defined 
+0

Если вы проверили, что скрипты введены правильно, они должны работать. Вероятно, ошибка вызвана некоторой проблемой в 'a.js'. Не могли бы вы разместить его контент? –

+0

Вы правы. См. Ответ. –

ответ

3

правильный способ обработки это полагаться на обратные вызовы, а не произвольные TimeOuts.

function injectScript(file, node, callback) { 
    var th = document.getElementsByTagName(node)[0]; 
    var s = document.createElement('script'); 
    s.setAttribute('type', 'text/javascript'); 
    s.setAttribute('src', file); 
    if (typeof callback == "function") { 
     s.onload = function() { callback(); }; 
    } 
    th.appendChild(s); 
} 

injectScript(chrome.extension.getURL('/js/a.js'), 'body', function() { 
    injectScript(chrome.extension.getURL('/js/b.js'), 'body'); 
}); 

с произвольно выбранным 500мсом оттянуть вы рискуете либо ждать слишком долго, или не хватает ждать в каком-то крайнем случае. Опираясь на событие onload для тега скрипта, вы точно знаете, когда он закончил выполнение.

0

Проблема решена. Первый скрипт, который я вводил, был очень большой. Так что каким-то образом инъекция не завершалась, и я называл эту функцию. Поэтому я добавил некоторую задержку.

injectScript(chrome.extension.getURL('/js/a.js'), 'body'); 
setTimeout(function(){ 
    injectScript(chrome.extension.getURL('/js/b.js'), 'body'); 
}, 500); 
Смежные вопросы