Chrome扩展程序javascript函数未定义

时间:2011-08-10 10:40:32

标签: javascript google-chrome-extension npapi

我正在开发一个chrome扩展程序并遇到一个我无法解决的问题; /

我写了清单文件和一些java脚本代码。除按钮外,一切都很好。当我点击它们时,它们应该使用参数触发echo函数并将其进一步发送到firebreath中开发的插件。当我在html文件中手动注入代码时,一切正常,但是当通过javascript chrome console注入代码时,会给我一条消息,指出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"]
    }]
}

点击按钮时遇到错误

  

未捕获的ReferenceError:未定义echo

3 个答案:

答案 0 :(得分:2)

Chrome扩展程序中的内容脚本在Google称之为“孤立世界”的内容中执行。这意味着不允许不同的脚本彼此查看或交互,并且看起来好像在页面上没有执行其他JavaScript。有关更多信息,请参阅以下内容,直接来自Google文档:

  

内容脚本在称为孤立世界的特殊环境中执行。他们可以访问注入页面的DOM,但不能访问页面创建的任何JavaScript变量或函数。它将每个内容脚本视为在其运行的页面上没有执行其他JavaScript。反过来也是如此:页面上运行的JavaScript无法调用任何函数或访问内容脚本定义的任何变量。   引自:http://code.google.com/chrome/extensions/content_scripts.html#execution-environment

我建议尝试将与firebreath插件接口的代码放在后台脚本中,尽管我会仔细检查并确保它们也不会在隔离环境中执行。

答案 1 :(得分:1)

尝试重新排列清单,如下所示;

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

现在,在chrome_script.js中,您无需手动添加plug_fun.js文件,因为清单已经提前为您加载了,所以希望您现在应该发现echo存在。但是,由于我从未在内容脚本中使用过这种分离,所以我并不是百分之百确定。

答案 2 :(得分:0)

NPAPI插件(包括FireBreath中开发的插件)在将它们放入页面后并不总是可用并立即可用。我首先尝试将setTimeout放入,以延迟尝试调用plugin()。echo()大约一秒钟;如果这不起作用,你的问题就是其他问题。如果它确实有效,那么你可以添加一个onload param标签,其中包含一个应该在插件启动时调用的函数的名称。请注意,NPAPI只允许在param标记中传递字符串,因此它必须是全局函数的名称。

有关使用onload参数的示例,请参阅FireBreath FBTestPlugin test.html