ajax速度-简化多个ajax调用
ajax speed - boiling down multiple ajax calls
我的网站上有一个搜索过滤器,当用户取消选中一个框时,会向服务器发送一个ajax调用,返回新的、缩小范围的搜索结果。
然而,现在,用户可以同时取消选中大约20个框,这迫使我进行20个不同的ajax调用——这是非常慢的
关于如何将20个不同的ajax调用传递到一个调用中以加快速度,有什么想法吗?
这是我的js:
// to allow us to process the "only" buttons, which don't register the click event we're looking for
$("input[type=checkbox]").change(function() {
// remove the original, unfiltered results
$('#original_results').css("display", "none");
// which filter section does the filter belong to
var filter_section = $(this).attr('name');
// should it be filtered out or left in
var remove = $(this).prop('checked');
// if needs to be filtered
if (!remove)
{
// add it to our filter list for the specified section
filters[filter_section].push(this.value);
}
else
{
// take it off the list for the specified section
var index = filters[filter_section].indexOf(this.value);
if (index > -1)
{
filters[filter_section].splice(index, 1);
}
}
doAjax();
});
// ajax function
function doAjax() {
// get slider values
var ranges = $('#pay_range').slider('values');
// define data to post
var data = {
min: ranges[0],
max: ranges[1],
filters: filters,
criteria: criteria
};
// post data
$.ajax({
type: 'POST',
url: '/results/search_filter',
data: data,
beforeSend: function() {
$('#search_results').html('Updating your query');
},
success: function(response) {
$('#search_results').html(response);
},
dataType: "html"
});
}
据我所知,您希望AJAX调用在每个操作中只发生一次,即使该操作包括更改多个复选框。
我已经使用javascript的setTimeout()
来"缓冲"事件。当复选框被更改时,会设置一个短暂的超时,从而触发AJAX。如果在该时间段内更改了另一个复选框,则会重新设置超时(而不是触发AJAX两次)。AJAX只在超时结束时触发一次。
// initialize timer variable
var ajaxtimer;
// function to run AJAX
function runajax() {
alert('ajax');
}
// clicking a checkbox sets all checkboxes to the same state
$("input[type=checkbox]").on('click', function () {
$('input[type=checkbox]').prop('checked', this.checked).change();
});
// fires on checkbox change, sets short timeout
$("input[type=checkbox]").on('change', function () {
clearTimeout(ajaxtimer);
ajaxtimer = setTimeout(runajax, 50);
});
工作示例(jsfiddle)
编辑:
我看到了你发布的链接,并进行了以下调整:
我在文件顶部定义了这个变量:
var ajaxtimer;
在results.js的第156行,我更改了:
doAjax();
至
clearTimeout(ajaxtimer);
ajaxtimer=setTimeout(doAjax,50);
这是一把小提琴。布局被破坏了,但您可以看到,单击"only"链接只会导致一个ajax调用,而不是对每个更改的复选框都进行一次调用。
相关文章:
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- Javascript/jQuery中的并行Ajax调用
- 任何方式使AJAX调用Gmail API,而无需通过JS库
- node.js请求数据事件未在CORS ajax调用中触发
- 如何从ajax调用返回.wrap()元素
- Ajax调用在Firefox中不会自动响应
- AJAX调用中的非法调用
- 使用AJAX调用将GeoJSON数据拉入传单
- 在MVC 4中,对Controller的Ajax调用为空
- Jquery:对返回JSON数据的php脚本的Ajax调用
- 在ajax调用中阻止来自JS对象的函数
- 如何在MVC5中ajax调用的部分视图中引用外部javascript
- 页面加载后的Ajax调用
- 如何使用Ajax调用特定的控制器和操作来重定向用户
- curl和fileget_contents在ajax调用后不起作用
- 在任何AJAX调用之前触发一个javascript函数
- 无法在mvc视图中使用ajax调用获取操作返回的模型对象列表
- Ajax调用ERror Cross Origin REquest:在rails中自动完成大学列表
- ASP.NET MVC 3-在ajax调用后,重定向到新页面或生成页面刷新
- 点击功能没有'ajax调用动态元素(Backbone)后无法工作