JavaScript全局不保留作用域?创建自动完成webservice json对象

JavaScript全局不保留作用域?创建自动完成webservice json对象,javascript,jquery,json,web-services,Javascript,Jquery,Json,Web Services,您好,我正在尝试自动完成一个城市列表,但是返回的json对象的格式不适合在自动完成中使用,它需要一个名为“label”:“cityname”的字段来显示自动完成,因此我尝试使用ajax调用重新格式化json对象并将其写入全局变量,问题是一旦ajax调用返回,我的jsData[]是一个空数组。。。我做错了什么?为什么全局变量不保留一个值 $(“nec”).bind(“pageshow”,函数(e){ var jsData=[]; $.ajax({ url:“http://localhost:8

您好,我正在尝试自动完成一个城市列表,但是返回的json对象的格式不适合在自动完成中使用,它需要一个名为“label”:“cityname”的字段来显示自动完成,因此我尝试使用ajax调用重新格式化json对象并将其写入全局变量,问题是一旦ajax调用返回,我的jsData[]是一个空数组。。。我做错了什么?为什么全局变量不保留一个值


$(“nec”).bind(“pageshow”,函数(e){
var jsData=[];
$.ajax({
url:“http://localhost:8084/REST/resources/cities",
数据:{},
键入:“GET”,
跨域:是的,
数据类型:“jsonp”,
jsonp:'jsonp',
JSONPCCallback:'jsoncallback',
错误:函数(错误){
console.log(错误);
},
成功:功能(结果){
对于(i=0;i

我对JS有点陌生,所以有一些事情我还没有掌握

问题是,
jsData
不是全局的,而是在匿名函数中

    var jsData = [];   // make that here.

    $("#nec").bind("pageshow", function(e) {

        $.ajax({
               url: "http://localhost:8084/REST/resources/cities",
               data:{},
               type: 'GET',
               crossDomain: true,
               dataType: 'jsonp',
               jsonp: 'jsonp',
               jsonpCallback: 'jsoncallback',
               error: function(error){
                   console.log(error);
               },
               success: function(result) {
                   for (i = 0; i < result.length; i++){
                         jsData.push({label:result[i].name, value:result[i]}); 
                    }
                    console.log(JSON.stringify(jsData));   
                   },
            });

        $("#textinput").autocomplete({
            target: $('#suggestions'),
            source: jsData,
            minLength: 1
        });
var jsData=[];//在这里做。
$(“nec”).bind(“pageshow”,函数(e){
$.ajax({
url:“http://localhost:8084/REST/resources/cities",
数据:{},
键入:“GET”,
跨域:是的,
数据类型:“jsonp”,
jsonp:'jsonp',
JSONPCCallback:'jsoncallback',
错误:函数(错误){
console.log(错误);
},
成功:功能(结果){
对于(i=0;i
虽然,我不建议使用全局变量。但是,如果它对您有效,这是您的愿望。

您必须将

 $("#textinput").autocomplete({
     target: $('#suggestions'),
     source: jsData,
     minLength: 1
 });
success()函数中

    var jsData = [];   // make that here.

    $("#nec").bind("pageshow", function(e) {

        $.ajax({
               url: "http://localhost:8084/REST/resources/cities",
               data:{},
               type: 'GET',
               crossDomain: true,
               dataType: 'jsonp',
               jsonp: 'jsonp',
               jsonpCallback: 'jsoncallback',
               error: function(error){
                   console.log(error);
               },
               success: function(result) {
                   for (i = 0; i < result.length; i++){
                         jsData.push({label:result[i].name, value:result[i]}); 
                    }
                    console.log(JSON.stringify(jsData));   
                   },
            });

        $("#textinput").autocomplete({
            target: $('#suggestions'),
            source: jsData,
            minLength: 1
        });
因为,
jsData
success()
中变为update。执行
pageshow
事件的匿名函数比执行
success()
要快。因此,在该函数中,
jsData
保持为空


您可以通过自动完成本身检索数据。

我也尝试过,复制粘贴实际上是我第十次尝试使其工作。这导致jsDAta为[]同样的。嗯,我实际上又试了一次,这次成功了,所以它似乎有一个不一致的行为…嗯…我会尝试一下,我实际上试着做相反的事情,将ajax调用添加到source:的autocomplete作为回调,但没有成功。有没有更简单的解决方案来获取json对象并格式化它?这是一个巨大的问题f代码来完成这样一个简单的任务。@thecodeparadox不幸的是,它不是同一个自动完成。这个自动完成是针对jquery mobile的,作为最后的手段,我可能会使用jquery ui,但我不想仅仅为了自动完成而将jQ ui添加到项目中。