【问题标题】:jquery prototype conflict only in ie8jquery原型冲突仅在ie8中
【发布时间】:2011-01-31 14:51:41
【问题描述】:

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

我知道所有函数都是未定义的。

我做错了什么?还是有其他解决方案?

【问题讨论】:

  • 我强烈建议尝试使用其中一种,但不要同时使用。你可以让它们不发生冲突而不会有太多麻烦,但这意味着你的用户必须加载两个不同的库。 jQuery 和 Prototype 都有插件,可以做你想做的大部分事情。

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


【解决方案1】:

要使jQuery.noConflict(); 工作,必须在加载所有其他javascript 库以工作之前调用它,否则您已经覆盖了$ 变量。 (function($) { /*all the above*/})(jQuery); 出现的错误是因为 this 定义了一个匿名函数,其中的任何函数都只存在于其中,不能在其外部使用,除非它是匿名函数范围之外的对象的一部分。

所以你需要像这样使用它。

//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
}

【讨论】:

  • 这里重要的是首先包含 jQuery 库,然后有一个带有 noConflict() 的脚本块,然后包含任何原型库。
  • 首先感谢您的回复 :) 脚本的加载方式是固定的,无法更改,因为我只能编辑我的模块而不是整个页面。尽管如此,尽管原型是在 jquery 和 jquery.noConflict 之前加载的,但它在 ff、chrome、safari 中工作。 :s
  • 原型代码有效吗?我认为如果在 jQuery 代码之后加载任何原型代码都会停止工作。
【解决方案2】:

对于 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 的脚本。

【讨论】:

    猜你喜欢
    • 2011-03-08
    • 2010-11-01
    • 2012-01-09
    • 2011-01-29
    • 2011-08-12
    • 2010-09-13
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    相关资源
    最近更新 更多