1

我正在使用jQuery爲現有頁面構建模塊。該頁面也使用原型,所以有通常的jQuery原型衝突。我使用的jQuery.noConflict()和一切工作正常,除了ie(在ie8中測試)的所有瀏覽器。 我已閱讀這裏和其他網站的所有類似問題,但我無法讓它工作。 這是關於它是如何工作的:頁面使用原型(effects.js,prototip.js等)加載原型和其他.js文件,然後加載我的模塊(又名jQuery在原型之後加載)。 我讀過關於將原型的$()函數更改爲$$$(),但這是不可能的(其他許多使用原型的模塊將需要更改),所以它只是關於更改我的js。只有在ie8 jquery原型衝突

然後我讀有關使用

(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);

我得到的所有功能是不確定的。

我在做什麼錯了?還是有另一種解決方案?

+1

我強烈建議嘗試使用一個或另一個,但不是兩個。如果沒有太多的麻煩,你可以使它們不衝突,但這意味着你的用戶必須加載兩個不同的庫。有jQuery和Prototype的插件可以完成你想要的大部分事情。 – 2011-01-31 15:12:00

回答

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

這裏重要的是首先包含jQuery庫,然後用noConflict()創建一個腳本塊,然後包含任何原型庫。 – 2011-01-31 15:07:41

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的原型或任何其他腳本。