jQuery 无冲突模式

在本教程中,你将学习如何避免 jQuery 与其他 JavaScript 库或框架之间的冲突。

将 jQuery 与其他 JavaScript 库一起使用

如你所知,jQuery 使用美元符号($)作为快捷方式或别名 jQuery 。因此,如果你使用另一个也使用 $ 符号作为快捷方式的 JavaScript 库,以及同一页面上的 jQuery 库,则可能会发生冲突。幸运的是,jQuery 提供了一个特殊的 noConflict() 方法来处理这种情况。

jQuery noConflict() 方法

jQuery.noConflict() 方法将 $ 标识符的控制权返回给其他库。以下示例中的 jQuery 代码(第 10 行)将在 jQuery 加载到页面后立即将其置于无冲突模式,并分配新的变量名称 $j 以替换 $ 别名,以避免与原型框架冲突。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>jQuery noConflict() Demo</title>
<script src="js/prototype.js"></script>
<script src="js/jquery.js"></script>
<script type="text/javascript">
// Defining the new alias for jQuery
var $j = jQuery.noConflict();
$j(document).ready(function(){
    // Display an alert message when the element with ID foo is clicked
    $j("#foo").click(function(){
        alert("jQuery is working well with prototype.");
    });
});
 
// Some prototype framework code
document.observe("dom:loaded", function(){
    // Display an alert message when the element with ID bar is clicked
    $(bar).observe('click', function(event){
        alert("Prototype is working well with jQuery.");
    });
});
</script>
</head>
<body>
    <button type="button" id="foo">Run jQuery Code</button>
    <button type="button" id="bar">Run Prototype Code</button>
</body> 
</html>

注意: 许多 JavaScript 库在函数或变量名使用 $ ,就像 jQuery 一样。比如, mootoolsprototypezepto 等。

但是,如果你不想为 jQuery 定义另一个快捷方式,可能是因为你不想修改现有的 jQuery 代码或者你真的想使用 $ 它因为它节省了时间并且易于使用,那么你可以采用另一种快速方式方法 - 只需将 $ 作为参数传递给你的 jQuery(document).ready() 函数,如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>jQuery noConflict() Demo</title>
<script src="js/prototype.js"></script>
<script src="js/jquery.js"></script>
<script type="text/javascript">
jQuery.noConflict();
jQuery(document).ready(function($){
    // The dollar sign in here work as an alias to jQuery
    $("#foo").click(function(){
        alert("jQuery is working well with prototype.");
    });
});
 
// Some prototype framework code
document.observe("dom:loaded", function(){
    // The dollar sign in the global scope refer to prototype
    $(bar).observe('click', function(event){
        alert("Prototype is working well with jQuery.");
    });
});
</script>
</head>
<body>
    <button type="button" id="foo">Run jQuery Code</button>
    <button type="button" id="bar">Run Prototype Code</button>
</body> 
</html>

包括其他库之前的 jQuery

避免冲突的上述解决方案依赖于在加载 prototype.js 之后加载 jQuery。但是,如果在其他库之前包含 jQuery,则可以在 jQuery 代码中使用全名 jQuery ,以避免冲突,而不用调用 jQuery.noConflict()。但在这种情况下, $ 将具有在其他库中定义的含义。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>jQuery noConflict() Demo</title>
<script src="js/jquery.js"></script>
<script src="js/prototype.js"></script>
<script type="text/javascript">
jQuery(document).ready(function($){
    // Use full jQuery function name to reference jQuery
    jQuery("#foo").click(function(){
        alert("jQuery is working well with prototype.");
    });
});
 
// Some prototype framework code
document.observe("dom:loaded", function(){
    // The dollar sign here will have the meaning defined in prototype
    $(bar).observe('click', function(event){
        alert("Prototype is working well with jQuery.");
    });
});
</script>
</head>
<body>
    <button type="button" id="foo">Run jQuery Code</button>
    <button type="button" id="bar">Run Prototype Code</button>
</body> 
</html>