Jquery 通过ajax请求加载JSON时,如何停止锁定浏览器?
我遇到了一个问题,导致下拉列表和浏览器锁定,直到ajax请求得到满足。我知道JSON Ajax请求的ASYNC应该设置为False,因此如果有人能帮助我修改代码,以防止在收到Ajax请求之前锁定下拉列表和页面,我将不胜感激 您可以在这里查看:Jquery 通过ajax请求加载JSON时,如何停止锁定浏览器?,jquery,ajax,json,Jquery,Ajax,Json,我遇到了一个问题,导致下拉列表和浏览器锁定,直到ajax请求得到满足。我知道JSON Ajax请求的ASYNC应该设置为False,因此如果有人能帮助我修改代码,以防止在收到Ajax请求之前锁定下拉列表和页面,我将不胜感激 您可以在这里查看: 我加了5秒。休眠到data.php文件以使问题更加明显。让我建议一种不同的方法 $.get(url, function(res){ data = JSON.parse(res); $(data).each(function(k,v){ $('#
我加了5秒。休眠到data.php文件以使问题更加明显。让我建议一种不同的方法
$.get(url, function(res){
data = JSON.parse(res);
$(data).each(function(k,v){
$('#makes').append( html )
}
}
异步AJAX出现错误的原因是函数立即返回,这远远早于从服务器获得响应。因此,您正在对垃圾数据调用
JSON.parse()
,这导致了您看到的错误
解决方案是在从服务器获得响应后进行解析:
if(year !=""){
//Get vehicle json and store into vehicles_json
getJson(
js_base_url,
function(makes_json) {
//Set makes equal to makes dropdown
var makes = $("#make");
//empty dropdown
makes.empty();
var makes_array = [];
//loop through makes_json json
$.each(makes_json, function() {
makes_array.push('<option value="', this.model_make_display, '">', this.model_make_display, '</option>');
});
makes.html(makes_array.join(''));
}
);
}
function getJson(url, callBack) {
$.ajax({
type: 'GET',
url: url,
dataType: 'json',
global: false,
success: function(json_response) {
callBack(json_response);
}
});
}
if(年份!=“”){
//获取车辆json并存储到车辆中
getJson(
js_base_url,
函数(makes_json){
//设置使等于使下拉列表
var make=$(“#make”);
//空下拉列表
使…为空();
var使_数组=[];
//通过循环生成json
$.each(生成_json,函数(){
生成数组.push(“”,this.model_生成显示“”);
});
html(makes_array.join(“”));
}
);
}
函数getJson(url,回调){
$.ajax({
键入:“GET”,
url:url,
数据类型:“json”,
全球:错,
成功:函数(json_响应){
回调(json_响应);
}
});
}
我决定使用jQuery$.getJSON,它在不锁定浏览器的情况下工作
$.getJSON( "test.php", function( json ) {
console.log( "JSON Data: " + json);
});
为什么必须将其设置为false?事实上,jQuery的这个特性已经被弃用了:如果我将它设置为true,我会得到这样一条消息:Uncaught SyntaxError:Unexpected token u这里是同一个页面,Async设置为true@music\u coder根据站点,
Async:false
只有在使用jqXHR的延迟API时才被弃用。如果您使用的是旧的回调而不是promise,那么您可以继续在jQuery中使用同步AJAX。@JoeEnos:很有趣,谢谢您指出这一点。但我认为,除非同步对于它的工作来说是绝对必要的,否则始终使用异步是很好的。正如我下面的回答所示,在这种情况下是不正确的。@music_coder我100%同意-我从来没有找到一个真正需要同步的场景。有时同步更容易编写,但简单并不总是更好。这是可行的,但这样我就必须为每个函数创建一个看起来不太好的函数。有没有办法返回数组而不是在函数本身中循环?没有,因为正如我上面所说的,在收到服务器的响应之前,不能从函数返回。不知道你说的“不好看”是什么意思;您的意思是不想重复ajax()
调用吗?在这种情况下,将其设置为只从单个函数调用ajax()
,并将回调函数传递给该函数。更改了我的代码以演示如何在这种情况下执行此操作。