为什么实时点击功能自动工作时,它应该只发生在点击
Why does the live click function work automatically when it should only happen upon click?
我有一个按钮,用户点击(.next_1)。
<a id="next_btn" class="next_1" href="#">Next</a>
用户单击按钮后,应该将类更改为next_2。当用户再次点击按钮时,它应该将其更改为next_3。
$('.next_1').click(function() {
$('#next_btn').removeClass('next_1').addClass('next_2');
});
$('.next_2').live('click', function() {
$('#next_btn').removeClass('next_2').addClass('next_3');
});
目前,当用户点击按钮时,它直接将类更改为next_3,而应该更改为next_2。为什么实时点击功能自动工作时,它应该只发生在点击?
.live()在本例中与添加另一个单击处理程序相同。我建议使用。toggle()函数。
http://api.jquery.com/toggle-event/$('#next_btn').toggle(function() {
$('#next_btn').removeClass('next_1').addClass('next_2');
}, function() {
$('#next_btn').removeClass('next_2').addClass('next_3');
}, function() {
$('#next_btn').removeClass('next_3').addClass('next_1'); // loops back to start
});
$('#next_btn').click(function(){
if( $(this).hasClass('.next_2') ){
$(this).removeClass('next_2').addClass('next_3');
}else if( $(this).hasClass('.next_1') ){
$(this).removeClass('next_1').addClass('next_2');
}
});
如果出于其他原因希望使用两个单独的事件处理程序,我建议停止click事件的传播,并将两者都更改为.live()。基本上,如果你要改变影响选择器的东西并且你想让这些改变反映在事件处理程序中,你要么取消绑定并重置新选择器上的事件处理程序要么使用。live():
$('.next_1').live('click', function() {
$('#next_btn').removeClass('next_1').addClass('next_2');
return(false);
});
$('.next_2').live('click', function() {
$('#next_btn').removeClass('next_2').addClass('next_3');
return(false);
});
我认为问题在于你没有在第一次点击时阻止事件传播,这样点击就会继续上升到顶层。最后,它到达jQuery的.live()处理程序,现在您已经将类更改为"next_2",它匹配.live()处理程序,并再次处理单击。如果您在第一个click处理程序上停止事件传播,那么当它已经被处理时,它将不会到达.live()处理程序。
另外,我认为你将不得不取消绑定第一个点击处理程序。它绑定到特定的DOM对象,而不是绑定到类,因此即使更改了类名,它仍将处理事件。或者,也可以让它们都是.live()处理程序。
如果是我,我不会为一个对象使用两个单独的事件处理程序。只需绑定一个事件处理程序,并根据状态向其添加条件逻辑。
为了多样化,这里有另一种方法,可以轻松地进入任意多个next_n级别,而无需更多代码:
$('#next_btn').click(function() {
var $this = $(this);
var num = $this.data("index") || 1; // get current state
if (num < 3) { // only go up to next_3
$this.removeClass('next_' + num); // remove previous class
++num; // go up one
$this.addClass('next_' + num); // add the new class
$this.data("index", num); // store new current state
}
});
和一个显示它的jsFiddle: http://jsfiddle.net/jfriend00/jpdjY/
或更紧凑的形式:
$('#next_btn').click(function() {
var num = $(this).data("index") || 1; // get current state
if (num < 3) { // only go up to next_3
$(this).removeClass('next_' + num++).addClass('next_' + num).data("index", num);
}
});
- 添加文字和评论功能更新Div
- JavaScript打印功能使日历停止工作
- 使用Facebook live API创建实时视频对象时的隐私设置
- 有任何可能将facebook实时信使整合到一个网站中
- 每当您在选择器内移动鼠标时,悬停功能就会重复
- 如何防止网页加载后自动启动功能
- 除修剪外的其他功能
- 悬停功能触发器
- 使用angularjs向浏览器发送servlet响应(下载功能)
- jQuery+Android.将功能(Touchstart、touchmove)应用于实时加载的内容
- 复制此实时核心功能
- AngularJs 控制器中的实时时钟功能
- 实时功能
- 使用“打开键控”功能进行实时
- jQuery脚本的顺序正确吗?隐藏/显示功能在实时版本中不起作用,但可以作为独立Fiddle使用
- 是否有一种方法来运行jquery.没有任何事件的实时功能
- 为什么实时点击功能自动工作时,它应该只发生在点击
- Javascript .replace()在控制台和实时环境中的功能不同
- Jquery实时输入验证.发布功能
- D3.JS时间序列折线图,具有实时数据、平移和缩放功能