2012-04-17 106 views
0
jQuery.noConflict(); or $.noConflict();  
(function($) { 
    $(document).ready(function() { 
    // Show menu when #input1 is clicked 
     $("#input1").contextMenu({ 
     menu: 'myMenu' 
     }, 
     function(action, el, pos) { 
     alert("clicked"); 
     }); 
    })(jQuery); 

在上面的代碼中,我通過使用函數($){}(jQuery)避免了與原型的衝突; 但在回調函數(action,e1,pos)中,它又是從原型調用函數。如何避免jQuery的回調函數與原型的衝突

$ .noConflict(); & jquery.noConflict();我試過但沒用。 請提供建議,我可以避免這種衝突。

衝突現在已解決。感謝所有的專家建議。 但現在另一個問題是上下文菜單沒有打開右鍵單擊input1。請提供您的寶貴建議。

感謝你。

+0

使用['$ .noConflict()'](http://api.jquery.com/jQuery.noConflict)。 – 2012-04-17 13:19:24

回答

0

問題出在jquery.contextMenu.js。我所提到的這些行:

// This plugin is dual-licensed under the GNU General Public License 
// and the MIT License and is copyright A Beautiful Site, LLC. 
// 
if(jQuery)(function() { 
    $.extend($.fn, 
... 
})(jQuery); 

所以我們不能說'$'是jQuery的或其他庫。這是插件的錯誤。

function()更改爲function($)衝突應解決。

+0

非常感謝tou,它已經解決了衝突... – Infotechie 2012-04-18 06:48:56

+0

如何做到這一點? – Infotechie 2012-04-18 16:29:54

+0

@Infotechie請參閱 - > http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Engineer 2012-04-18 17:17:36

0

爲前提,你應該使用jQuery.noConflict()避免使用$符號庫之間的干擾,還必須在最後一個額外的;

(function($) { 
    ... 
}(jQuery)); 
+0

甚至在使用jQuery.noConflict()後仍未解決衝突 – Infotechie 2012-04-17 15:44:18

0

你在你的代碼中的錯誤:});(jQuery);

你應該調用匿名函數,而不僅僅是定義它,並使用jQuery作爲調用它的參數,因此在匿名函數$中的值是jQuery,因爲您現在有不同的範圍。

如果你做(function($){/*your stuff*/});(jquery)你定義一個匿名函數,但不要執行它。函數內部的任何內容都不會執行,並且由於匿名函數沒有名稱,因此無法執行它。

在行中刪除第一個分號:

(function($) { 
    // do your stuff 
})(jQuery); 

編輯:

什麼這個工程做一點解釋:

它是一個匿名函數(如果你不這樣做知道,Javascript中的匿名函數是如何工作的,請參閱this question),然後用jQuery調用該函數。如果你在你的代碼中使用jQuery.noConflict(),你應該這樣做,以避免綁定$到jquery,那麼你將只能使用像jQuery('#myId')這樣的jQuery函數調用,而不是$('#myId'),因爲$仍然綁定到Prototype庫(我明確地調用這是從prototype鏈中找出對象的原因)。

現在考慮您的匿名函數:

你有(function($){ /* Some stuff with $ as a variable */ })。函數內部有一個新的範圍,因此$只是您傳遞給函數的變量,而不是其外部的$(仍然綁定到Prototype庫)。

現在您將某些內容傳遞給匿名函數並執行它:(function($){ /* Some stuff with $ as a variable */ })(jQuery)。現在$裏面的功能是..... jQuery,不是像$那樣。

編輯2:

當你更新你的問題,我會解釋的步驟,以使這兩個庫工作。 您需要在jQuery之前包含Prototype的引用,然後調用jQuery.noConflict()。在那次調用之後,$()默認爲Prototype庫中的函數。要調用jQuery庫中的函數,您必須使用jQuery()(請參閱the jQuery API reference)。您將對jQuery對象的引用傳遞給您的匿名函數,因此在匿名函數$中引用了jQuery對象,因此無法使用Prototype庫的功能。

回到頂端有關回調函數的問題:問題可能在contextMenu函數內,因爲此函數可能無法正確使用無衝突初始化,但這只是一個瘋狂的猜測。你能否給你實施contextMenu函數?

+0

您可以通過給出一個示例來闡述它,因爲我是jquery的新手,所以它會幫助我更好地理解您的視圖。 – Infotechie 2012-04-17 13:33:33

+0

感謝這麼好的解釋和鏈接。它真的幫助我學習匿名函數的概念。但是我仍然無法得到你的建議:「你應該調用匿名函數,而不是僅僅定義它,並且使用jQuery作爲調用它的參數,因此在匿名函數$中是jQuery,因爲你現在有一個不同的範圍。 「因爲我正在做同樣的事情。 – Infotechie 2012-04-17 15:58:57

+0

我正在使用contextMenu.js for this.You是正確的有contextMenu JavaScript中的衝突解決問題。以下是我下載contextMenu插件的鏈接。你可以從那裏拿走它,或者告訴我如何分享它,因爲它非常大。 – Infotechie 2012-04-18 04:29:37