【发布时间】:2009-07-16 02:38:47
【问题描述】:
我想在浏览器获取先前请求时如何防止新的 ajax 请求! 我创建了一个包含这样的数据表的系统:
col1 | col2 | col3 数据1|数据2|数据3
当用户将鼠标悬停在数据字段上时,我使用 Ajax 来检索有关鼠标悬停事件数据的更多信息,但是如果用户快速移动他/她的数据列光标,则会创建多个请求。我该如何预防?
【问题讨论】:
我想在浏览器获取先前请求时如何防止新的 ajax 请求! 我创建了一个包含这样的数据表的系统:
col1 | col2 | col3 数据1|数据2|数据3
当用户将鼠标悬停在数据字段上时,我使用 Ajax 来检索有关鼠标悬停事件数据的更多信息,但是如果用户快速移动他/她的数据列光标,则会创建多个请求。我该如何预防?
【问题讨论】:
我认为你可以缓存 jquery ajax 请求对象,然后再中止它。
var xhr = $.ajax({...});
xhr.abort();
【讨论】:
Ben Nadel 有一个很好的模式来处理 AJAX 错误,包括检查相同类型的多个请求。
His blog post 可以帮到你。
【讨论】:
在您的情况下,您需要在鼠标悬停和 AJAX 请求之间稍作延迟。首先为 AJAX 请求执行 setTimeout。如果在此超时期间再次发出鼠标悬停,请清除超时并设置新的超时。
这是一个简化版本(假设您使用相同的函数 cell_onmouseover 作为所有元素的处理程序。
var timeoutId = null; //Should be visible to both functions.
function cell_onmouseover()
{
if (timeoutId)
{
clearTimeout(timeoutId);
timeoutId = null;
}
timeoutId = setTimeout(callAJAX, 500); //half a second delay.
}
function callAJAX()
{
//dostuff
}
[编辑]:您还可以增强它以在用户将鼠标悬停在新元素上时中止正在进行的 AJAX 调用。
【讨论】: