浏览器扩展:如何将javascript代码注入页面而不发生冲突?
我已经开始开发浏览器扩展。我注意到一个常见的概念是,扩展可以将JS代码注入当前的浏览器选项卡 我有点困惑,为什么这不会经常引起问题 我的意思是,如果我(通过我的浏览器扩展)在一个已经包含JQuery版本y的页面中插入了JQuery版本x,那么事情怎么还能继续工作呢?浏览器扩展:如何将javascript代码注入页面而不发生冲突?,javascript,browser-extension,content-script,javascript-injection,Javascript,Browser Extension,Content Script,Javascript Injection,我已经开始开发浏览器扩展。我注意到一个常见的概念是,扩展可以将JS代码注入当前的浏览器选项卡 我有点困惑,为什么这不会经常引起问题 我的意思是,如果我(通过我的浏览器扩展)在一个已经包含JQuery版本y的页面中插入了JQuery版本x,那么事情怎么还能继续工作呢?$()函数不会有冲突吗 事情怎么可能进展得那么顺利?开发人员是否应该使用任何特定的技术来确保不会发生此类冲突,或者浏览器会处理所有问题?解决此问题的常见方法是使用jQuery.noConflict()将jQuery别名为其他变量,确保
$()
函数不会有冲突吗
事情怎么可能进展得那么顺利?开发人员是否应该使用任何特定的技术来确保不会发生此类冲突,或者浏览器会处理所有问题?解决此问题的常见方法是使用jQuery.noConflict()将jQuery别名为其他变量,确保它不与页面的
$
jQuery有一个noConflict()
函数,可以使用$
名称空间(例如jQuery的另一个实例)将jQuery与其他任何东西隔离开来
<> P>一种更为普遍的避免前缀命名空间污染的方法是考虑在闭包中执行JavaScript。
(function () {
// Your Code Here
})();
这将阻止闭包范围内的任何内容在您自己的代码之外可用。虽然对于jQuery来说,noConflict()
可能在大部分时间都有效,但对于扩展来说,这仍然是一个坏主意,并且不适用于大多数其他库或实用程序
聪明的做法是根本不注入代码(只有一个例外1)。扩展可以包括您需要的任何库,这样做有很多好处:
合并一个库,比如jQuery,通过扩展很容易。例如,对于Chrome:
manifest.json
文件中
包含jQuery的简单清单可以是:
{
"content_scripts": [ {
"exclude_globs": [ ],
"include_globs": [ "*" ],
"js": [ "jquery.min.js", "myJS.js" ],
"matches": [ "http://stackoverflow.com/*"
]
} ],
"description": "Hello world with jQuery",
"name": "Hello world with jQuery",
"version": "1"
}
该机制与Firefox和其他浏览器类似
唯一的例外是什么?对于扩展,当且仅当满足以下所有条件时才注入代码:
许多注入使用的另一个良好实践是在注入之前检查jQuery是否已经存在。如果做不到这一点,是的,没有冲突可以工作。(每当我必须做这类事情时,我通常使用
$$
,但是如果你想超级安全,你可能想使用YourPlugin$
。这听起来可能很痛苦,但是如果你使用模块模式(你可能无论如何都应该使用它)每个文件只需键入一次。我认为内容\脚本总是被注入的-看看Chrome文档:,在第一段“清单”中。尽管该页面误用了术语“注入”,但它们并不意味着“注入”与其他任何人使用该术语的方式相同(在目标页面范围内运行的代码)事实上,Chrome文档描述了其他地方的实际行为,包括在同一页的后面。请参阅……“注入”的常见和正确用法是当您的脚本或扩展创建
节点(或unsafeWindow
的某些用法)时。您是对的-在该段中,他们甚至说“例如,一个内容脚本可以包含JQuery v1,而页面可以包含JQuery v2,它们不会相互冲突。”-这正是我想要的。谢谢。基本上,我被他们使用“注入”这个词的方式弄糊涂了。是的,该页面的使用令人困惑且不标准。这只是用于Chrome吗?