我有一个设置为溢出的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会被调用三次。关于如何让它被召唤一次的任何建议?
只有当我使用滚轮或按下滚动条按钮才会发生重复回调。滚动滚动条时,一切正常。
答案 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);
}
}
});