页面末尾的jQuery Callback滚动

时间:2012-03-18 13:03:02

标签: javascript jquery html callback scroll

我有一个设置为溢出的div标签:在css中滚动 我有一个回调,应该在使用它找到的元素的滚动结束时调用。

$('#details').scroll( function () {  
    if ($(this).height() == ($(this).get(0).scrollHeight - $(this).scrollTop())) {  
        getDetails($("span:last").attr("id"), 3);  
    }  
});  

其中getDetails是我正在使用的回调。它将div中的最后一个元素放在div中并将其作为值发送。它的所有ajax调用。问题是每当我将鼠标悬停在div的末尾时,getDetails会被调用三次。关于如何让它被召唤一次的任何建议?

只有当我使用滚轮或按下滚动条按钮才会发生重复回调。滚动滚动条时,一切正常。

2 个答案:

答案 0 :(得分:4)

您应该使用setTimeout / clearTimeout推迟处理持续反馈的事件,例如滚动和调整大小事件。当您想要处理的事件被引发时,在具有合理持续时间的setTimeout中调用您的预期处理程序,但保持对句柄setTimeout的引用返回。现在,修改相同的代码以检查是否存在此句柄,如果存在,则clearTimeout并将句柄更新为新的setTimeout调用。

以下是一个工作示例:http://jsfiddle.net/SBgXA/

       var timeoutHandle;

       var handler =  function(e) {
              alert('raised'); // put your code here
              if ($(this).height() == ($(this).get(0).scrollHeight - $(this).scrollTop()) {  
                getDetails($("span:last").attr("id"), 3);  
              }
       }

       $('#details').scroll(function(e) {
           clearTimeout(timeoutHandle);

           timeoutHandle = setTimeout(function() {
             handler(e);
           }, 100);
       });

答案 1 :(得分:2)

我没有对此进行测试,但这些方面的内容可能会有效。虽然它非常hacky ......

$('#details').data("didfire", false).scroll( function () {  
    if ($(this).height() == ($(this).get(0).scrollHeight - $(this).scrollTop())) {  
        if(!$(this).data("didfire")) {
            getDetails($("span:last").attr("id"), 3);  

            $(this).data("didfire", true)
            var ref = $(this);
            setTimeout(function(){
                ref.data("didfire", false);
            }, 500);
        }
    }  
});