我已经开始开发浏览器扩展程序了。我注意到一个常见的概念是扩展可以将JS代码注入当前的浏览器选项卡。
我对这不会导致问题的定期感到有些困惑。
我的意思是,如果我在已经包含JQuery版本y的页面中注入JQuery的x版本(通过我的浏览器扩展),那么事情仍然可以工作? $()
函数不会发生冲突吗?
事情顺利进行怎么可能?是否有开发人员应采用的特定技术来确保不会发生此类冲突,或浏览器是否会处理所有事情?
答案 0 :(得分:4)
尽管noConflict()
大部分时间都可以用于jQuery,但对于扩展仍然是一个坏主意,并不适用于大多数其他库或实用程序。
聪明的做法是,根本不要注入代码(有一个例外 1 )。扩展可以包含您需要的任何库,这样做有很多好处:
不可能与网页的javascript冲突。
页面的JS没有任何依赖性,如果更改,恕不另行通知,您的扩展程序将更少破坏。
注入库时,必须从某个外部服务器获取它。这会降低您的扩展速度,并使其容易受到控制之外的崩溃。
当您使用扩展程序包含库时,它是:(a)始终存在,(b)始终是已知良好的版本,(c)几乎立即从本地计算机加载,而不是远程服务器。< / p>
即使页面的javascript已停用,您的扩展程序也可以投放。
您的扩展程序可以同时利用库和扩展API。
通过扩展可以很容易地合并一个像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和其他浏览器的机制类似。
1 一个例外吗?对于扩展,当且仅当满足所有这些条件时才注入代码:
答案 1 :(得分:2)
此问题的常见解决方案是使用jQuery.noConflict()将jQuery别名为另一个变量,确保它不与页面的$
冲突。
答案 2 :(得分:0)
jQuery有一个noConflict()
函数,可用于使用$
命名空间(例如jQuery的不同实例)将jQuery与其他任何东西隔离开来。
避免前向名称空间污染的一种更通用的方法是考虑在闭包内执行JavaScript。
(function () {
// Your Code Here
})();
这将阻止闭包范围内的任何内容在您自己的代码之外可用。