Javascript 我的插件不适用于不同的回调
我正在为不同div的上下文菜单开发一个插件Javascript 我的插件不适用于不同的回调,javascript,jquery,dom,jquery-plugins,Javascript,Jquery,Dom,Jquery Plugins,我正在为不同div的上下文菜单开发一个插件 <div> <div class='first'>some data</div> <div class='second'>some data</div> <div class='third'>some data</div> <div class='fourth'>some data</div> </div> 我正在使
<div>
<div class='first'>some data</div>
<div class='second'>some data</div>
<div class='third'>some data</div>
<div class='fourth'>some data</div>
</div>
我正在使用这个插件
$('.first').cnxtmenu({menuid:'cmenu',
item1:some callbacks
});
//...
$('.fourth').cnxtmenu({menuid:'cmenu',
// soem differt callbacks.
});
对于所有四个div,都分配了不同的回调
我的问题是,选择器的回调没有区别,唯一的最后一个,即第四个选择器的回调正在执行。并且多次触发回调
请帮帮我,我的代码出了什么问题
提前感谢。在给出的示例中,您将列表
cmenu
作为同一对象传递给每个调用cnxtmenu()
。由于cmenu
是持久的,因此当您解除绑定
单击侦听器时,您将删除以前连接的侦听器,并将其替换为新的侦听器
您或者需要为每个调用cnxtmenu()
传递不同的上下文菜单,或者您可以尝试重新构造具有多个回调的对象,但根据触发上下文菜单的元素将其过滤掉
另外,除非您受限于jQuery 1.7以下的某个版本,否则您应该使用and,而不是
live()
和unbind()
我知道了您的问题,您以错误的方式分配回调。回调将按照您为上一个除法指定的方式进行分配。因此您需要在contextmenu函数中分配回调
第二,调用插件的次数越多,插件代码也会执行,并且作为代码,回调也会在onload中分配。代码更改后无需担心 请描述它应该如何工作。它应该显示不同分区的菜单并触发为该分区分配的回调。所有分区的菜单都相同,唯一的项目是更改,这意味着隐藏一些项目。谢谢帮助!!。你能告诉我为不同的分区显示不同的项目有什么问题吗。和回调正在更改。@kirankumar当您为某个人写评论时,请使用
@
,以便通知该人。编辑您的问题并详细描述其工作原理(例如:用户单击li#menuItem5
,ul
必须消失,div
中的文本必须更改)。。。现在我对你的话一无所知description@caligula你能先告诉我我的代码执行了多少次吗times@kirankumar当它执行多次时?在什么操作之后?@kirankumar使用@
并且它执行了两次,因为您两次调用您的方法,例如$('.first').cnxtmenu(
)。以这种方式创建菜单的次数越多,代码就会运行。
(function($) {
$.fn.cnxtmenu = function(options) {
var defaults = {
'menuid' : '',
item1 : function() {},
item2 : function() {},
item3 : function() {},
item4 : function() {},
item5 : function() {},
item6 : function() {},
},
opt = $.extend({}, defaults, options);
var mid = '#'+opt.menuid, seldiv;
this.live({
"contextmenu" : function(e) {
seldiv = $(this);
if ($(this).hasClass('first')) {
//change the menu list
}
else if($(this).hasClass('second')){
// change the menu list to display different items
}
else if($(this).hasClass('file-list')){
//differ list
}
else if($(this).hasClass('dstore_file-list')){
//differ menu list
}
$(mid).css({
top : e.pageY + 'px',
left : e.pageX + 'px'
}).show();
return false;
}
});
$(mid).children('li').unbind('click').click(function(e) {
e.stopPropagation();
e.preventDefault();
switch(this.id) {
case 'menuItem1':
opt.item1(this, seldiv);
break;
case 'menuItem2':
opt.item2(this, seldiv);
break;
case 'menuItem3':
opt.item3(this, seldiv);
break;
case 'menuItem4':
opt.item4(this, seldiv);
break;
case 'menuItem5':
opt.item5(this, seldiv);
break;
case 'menuItem6':
opt.item6(this, seldiv);
break;
}
$(mid).hide();
return false;
});
$(mid).click(function() {
$(mid).hide();
});
$(document).click(function() {
$(mid).hide();
});
}
})(jQuery);
$('.first').cnxtmenu({menuid:'cmenu',
item1:some callbacks
});
//...
$('.fourth').cnxtmenu({menuid:'cmenu',
// soem differt callbacks.
});