jQuery removeClass 的工作方式不正确
jQuery removeClass doesn't works the right way
有两个按钮(黑色的),和两个(开始时是小的)绿色框,里面有(红色,但开始时未显示)内容。我的目标是使工作完美如下:
如果我单击第一个按钮,第一个框会变大,并且可以看到其中的内容。如果第二个盒子很大(而且它的内容可见),在第一个盒子的功能开始之前,让第二个盒子的内容消失,然后让盒子恢复到原来的大小。
因此,点击第二个按钮,只需将第二个框变大即可。
我试过了,我没有看到代码中有任何逻辑错误。但是如果我点击第一个按钮,它仍然可以正常工作,但是在我点击第二个按钮之后,一切都出错了...... addClass() 函数添加了 class "invisible" 但在它删除之后立即地。在事情变得更糟之后...
这是我的页面演示:
http://math.bme.hu/~mosonyip/Testing13/testing13.html
请帮助我,我只是网络编程的新手,也很抱歉我的英语不好!
我看到的问题是每次单击按钮时您都在重新绑定转换事件
$( "div.button-1" ).click( function() {
if( $( "div.no2 div.inside" ).hasClass( "invisible" ) != true ) {
// FOLLOWING LINE IS RE-BOUND EACH TIME WITH ON()
$( "div.no2 div.inside" ).addClass( "invisible" ).on('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', function() {});
});
})
多处都是这种情况,所以多个事件处理程序绑定到您的div (no1, no2)。解决这个问题,它可能会解决您的问题。 (您可以调用 off()
或将事件处理程序绑定到您的点击处理程序之外)
编辑:这是一个更新的 fiddle,演示调用 off
以防止多事件绑定(脚本也被清理):http://jsfiddle.net/e98fgcg1/2/
并且代码更改:
var TRANSITIONS = 'transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd';
$('div.button-1, div.button-2').on('click', function() {
var ORIGINAL = $(this).hasClass('button-1') ? 'div.no1' : 'div.no2';
var SELECTOR = ORIGINAL === 'div.no1' ? 'div.no2' : 'div.no1';
if ($(SELECTOR).find('div.inside').hasClass('invisible') !== true) {
$(SELECTOR).find('div.inside').addClass('invisible').on(TRANSITIONS, function() {
$(SELECTOR).find('div.inside').off(TRANSITIONS);
$(SELECTOR).removeClass('bigger').on(TRANSITIONS, function() {
$(SELECTOR).off(TRANSITIONS);
$(SELECTOR).removeClass('z-index-2');
$(ORIGINAL).addClass('z-index-2').addClass('bigger').on(TRANSITIONS, function() {
$(ORIGINAL).off(TRANSITIONS);
$(ORIGINAL).find('div.inside').removeClass('invisible');
});
});
});
} else {
$(ORIGINAL).addClass('z-index-2 bigger').on(TRANSITIONS, function() {
$(ORIGINAL).off(TRANSITIONS);
$(ORIGINAL).find('div.inside').removeClass('invisible');
})
}
});
有两个按钮(黑色的),和两个(开始时是小的)绿色框,里面有(红色,但开始时未显示)内容。我的目标是使工作完美如下:
如果我单击第一个按钮,第一个框会变大,并且可以看到其中的内容。如果第二个盒子很大(而且它的内容可见),在第一个盒子的功能开始之前,让第二个盒子的内容消失,然后让盒子恢复到原来的大小。 因此,点击第二个按钮,只需将第二个框变大即可。
我试过了,我没有看到代码中有任何逻辑错误。但是如果我点击第一个按钮,它仍然可以正常工作,但是在我点击第二个按钮之后,一切都出错了...... addClass() 函数添加了 class "invisible" 但在它删除之后立即地。在事情变得更糟之后...
这是我的页面演示: http://math.bme.hu/~mosonyip/Testing13/testing13.html
请帮助我,我只是网络编程的新手,也很抱歉我的英语不好!
我看到的问题是每次单击按钮时您都在重新绑定转换事件
$( "div.button-1" ).click( function() {
if( $( "div.no2 div.inside" ).hasClass( "invisible" ) != true ) {
// FOLLOWING LINE IS RE-BOUND EACH TIME WITH ON()
$( "div.no2 div.inside" ).addClass( "invisible" ).on('transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd', function() {});
});
})
多处都是这种情况,所以多个事件处理程序绑定到您的div (no1, no2)。解决这个问题,它可能会解决您的问题。 (您可以调用 off()
或将事件处理程序绑定到您的点击处理程序之外)
编辑:这是一个更新的 fiddle,演示调用 off
以防止多事件绑定(脚本也被清理):http://jsfiddle.net/e98fgcg1/2/
并且代码更改:
var TRANSITIONS = 'transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd';
$('div.button-1, div.button-2').on('click', function() {
var ORIGINAL = $(this).hasClass('button-1') ? 'div.no1' : 'div.no2';
var SELECTOR = ORIGINAL === 'div.no1' ? 'div.no2' : 'div.no1';
if ($(SELECTOR).find('div.inside').hasClass('invisible') !== true) {
$(SELECTOR).find('div.inside').addClass('invisible').on(TRANSITIONS, function() {
$(SELECTOR).find('div.inside').off(TRANSITIONS);
$(SELECTOR).removeClass('bigger').on(TRANSITIONS, function() {
$(SELECTOR).off(TRANSITIONS);
$(SELECTOR).removeClass('z-index-2');
$(ORIGINAL).addClass('z-index-2').addClass('bigger').on(TRANSITIONS, function() {
$(ORIGINAL).off(TRANSITIONS);
$(ORIGINAL).find('div.inside').removeClass('invisible');
});
});
});
} else {
$(ORIGINAL).addClass('z-index-2 bigger').on(TRANSITIONS, function() {
$(ORIGINAL).off(TRANSITIONS);
$(ORIGINAL).find('div.inside').removeClass('invisible');
})
}
});