我创建了一个小型jQuery插件,当用户分别点击按钮.show
和按钮.hide
时,它会显示并隐藏div。我想传递一个函数作为插件选项来对onhide
进行一些特定的处理。但onhide
函数执行的次数与点击显示和隐藏按钮的次数相同。
这是jsfiddle。
当您再点击一次显示/隐藏按钮时,警报将显示相同的次数。
我认为它应该只为隐藏按钮提醒一次。
$.fn.showhide = function(options){
var popup = this;
defaultOptions = {
onHide : function() { },
onShow : function() { }
};
var Options = $.extend({},defaultOptions, options);
this.each(function() {
$(this).on('click',function(e){
var id = $(this).data('id');
$('#'+id).show();
$('.hide').on('click',function(){
var id = $(this).data('id');
$('#'+id).hide();
if (Options.onHide.call() === false) {
return;
}
});
});
});
}
$('.show').showhide({
onHide :function() {
alert('hide');
}
}
);
答案 0 :(得分:1)
这是因为您在循环中实现了onHide方法。
移动此位:
$('.hide').on('click',function(){
var id = $(this).data('id');
$('#'+id).hide();
if (Options.onHide.call() === false) {
return;
}
});
在你方法的右括号之前,一切正常!
编辑:在此处填写:https://jsfiddle.net/ka9gw09t/10/
答案 1 :(得分:1)
只需替换
$('.hide').on('click',function(){
要
$('.hide').one('click',function(){
<强>解释强>
使用您的代码,每次用户点击.show
时,您都会将一个委派.click
附加到该按钮。 one
只会做一次。
$.fn.showhide = function(options){
var popup = this;
defaultOptions = {
onHide : function() { },
onShow : function() { }
};
var Options = $.extend({},defaultOptions, options);
this.each(function() {
$(this).on('click',function(e){
var id = $(this).data('id');
$('#'+id).show();
$('.hide').unbind('click').one('click',function(){
var id = $(this).data('id');
$('#'+id).hide();
if (Options.onHide.call() === false) {
return;
}
});
});
});
};
$('.show').showhide({
onHide :function() {
alert('hide');
}
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button class="show" data-id="123">
Show
</button>
<button class="hide" data-id="123">
Hide
</button>
<div class="showhide" id="123" style="display:none;">
This is div with id 123
</div>
&#13;
<强>更新强>
我在unbind('click')
之前添加one
以取消绑定旧听众。