当逻辑语句的结果发生变化时如何执行回调?

Posted

技术标签:

【中文标题】当逻辑语句的结果发生变化时如何执行回调?【英文标题】:How to execute a callback when the result of a logical statement changes? 【发布时间】:2011-07-05 09:02:04 【问题描述】:

使用 jquery 是否可以在条件语句从 false 变为 true 时立即触发函数?

我正在寻找一种不消耗所有系统资源的解决方案(即:不是setInterval(function(),1))。

最后我使用了 .scroll() 而不是下面更雄心勃勃的建议。

【问题讨论】:

if( $('#lay3b_top').scrollTop() + $('#lay3b_top').height() == $('#measuring_wrapper').height()) 问题是条件复杂,没有任何关联且方便的触发器。 @Patrick Beardmore:但您同意事件触发器是更好的解决方案,不是吗? 当然,我就是想不出。条件语句决定 是否滚动到底部。 我不知道你的问题是什么,但你的解决方案肯定是错的! @markus:该解决方案是我不想做的(因此“不”) 【参考方案1】:

除非元素的高度发生变化,否则只需要观察resizescroll事件。所以试试这个:

$(window).bind('resize', handler);
$(document).bind('scroll', handler);

由于这些事件可以经常触发,您应该将处理程序操作保持在最低限度。例如,您可以使用 closure 缓存 $ 调用:

var handler = (function(a, b)
    return function(event) 
        if ((a.scrollTop() + a.height()) == b.height()) 
            /* … */
        
    )($('#lay3b_top'), $('#measuring_wrapper'));

这里,外部函数返回的内部函数内部的变量ab分别绑定到$('#lay3b_top')$('#measuring_wrapper')的返回值。 (function())() 是一个匿名函数表达式,它会立即使用给定的参数调用,以将参数绑定到函数的作用域。

【讨论】:

应该注意,浏览器可以触发大量的“滚动”事件,所以最好让处理程序尽可能快,并且绝对避免 DOM 操作(或推迟它)。 @Pointy:是的,绝对的。在这种情况下可以缓存 jQuery 对象,例如:var handler = (function() return function(event) if ((arguments[0].scrollTop()+arguments[0].height()) == arguments[1].height()) /* … */ )($('#lay3b_top'), $('#measuring_wrapper'));

以上是关于当逻辑语句的结果发生变化时如何执行回调?的主要内容,如果未能解决你的问题,请参考以下文章

当实际数据发生变化时,结果缓存数据会发生啥变化?

由于 Meteor 升级到 0.8.0,当 Session 变量依赖发生变化时,不会触发模板“rendered”回调

当所有依赖项都发生变化时使用效果?

当 QML 项目的尺寸发生变化时如何得到通知?

业务逻辑发生变化时如何尊重开闭原则?

谷歌地图 fitBounds 回调