我正在使用jQuery为现有页面构建模块。该页面也使用原型,因此存在通常的jQuery原型冲突。我正在使用jQuery.noConflict(),除了ie(在ie8中测试)之外,所有浏览器中的一切都正常。 我已经在这里和其他网站上阅读了所有类似的问题,但我无法让它工作。 这是关于它是如何工作的:页面使用原型(effects.js,prototip.js等)加载原型和其他.js文件,然后加载我的模块(也就是jQuery在原型之后加载)。 我读到了将原型的$()函数更改为$$$(),但这是不可能的(然后需要更改许多其他使用原型的模块),所以它只是关于更改我的js。
然后我读到了关于使用
的内容(function($) {
//my jQuery code in here
})(jQuery);
但我不完全理解它。我的代码是这样的:
$J = jQuery.noConflict();
$J(document).ready(function(){
fun1();
//jquery stuff
fun2();
});
function fun1(){
//stuff/jQuery code/ call other functions
}
function fun2(){
//stuff/jQuery code/ call other functions
}
如果我将上述全部内容放入(function($) { /*all the above*/})(jQuery);
我知道所有功能都是未定义的。
我做错了什么?还是有另一种解决方案吗?
答案 0 :(得分:1)
要使jQuery.noConflict();
工作,必须在加载所有其他JavaScript库之前调用它,否则您将覆盖$
变量。你使用(function($) { /*all the above*/})(jQuery);
得到的错误是因为这是定义一个匿名函数,其中的任何函数只存在于其中并且不能在它之外使用,除非它是匿名函数范围之外的对象的一部分
所以你需要像这样使用它。
//Must be called before any other library in included on the page.
$J = jQuery.noConflict();
(function($){
$(document).ready(function(){
fun1();
//jquery stuff
fun2();
});
})(jQuery);
function fun1(){
//stuff/jQuery code/ call other functions
}
function fun2(){
//stuff/jQuery code/ call other functions
}
答案 1 :(得分:0)
我能够解决这个问题的唯一方法,IE8(这是唯一一个有问题)和其他浏览器的方法是将jQuery和noConflict()调用放在头部后立即初始化其他库。像这样:
<script type="text/javascript" src="/path/to/prototype.js"></script>
<script type="text/javascript" src="/path/to/jquery.js"></script>
<script type="text/javascript">var $j = jQuery.noConflict(); </script>
...其次是使用jQuery或Prototype的任何其他脚本。