JavaScript jquery回调累积
javascript jquery callback accumulates
问题:每次点击div.a 时,点击div.b 时的回调次数累积 1。
var $=jQuery;
$(function(){
$("div.a").click(function(){cbf(trgmsg);});
});
function trgmsg(){
alert($.now());
}
function cbf(cb){
$("div.b").click(function(){cb()});
}
结果:
单击div.a 一次并单击div.b => 警报() 弹出;
如果我再次单击div.a 并单击div.b => alert() 会连续两次弹出;
如果我再次单击div.a 并单击div.b => alert() 会连续弹出三次;
..
等等
我不知道问题的原因是什么,或者它是否只是我对 JS 中回调函数的误解/误用。任何见解和/或建议将不胜感激。谢谢
无需重构即可修复代码的最快方法是取消绑定并重新绑定。
var $=jQuery;
$(function(){
$("div.a").click(function(){cbf(trgmsg);});
});
function trgmsg(){
alert($.now());
}
function cbf(cb){
$("div.b").off('click').click(function(){cb()});
}
你现在拥有的(重构)看起来像:
(function($){
$(function(){
function trgmsg(){
alert($.now());
}
$('div.a').click(function(){
// every time `div.a` is clicked a new click event is
// attached to `div.b`.
$('div.b').click(function(){ // maybe use `.one()` instead of `.click()`?
cb();
});
});
});
})(jQuery);
您可能希望使用.one()
以便在绑定后仅执行一次。或者,您需要详细说明实际目标是什么,看看是否可以以不同的方式解决。
如果您只想针对 div.b
调用提供的函数,则单击div.a
时,这可能对您有用
var $=jQuery;
$(function(){
$("div.a").click(function(){cbf(trgmsg);});
});
function trgmsg(){
alert($.now());
}
function cbf(cb){
$("div.b")[0].apply(cb);
}
您正在将多个点击事件附加到div.b 上。 因此,每次您单击div.a 时,它都会将另一个点击事件附加到div.b 上,因此当单击div.b 时,会触发它的每个点击事件。 您可以尝试设置一个标志,表明点击已被注册。
var $=jQuery;
var flag = 0;
$(function(){
$("div.a").click(function(){cbf(trgmsg);});
});
function trgmsg(){
alert($.now());
}
function cbf(cb){
if (!flag) {
flag = 1;
$("div.b").click(function(){cb()});
}
}
虽然我不太确定你使用它做什么,所以这可能不是你想要的功能。
相关文章:
- jquery Onclick函数带有导致双击的回调排序函数
- 将额外的参数传递给jquery.延迟回调
- 有没有什么方法可以停止Jquery中的animate(也可以停止完整的回调函数)
- bookmarklet中的jQuery.getScript()进行回调,但没有成功执行插件
- jQuery Mobile:如何在$.Mobile.changePage之前运行回调函数
- 当使用命名函数作为jquery ajax成功回调时,我需要括号吗
- jQuery$.post可以在chrome、safari中工作,但不能在FF中工作(声明成功回调函数未定义)
- 如何使用jQuery等待来自回调的异步调用
- jQuery post,访问responseType或回调中的响应
- jQuery AJAX错误回调未运行
- Mapbox,无法在jquery回调中设置GeoJSON
- jQuery load()回调导致POST而不是GET
- 在firefox中,使用jquery ajax不会调用错误和完整回调
- Jquery回调函数执行多次
- 在我的选项卡jquery ui创建后回调
- 将参数传递给动画回调jQuery
- jQuery插件回调-jQuery Boilerplate
- 淘汰dom操作后回调jquery函数
- JSONP 回调 - JQuery 和其他框架
- 无限滚动,回调jquery函数