Javascript Jquery自动完成不工作

Javascript Jquery自动完成不工作,javascript,jquery,ajax,jquery-ui,jquery-ui-autocomplete,Javascript,Jquery,Ajax,Jquery Ui,Jquery Ui Autocomplete,我的autocomplete不工作,我已经从ajax发出了响应,它是json <script src="../jquery.js" type="text/javascript"></script> <link href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" rel="stylesheet" type="text/css" /> <script

我的autocomplete不工作,我已经从ajax发出了响应,它是json

 <script src="../jquery.js" type="text/javascript"></script>
    <link href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" rel="stylesheet" type="text/css" />
    <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js" type="text/javascript">
    </script>
 $(document).ready(function(){
            var arr=[];
            $.ajax({
               type:'POST',
               url:'showtags.php',
               success:function(res)
               {
                  arr = $.parseJSON( res );
                  $('#tags').autocomplete({
                     source:arr
                  });
               }
            });

        });

$(文档).ready(函数(){
var-arr=[];
$.ajax({
类型:'POST',
url:'showtags.php',
成功:功能(res)
{
arr=$.parseJSON(res);
$(“#标记”)。自动完成({
资料来源:arr
});
}
});
});
我还发现arr不是一个数组,因为javascript中的普通数组在我们发出警报(arr)时显示了它的所有元素,但它表示[Object]

res变量是={“1”:“hello”,“72”:“call you”,“73”:“this is me”}


arr变量是=object{1=“hello”,72=“call you”,73=“this is me”}

您必须将autocomplete的构造函数放在ajax调用之后。
像这样:

$(document).ready(function(){
    var arr=[];
    $.ajax({
        type:'POST',
        url:'showtags.php',
        success:function(res)
        {
            arr = $.parseJSON( res );
            $('#tags').autocomplete({
                source:arr
            });
        }
    });
});

您必须在ajax调用的成功处理程序中调用autocomplete的构造函数,如下所示:

 $(document).ready(function(){
            var arr=[];
            $.ajax({
               type:'POST',
               url:'showtags.php',
               success:function(res)
               {
                  arr = $.parseJSON( res );
                  $('#tags').autocomplete({
                         source:arr
                   });
               }
            });

        });

按照您的方式,在发送请求后(在响应到达并填充数组之前),将立即调用构造函数,因此自动完成将使用空数组进行初始化。

您的响应中有一个
对象,但您需要一个
数组才能使AutoMLETE工作。如果可以访问后端,就必须在那里修复它,否则就必须迭代AJAX的返回值并尝试将对象转换为数组

$a = array("1"=>"one", "3"=>"three");
echo json_encode($a)
// {"1":"one", "3"=>"three"}
// doesn't work for jQuery.autocomplete

$b = array(array("id"=>"1", "label"=>"one"), array("id"=>"3","label"=>"three"));
echo json_encode($b);
// [{"id":1, "label":"one"}, {"id":3, "label":"three"}]
// works for jQuery.autocomplete
arr.push.apply(arr, $.parseJSON( res ));

Javascript不理解PHPs
关联
数组的概念,由于JSON是Javascript对象表示法,JSON也不理解它们。当您使用PHPs
json\u encode
时,必须确保您的数组是简单数组(即没有强制数组键),否则您将获得json中的对象而不是数组

$a = array("1"=>"one", "3"=>"three");
echo json_encode($a)
// {"1":"one", "3"=>"three"}
// doesn't work for jQuery.autocomplete

$b = array(array("id"=>"1", "label"=>"one"), array("id"=>"3","label"=>"three"));
echo json_encode($b);
// [{"id":1, "label":"one"}, {"id":3, "label":"three"}]
// works for jQuery.autocomplete
arr.push.apply(arr, $.parseJSON( res ));

您正在经历按值调用(或者至少是javascript使用它的方式)

考虑以下示例:

var arr = [];
var x = {x: arr};
arr = [0,1];
console.log(x.x); // Outputs []
这里发生了什么事?
创建对象
x
时,
arr
的引用按值传递给对象构造函数。因此,
x.x
现在指向我们最初的空数组。
当您现在将
arr
设置为另一个值时,您只需用对新数组的引用覆盖对初始数组的引用。因此,
arr
现在指向包含
[0,1]
的新数组

您可以使用apply解决这个问题(假定res是一个数组)

arr
现在等于
res
(假设arr以前为空)

编辑:因为问题是在我回答之后编辑的。这里是原始代码

$(document).ready(function(){
        var arr=[];
        $.ajax({
           type:'POST',
           url:'showtags.php',
           success:function(res)
           {
              arr = $.parseJSON( res );
           }
        });
        $('#tags').autocomplete({
          source:arr
        });
    });

试试arr.push($parseJSON(res))@johnsmith仍然不工作您知道这是jQuery UI提供的功能,而不是基本的jQuery,对吗?@n.st是的,先生,我知道,我已经添加了jQuery的cdnUI@johnSmith我尝试了arr.push,然后我发出了警报(arr[1]);,它说未定义,为什么?您必须发现在'res'变量中接收到的内容,并在此处发布'res'变量的内容。我在后端有echo(json_encode($array)),其中$array包含$array[$row[“id:][]=$row[“name”];这就是您的问题所在,javascript不能在数组上使用强制键。请尝试以
数组的形式保存对象(数组(“id”=>$row[“id”],“value”=>$row[“name”]),…)
。这样,您的数组是一个简单的数组,在JSON转换时保持为一个数组,而不是转换为对象的“关联”数组。作为旁注,请使用“标签”而不是“值”来实现jquery自动完成。使内容更简单我希望数组类似于$arr[1]=“您好“1和hello将来自数据库,我如何才能做到这一点,我是phpFirst的新手,您应该使用来访问您的数据库。然后,您可以这样做:
$arr=$dbh->query(“select ID,VALUE from table;”)->fetchAll()
我真的不明白这是如何应用于这个问题的。