mpe*_*pen 6 ajax jquery jquery-ui-autocomplete
我正在使用source执行ajax请求的选项的回调版本.我想如果用户在ajax请求完成之前快速连续输入一堆字母,我们应该中止旧的并且只使用新的.我假设source参数的URL版本会自动执行此操作,但由于我使用的是自定义回调,因此我必须手动执行此操作.
所以这就是我所拥有的:
$('#myselector').autocomplete({
source: function(request, response) {
var data = {};
if($(this).data('xhr')) {
console.log('aborting...');
$(this).data('xhr').abort();
}
// *snip* add some stuff to data
$(this).data('xhr', $.ajax({
url: '/ajax/major_city',
dataType: 'json',
data: data,
success: function(data, textStatus, $xhr) {
response(data);
},
complete: function($xhr, textStatus) {
console.log(textStatus);
if(textStatus === 'abort') {
console.log('aborted!');
response([]);
}
}
}));
},
// ....
Run Code Online (Sandbox Code Playgroud)
因此,每当触发"源"回调时,它会检查该输入是否存在XHR元素(第一次未定义),如果是,则中止它(侧问:如何检查请求是否完整?没有意义尝试已经完成的中止请求).
但文档说:
在提供自定义源回调以处理请求期间的错误时,这很重要.即使遇到错误,也必须始终调用响应回调.这可确保窗口小部件始终具有正确的状态.
因此,在我的代码底部,您将看到我(尝试)检查请求是否已中止,如果是,我返回一个空列表.但那"中止了!" 似乎永远不会被称为日志.即使它被中止,它总是说"成功".为什么?
编辑:刚试过输出$(this).data('xhr').readyState.它似乎永远不会比4我建议的那样,source直到最后一个请求返回响应才被再次调用.这是一种耻辱,因为我们可以提前中止请求并加快响应时间......
您是否无法设置等待用户“看起来”完成输入的时间间隔?“延迟”选项设置在搜索之前输入最后一个字母后等待的毫秒数。
此外,即使您从服务器返回“中止”,响应仍然会成功。因为请求在服务器上没有出错。你返回我假设的值“abort”。
| 归档时间: |
|
| 查看次数: |
4010 次 |
| 最近记录: |