jquery原型仅在ie8中发生冲突

时间:2011-01-31 14:51:41

标签: jquery internet-explorer internet-explorer-8 prototypejs conflict

我正在使用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);

我知道所有功能都是未定义的。

我做错了什么?还是有另一种解决方案吗?

2 个答案:

答案 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的任何其他脚本。