从内容脚本调用外部函数

时间:2014-08-24 13:21:24

标签: google-chrome google-chrome-extension

假设我在域boo的外部JavaScript文件中有http://localhost/file.js个函数:

file.js:

function boo() {
  return 1;
}

如何从chrome扩展程序中的内容脚本调用boo函数?

2 个答案:

答案 0 :(得分:2)

您需要运行一个内容脚本,该脚本创建并注入一个调用页面<script>函数的boo()元素。

您的内容脚本应该包含以下内容:

function runBoo() {
    var myBoo = document.createElement('script');
    myBoo.id = 'myBoo';  //helpful for removing the element later, not required to work
    myBoo.innerText = 'boo();'
    document.body.appendChild(myBoo); //if you plan on calling boo() multiple times, don't forget to delete the previously added myBoo elements
}

window.onload = function() {
//call runBoo() from content whenever you want to run the page's boo() function
   runBoo();
}

答案 1 :(得分:1)

根据Mozilla的这个doc

  

内容脚本可以访问页面的DOM,当然,就像任何一样   页面已加载的脚本(页面脚本)。但内容脚本   与页面脚本隔离:

  • 内容脚本没有看到任何添加到页面的JavaScript对象 页面脚本
  • 如果页面脚本重新定义了某些DOM对象的行为,那么 内容脚本可以看到原始行为。

<强>理由:

  1. 这意味着内容脚本不会将对象泄露给网页, 可能会打开安全漏洞。

  2. 这意味着内容脚本可以创建对象而不必担心 关于它们是否可能与页面脚本添加的对象冲突。

  3. <强>更新

    @Xan是对的!谢谢Xan。 如果您需要与其他页面脚本添加的功能进行交互,则加载项的内容脚本与页面脚本之间的消息传递如下:

    // main.js
    
    var tabs = require("sdk/tabs");
    var mod = require("sdk/page-mod");
    var self = require("sdk/self");
    
    var pageUrl = self.data.url("page.html")
    
    var pageMod = mod.PageMod({
      include: pageUrl,
      contentScript: "console.log(unsafeWindow.foo);"
    })
    
    tabs.open(pageUrl);
    

    其中foo是页面脚本添加的变量。