1

我的自动完成功能不起作用,我已经提醒来自 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 不是一个数组,因为当我们执行 alert(arr) 时,javascript 中的普通数组会显示其所有元素,但它显示的是 [Object object]。

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

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

4

4 回答 4

1

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

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

        });

你这样做的方式,构造函数将在你的请求发送后立即被调用(在响应到达并且你的数组被填充之前),所以自动完成将用一个空数组初始化。

于 2013-10-07T22:44:23.883 回答
1

您的回复中得到了一个object,但您需要一个array自动完成功能才能工作。如果您可以访问您的后端,则必须在那里修复它,否则,您必须迭代 AJAX 的返回值并尝试将对象转换为数组。


Javascript 不理解 PHPassociative数组的概念,并且由于 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
于 2013-10-07T23:13:58.433 回答
0

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

$(document).ready(function(){
    var arr=[];
    $.ajax({
        type:'POST',
        url:'showtags.php',
        success:function(res)
        {
            arr = $.parseJSON( res );
            $('#tags').autocomplete({
                source:arr
            });
        }
    });
});
于 2013-10-07T22:44:15.770 回答
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
        });
    });
于 2013-10-07T23:16:59.297 回答