【发布时间】:2013-01-03 08:21:33
【问题描述】:
我有一个使用 jQuery 的bind() 附加事件的 HTML 按钮,如下所示:
$('#mybutton').bind('click', myFirstHandlerFunction);
在myFirstHandlerFunction 中,我希望这个处理程序用新的处理程序mySecondHandlerFunction 替换自己,如下所示:
function myFirstHandlerFunction(e) {
$(this).unbind('click', myFirstHandlerFunction).bind('click', mySecondHandlerFunction);
}
在第二个单击处理程序mySecondHandlerFunction 中,我想将按钮切换回其原始状态:取消绑定mySecondHandlerFunction 处理程序并重新附加原始处理程序myFirstHandlerFunction,如下所示:
function mySecondHandlerFunction(e) {
$(this).unbind('click', mySecondHandlerFunction).bind('click', myFirstHandlerFunction);
}
这很好用,除了一个小细节:因为点击事件还没有通过按钮的每个点击处理程序传播,所以点击事件被传递到按钮的下一个点击处理程序,它恰好是之前的处理程序只是绑定在前一个处理程序中。最终结果是mySecondHandlerFunction 在myFirstHandlerFunction 执行后立即执行。
这个问题可以通过在每个处理程序中调用e.stopPropagation() 来轻松解决,但这具有取消可能已独立附加的任何其他点击处理程序的负面影响。
有没有一种方法可以安全、一致地在两个点击处理程序之间切换,而不必停止点击事件的传播?
【问题讨论】:
-
为什么不使用标志来检查要调用的处理程序并始终附加主处理程序。
标签: javascript jquery events click handler