javascript - 在 "isolated world"(chrome) 中运行 javascript

标签 javascript google-chrome google-chrome-extension polymer

我开发的 chrome 扩展通过 HTML 导入将 Polymer 和其他 Web 组件注入(inject)到主机页面,而不是使用内容脚本的典型方法 - 它会在 isolated world 中自动运行。 .

这背后的原因与两件事有关:

  1. Chrome 扩展无法注册来自 content scripts 的自定义元素
  2. chrome 扩展 list 不支持在隔离环境中运行的 HTML 导入,仅支持 javascript

由于这些限制,我不得不求助于将我的组件加载到主机页面的 <head> 中作为described here .

我面临的明显问题是我的 javascript 与主机页面的 javascript [在某些站点上] 发生冲突,因为我用来注入(inject)依赖项的方法无法在“孤立的世界”中运行。

到目前为止,我已经通过 gulp 任务重命名 Polymer 和我的组件来避免冲突来解决大部分问题,但不幸的是,它并不完美,需要更强大的方法。

最后是我的问题:是否可以为我的 javascript 创建一个“孤立的世界”?也许另一个文档对象?如果没有,我是否可以采用任何策略来确保我的代码独立运行?

更新:

你们中的一些人建议使用 IIFE,这是我迄今为止一直在使用的。我正在寻找一个孤立世界的答案,类似于谷歌浏览器在其下运行扩展程序的方式。这主要是因为 Polymer 必须附加到全局 window 对象上。

最佳答案

您可以使用 a closure 来限定变量(包括函数,因为它们是 javascript 中的一流对象) .

因此,如果您使用 IIFE 注入(inject)以下代码 - 立即调用函数表达式 -

var someVar = 'this one "conflicts" with page js';
(function(){
    var someVar = 'this one does not "conflict" with page js'; //shadows someVar above
    console.log(someVar);
})();
console.log(someVar);

您会看到访问 someVar 会返回不同的值。

作为注入(inject)代码的一部分,您可以像 Polymer 一样隐藏“冲突”变量。

使用 CommonJS require() 之类的东西在 IIFE 中导入所需的版本,并继续从父范围访问任何其他内容。

关于javascript - 在 "isolated world"(chrome) 中运行 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36137194/

相关文章:

javascript - 使用 location.href ="#_ElementId_"时如何忽略 base href?

javascript - 如何使用 jquery 删除和编辑 JSON 数组中的值

android - 谷歌浏览器(手机)在下载文件时进入无限循环打开新标签

javascript - 处理 Chrome 应用程序窗口外部的点击

javascript - 为什么 ToSimplifyText 保持不变?

css - 让 ◼ 在 Windows 7 上运行的 Google Chrome 网络浏览器上正确显示的最简单方法是什么?

javascript - Chrome 的日期/时间格式问题

html - Chrome 扩展 HTML 文件系统访问

javascript - Chrome 扩展程序 : AJAX returns php as comment line

javascript - 在 Node.js 中替换 $.ajax()