Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 通过ajax请求加载JSON时,如何停止锁定浏览器?_Jquery_Ajax_Json - Fatal编程技术网

Jquery 通过ajax请求加载JSON时,如何停止锁定浏览器?

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){ $('#

我遇到了一个问题,导致下拉列表和浏览器锁定,直到ajax请求得到满足。我知道JSON Ajax请求的ASYNC应该设置为False,因此如果有人能帮助我修改代码,以防止在收到Ajax请求之前锁定下拉列表和页面,我将不胜感激

您可以在这里查看:


我加了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()
,并将回调函数传递给该函数。更改了我的代码以演示如何在这种情况下执行此操作。