如何避免 jquery 与原型的回调函数中的 $ 冲突

how to avoid $ conflict in the callback function of jquery with prototype

本文关键字:函数 冲突 回调 jquery 原型 何避免      更新时间:2023-09-26
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); 

在上面的代码中,我通过使用function($){}(jQuery)避免了与原型的冲突;但是在回调函数(action,e1,pos)中,它再次从原型调用函数。

$.noConflict(); & jquery.noConflict(); 我都试过但没有用。请提供建议显示我可以避免这种冲突。

冲突现在解决了。感谢大家的专家建议。但是现在另一个问题是右键单击input1时无法打开上下文菜单。请提供您的宝贵建议。

谢谢你。

问题出在 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($),并解决冲突。

假设你应该使用 jQuery.noConflict() 来避免使用$符号的库之间的干扰,最后你还有一个额外的;

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

您的代码中有错误:});(jQuery);

你应该调用匿名函数,而不仅仅是定义它,并使用jQuery作为调用它的参数,因此在匿名函数内部$jQuery,因为你现在有一个不同的范围。

如果执行(function($){/*your stuff*/});(jquery)则定义匿名函数,但不执行它。函数中的任何内容都不会执行,并且由于匿名函数没有名称,因此您无法执行它。

删除行中的第一个分号:

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

编辑:

关于其工作原理的一些解释:

它是一个匿名函数

(如果你不知道,Javascript中的匿名函数是如何工作的,请参阅这个问题),你用jQuery调用这个函数。如果你在代码中使用jQuery.noConflict(),为了避免将$绑定到 jquery,那么你将只能对 jquery 函数使用 jQuery('#myId') 这样的调用,而不是$('#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()。在该调用之后,$()默认为原型库中的函数。要调用 jQuery 库中的函数,您必须使用 jQuery()(请参阅 jQuery API 参考)。您将对 jQuery 对象的引用传递给匿名函数,因此在引用 jQuery 对象的匿名函数$中,不能使用 Prototype 库的功能。

现在关于回调函数的问题:问题可能出在 contextMenu 函数内部,因为此函数可能无法正确使用无冲突初始化,但这只是一个疯狂的猜测。您能否提供contextMenu函数的实现?