2012-04-17 103 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