2010-05-11 74 views
1

我試圖讓一些預先存在的MooTools代碼在Drupal站點內正常工作。我知道MooTools代碼可以獨立運作。一旦我在頁面中加載MooTools庫,jQuery就停止運行。MooTools和jQuery的衝突 - 儘管美元安全模式

我在jQuery之後加入了MooTools,它(根據MooTools的開發者)應該防止Moo從已經加載的jQuery庫中竊取已定義的$。

我已將我的Moo代碼中的所有引用都轉換爲document.id。

當我加載頁面時,Moo代碼有效,但jQ代碼沒有。看來Moo仍然在從jQ中竊取$變量並重新定義它自身。出於測試目的,我正在加載的Moo代碼是一個簡單的12手風琴腳本。如果我解決了這個問題,我需要使用更復雜的。

Drupal廣泛使用jQuery,所以使用jQ的no_conflict模式不是一個可行的選擇。據我所知,這應該是可能的美元安全模式。

我使用MooTools Core 1.2.4和MooTools更多1.2.4.4和jQuery 1.2.6(也試過1.4.2)。

回答

0

這更多地取決於您的案例中使用的插件。 jQuery本身可能工作正常,但如果插件不是由他們的推薦書寫的,它將無法工作。

3

除了使用$來訪問jQuery函數,您始終可以使用jQuery()

使用.ready()時,您甚至可以通過自己的識別碼,例如:

jQuery(document).ready(function(myIdentifier){ 

    myIdentifier(); // this is the jQuery reference! 

}); 
3

奇,這是的東西應該發生,是誠實的。由於mootools 1.2.3(?)(可能是1.2.1),如果它已經在頁面上定義,它不會接管賦值$。也就是說,如果裝載的順序描述:

jQuery的 mootools的

...然後moootools將自動進入兼容模式並恢復到document.id。唯一的情況是,如果jquery以noConflict模式加載,這將阻止它將jQuery分配給$,並且不會讓mootools不抓住它。

無論如何,這就是理論。如果您看到不同的行爲,那麼瀏覽器出現問題。你是懶加載還是非阻塞/並行加載腳本?

最好的做法在這裏通常是,離開的jQuery在本機模式(W/O noConflict),並重新分配至$ document.id照顧的mootools的一個範圍,像這樣:

<div id="foo"></div> 

,然後:

$("#foo"); // jquery 

(function($) { 
    $("foo"); // mootools. 
})(document.id); 

最近有很多關於這個問題的問題,只是通讀了最新的mootools問題。否則,請將網址發佈到您的項目中。

很明顯,你可以控制檯。日誌($)檢查/確認: http://www.jsfiddle.net/AxVqy/ - > testcase

1

爲什麼不使用jQuery而不是$? 如果因任何原因,你不能做到這一點noConflict();並不意味着你必須停止使用$ jQuery的,你可以做這樣的事情:

<script type="text/javascript" src="mootools.js"></script> 
<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript"> 
    $.noConflict(); 
    jQuery(document).ready(function($) { 
    // Code that uses jQuery's $ 
    }); 
    // Code that uses mootools $ 
</script> 

您使用jQuery的插件可能有問題,只需更換自己$(function(){}與我第一次loadeed mootools的jQuery(document).ready(function($) {});

通知,你也可以做這樣的事情周圍的每段代碼:

(function($) { 
    $("id"); // mootools. 
})(document.id); 


(function($) { 
    $("#id"); // jQuery. 
})(jQuery); 

我有一個類似的問題找到一個解決方案來加載全部或一個或任何不同庫的組合。一旦我想到如何做到這一點,我相信我可以與你分享,你一定能做到這一點。但上面的解決方案應該爲你工作,我已經設法使用它來加載jQuery和mootools以及我想要的任何順序。

0

如果我必須同時使用,我首先包含jQuery,然後包含Mootools(1.3)。如果您不需要打擾jQuery,則不會因爲Mootools兼容性自動啓動而發生衝突,那麼可以爲Mootools和jQuery定義$以便快速切換,即(function($){ /*stuff*/ })(document.id)等。