Функция javascript для расширения Chrome не определена - PullRequest
0 голосов
/ 10 августа 2011

Я занимаюсь разработкой расширения для Chrome и столкнулся с проблемой, которую не могу решить; /

Я написал файл манифеста и немного кода Java-скрипта. Все работает хорошо, кроме кнопок. Когда я нажимаю на них, они должны запустить функцию эха с параметром и отправить его дальше плагину, разработанному в Firebreath. Когда я вставляю код вручную в html-файл, все работает нормально, но при вставке кода через javascript консоль chrome выдает сообщение, что функция echo не определена. Я пробовал несколько способов ввести код, но ни один из них не работает.

Поэтому я прошу помощи или некоторых хороших советов коллег-программистов. (Первый пост застенчивый )

Основной файл javascript chrome_script.js

var Reg = /(\+48\s?[0-9]{3}[\-\ ]?[0-9]{3}[\-\ ]?[0-9]{3})|(\+48\s?[\(\ ]?[0-9]{2}[\)\ ]?[0-9]{2,3}[\-\ ]?[0-9]{2}[\-\ ]?[0-9]{2})/g

var content = document.body.innerHTML;

var phoneNumbers = content.match(Reg);

document.getElementsByTagName('head')[0].innerHTML +='<script src="'+chrome.extension.getURL("plug_fun.js")+'" type="text/javascript"></script>';

content = "<object id=\"plugin0\" type=\"application/x-testplugin\" width=\"100%\" height=\"300\"></object>" + content;

for (var i = 0; i < phoneNumbers.length; i++) {
    content = content.replace(phoneNumbers[i], "<button id=\"" + i + "\" type=\"button\" onclick=\"javascript:echo(" + phoneNumbers[i].replace(new RegExp("[\+\ ]", "g"),"") + ")\">" + phoneNumbers[i] + "</button>");
}

document.body.innerHTML = content;

файл javascript plug_fun.js, для плагина и кнопок

function plugin0(){
    return document.getElementById('plugin0');
}
plugin = plugin0;  
function echo(a){
    var num = String(a);
    plugin().echo(num);
}

файл манифеста manifest.json

{
    "name": "Phone Injection",
    "version": "0.2",
    "browser_action": {
        "default_icon": "Phone.ico"
    },
    "permissions": [
            "tabs", "http://*/*", "https://*/*", "file://*"
    ],
    "plugins": [
        { "path": "npTestPlugin.dll", "public": true }
        ],
    "content_scripts": [ {
        "matches": ["http://*/*", "https://*/*", "file://*"], 
        "js": ["chrome_script.js", "plug_fun.js"]
    }]
}

Ошибка при нажатии кнопки

Uncaught ReferenceError: эхо не определено

Ответы [ 3 ]

2 голосов
/ 11 августа 2011

Сценарии содержимого в расширениях Chrome выполняются в том, что Google называет «изолированными мирами». Это означает, что различным сценариям не разрешается видеть или взаимодействовать друг с другом, и они выглядят так, как будто на странице не выполняется другой JavaScript-код. См. Ниже для получения дополнительной информации непосредственно из документации Google:

Сценарии содержимого выполняются в специальной среде, называемой изолированным миром. Они имеют доступ к DOM страницы, в которую они внедрены, но не к каким-либо переменным или функциям JavaScript, созданным этой страницей. Каждый скрипт содержимого выглядит так, как будто на странице, на которой он запущен, нет другого JavaScript-кода. То же самое верно и в обратном: JavaScript, работающий на странице, не может вызывать какие-либо функции или обращаться к любым переменным, определенным скриптами содержимого. Цитируется из: http://code.google.com/chrome/extensions/content_scripts.html#execution-environment

Я бы посоветовал попытаться поместить код, который будет взаимодействовать с плагином Firebreath, в фоновый скрипт, хотя я бы дважды проверил и убедился, что они также не работают в изолированных средах.

1 голос
/ 10 августа 2011

Попробуйте переставить манифест следующим образом;

"content_scripts": [ {
    "matches": ["http://*/*", "https://*/*", "file://*"], 
    "js": ["plug_fun.js", "chrome_script.js"]
}]

Теперь в chrome_script.js вам не нужно добавлять файл plug_fun.js вручную, так как манифест уже загрузил его для вас заранее, так что, надеюсь, вы должны найти, что echo существует. Однако я не уверен на 100%, поскольку никогда не использовал такое разделение в своих скриптах контента.

0 голосов
/ 10 августа 2011

плагины NPAPI (в том числе разработанные в FireBreath ) не всегда доступны и могут использоваться сразу после их размещения на странице. Сначала я бы попытался вставить setTimeout, чтобы отложить попытку вызова plugin (). Echo () примерно на секунду; если это не сработает, ваша проблема в другом. если он работает, то вы можете добавить тег параметра загрузки с именем функции, которая должна вызываться при запуске плагина. Обратите внимание, что NPAPI позволяет передавать только строки в теге param, поэтому он должен быть именем глобальной функции.

Смотрите пример использования параметра onload для FireBreath FBTestPlugin test.html .

...