Jquery自动完成无法正常工作

时间:2013-10-07 22:24:53

标签: javascript jquery ajax jquery-ui jquery-ui-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
                  });
               }
            });

        });

我还发现arr不是一个数组,因为当我们做警报(arr)时,javascript中显示所有元素的正常数组,但是它表示[Object object]。

res变量是= {“1”:“你好”,“72”:“打电话给你”,“73”:“这是我”}

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

4 个答案:

答案 0 :(得分:1)

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

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

        });

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

答案 1 :(得分:1)

您的回复中有object,但您需要array才能使用自动转播功能。如果你可以访问你的后端,你必须在那里修复它,否则,你必须迭代你的AJAX'返回值并尝试将对象转换为数组。


Javascript不理解PHP associative数组的概念,而JSON是JAVASCRIPT对象表示法,JSON也不理解它们。当你使用PHP json_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

答案 2 :(得分:0)

你必须在ajax调用之后放置自动完成的构造函数 像这样:

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

答案 3 :(得分:0)

您正在体验按值调用(或者至少是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.push.apply(arr, $.parseJSON( 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
        });
    });