2013-10-07 2 views
1

Моего автозаполнение не работает, я оповестил ответ от Ajax, это JSONJquery автозаполнение не работает

<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 
        }); 
       } 
      }); 

     }); 

Я также узнал, что аранжировка не является массив, как обычный массив в JavaScript отображается все его элементы, когда мы делаем alert (arr), но он говорит [Объект объекта].

переменная УЭ = { "1": "привет", "72": "позвоню", "73": "это я"}

переменная обр есть = объект {1 = «Привет», 72 = «позвоню», 73 = «это я»}

+0

попробуйте arr.push ($ parseJSON (res)); –

+0

@johnsmith все еще не работает –

+0

Вы знаете, что [автозаполнение] (http://jqueryui.com/autocomplete/) является функцией, предоставляемой jQuery * UI *, а не основным jQuery, правильно? –

ответ

1

Вы получаете object в своем ответе, но вам нужен array для работы автозапуска. если вы можете получить доступ к своему серверу, вы должны исправить его там, иначе вам придется повторять возвращаемое значение AJAX и попытаться преобразовать объект в массив.


Javascript не понимает концепцию ПГПС 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 
+0

У меня есть echo (json_encode ($ array)) в моем бэкенде, где $ array содержит данные как $ array [$ row ["id:]] = $ row [" name "]; –

+0

это ваша проблема прямо здесь, javascript не работает с принудительными ключами на массивах. попытайтесь сохранить свой объект в форме 'array (array (" id "=> $ row [" id "]," value "=> $ row [" name «]), ...). Таким образом, ваш массив является простым массивом и остается массивом при преобразовании JSON, а не« ассоциативным », который преобразуется в объект. – lordvlad

+0

a side note, используйте 'label 'вместо' value 'для jQuery autocomplete. Делает вещи проще – lordvlad

0

вы должны поставить конструктор автозаполнения после вызова Ajax.
Как это:

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

Я отредактировал последнюю строку вопроса, пожалуйста, посмотрите на нее. – bhawin

+0

вам нужно узнать, что вы получаете в переменной res, и размещать здесь содержимое переменной res. –

+0

Я отредактировал мой вопрос – bhawin

1

Вы должны вызвать конструктор автозаполнения в обработчике успеха вашего AJAX вызова, например:

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

     }); 

, как вы делаете это, конструктор будет вызывается сразу после отправки вашего запроса (до того, как будет получен ответ, и ваш массив будет заполнен), поэтому автозаполнение будет инициализировано пустым массивом.

0

Вы испытываете вызов по значению (или, по крайней мере, так, как он используется javascript).

Рассмотрим следующий пример:

var arr = []; 
var x = {x: arr}; 
arr = [0,1]; 
console.log(x.x); // Outputs [] 

Что здесь происходит?
При создании объекта x ссылка на arr передается вызов по значению конструктору объекта. Итак, x.x теперь указывает на наш начальный пустой массив.
Теперь, когда Вы установите arr другое значение вы просто перезаписать нашу ссылку на наш первоначальный массив со ссылкой на новый массив. Итак, arr теперь указывает на наш новый массив, содержащий [0,1].

Вы могли бы решить эту проблему с помощью применить (при условии, что УЭ массив).

arr.push.apply(arr, $.parseJSON(res)); 

arr Теперь равна res (при условии, что аранжировка была пуста раньше)

EDIT: Поскольку вопрос был отредактирован, так как мой ответ. Вот исходный код.

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

Я действительно не понимаю, как это относится к вопросу. – lordvlad

Смежные вопросы