JQuery JSON цикл данных - просто не могу понять это - PullRequest
1 голос
/ 07 ноября 2010

У меня есть кнопка на pge, которая извлекает данные json со страницы php,

данные, кажется, приходят нормально, но я просмотрел сотни примеров, и я просто не могу ссылаться на возвращенные данные, вот мой сценарий:

отредактированный сценарий из предыдущих комментариев

 $('#geo_batch').click(function (){
            var ajax_load = "<label><img src='/images/icons/loadinfo.gif' alt='saving location...' /> Loading data...</label>";
            $("#batch_detail").html(ajax_load);
            $('#batch_buttons').hide();
            var form = $("form"); //Grab the form element from the DOM 
            //alert(form.serialize());
            var mydata = form.serialize();
            $.ajax({  
                type: "POST",  
                url: 'geo_getupdate_list.php', 
                data: mydata,  
                datatype: 'json',
                success: function(dat) {
                    alert('dat:'+ typeof dat ) //RETURNS STRING
                    //alert(dat.location[0].id_mdt); //RETURNS UNDEFINED
                    // Cache the batch_detail element
                    var $detail = $("#batch_detail").html('<label>Locations have been retrieved:<br>' + dat + '<label>');
                    $('#batch_buttons').show();
                    // Instead of several .append() calls on the same element, create a 
                    //   single string, and do one.
                    var appendString = '';
                    for(var key in dat) { alert(key); return false; };
                    /*for(i=0; i < count; i++){
                        appendString += 'display address: ' + data.location[i].displayaddr_mdt + 'flag: ' + data.location[i].flag_mdt;
                    }*/
                    $detail.append(appendString);
                }, 
                error: function(dat) { //Triggered if an error communicating with server   
                     //alert('fail');
                     $("#batch_detail").html('<label>There was an error: '+dat+'<label>');  
                     $('#batch_buttons').show();
                }
            });  
            return false; //Ignore the default behavior of the button click  
        }); 

json, который возвращается:

{"location":[{"id_mdt":"5","idetp_mdt":"1","name_mdt":null,"geoaddr_mdt":null,"displayaddr_mdt":"31a Arundel Gardens London W11 2LW","telephone_mdt":null,"email_mdt":null,"website_mdt":"http:\/\/","lat_mdt":"51.513561","lng_mdt":"-0.206519","active_mdt":"1","flag_mdt":"1","id_etp":"1","name_etp":"Stockist","icon_etp":null},{"id_mdt":"1","idetp_mdt":"1","name_mdt":null,"geoaddr_mdt":null,"displayaddr_mdt":"via todde 29 Ales Sardegna 09091","telephone_mdt":null,"email_mdt":null,"website_mdt":"http:\/\/","lat_mdt":"39.7670964","lng_mdt":"8.813689","active_mdt":"1","flag_mdt":"1","id_etp":"1","name_etp":"Stockist","icon_etp":null},{"id_mdt":"4","idetp_mdt":"1","name_mdt":null,"geoaddr_mdt":null,"displayaddr_mdt":"31a Arundel Gardens London W11 2LW","telephone_mdt":null,"email_mdt":null,"website_mdt":"http:\/\/","lat_mdt":"51.513561","lng_mdt":"-0.206519","active_mdt":"1","flag_mdt":"1","id_etp":"1","name_etp":"Stockist","icon_etp":null},{"id_mdt":"3","idetp_mdt":"1","name_mdt":null,"geoaddr_mdt":null,"displayaddr_mdt":"31a Arundel Gardens London W11 2LW","telephone_mdt":null,"email_mdt":null,"website_mdt":"http:\/\/","lat_mdt":"51.513561","lng_mdt":"-0.206519","active_mdt":"1","flag_mdt":"1","id_etp":"1","name_etp":"Stockist","icon_etp":null},{"id_mdt":"6","idetp_mdt":"1","name_mdt":null,"geoaddr_mdt":null,"displayaddr_mdt":"31a Arundel Gardens London W11 2LW","telephone_mdt":null,"email_mdt":null,"website_mdt":null,"lat_mdt":"51.513561","lng_mdt":"-0.206519","active_mdt":"1","flag_mdt":"1","id_etp":"1","name_etp":"Stockist","icon_etp":null},{"id_mdt":"7","idetp_mdt":"1","name_mdt":"Test","geoaddr_mdt":null,"displayaddr_mdt":"31a Arundel Gardens London W11 2LW","telephone_mdt":null,"email_mdt":null,"website_mdt":null,"lat_mdt":"51.513561","lng_mdt":"-0.206519","active_mdt":"1","flag_mdt":"1","id_etp":"1","name_etp":"Stockist","icon_etp":null}]}

как получить доступ к данным в массиве?

Я пробовал так много примеров здесь и в других местах, и я не могу заставить их работать. Я думаю, что это может быть связано с возвращенным объектом json, в котором есть [символы, которые я считаю неправильными?

PHP, который я должен создать JSON, выглядит следующим образом:

//have defined a recordset called $rs_locations
$rows = array();
while($r = mysql_fetch_assoc($rs_locations)) {
    $rows[] = $r;
}
$jsondata = json_encode($rows);
// trying to strip out the [ ] brackets but doesn't work
str_replace ("[", "", $jsondata);
str_replace ("]", "", $jsondata);
echo($jsondata);

Любые идеи, кто-нибудь, я так застрял, спасибо

Ответы [ 2 ]

3 голосов
/ 07 ноября 2010

РЕДАКТИРОВАТЬ: Ваше свойство dataType неправильно написано.

Это должно быть dataType, а не datatype.

Также попробуйте изменить параметр data на другое имя, например dat. Я видел проблемы с этим раньше, когда ваш $.ajax() вызов установил свойство data.

success: function( dat ) {
   // Then change all references from data to dat

Попробуйте сделать это для своего success: обратного вызова.

Вы выбирали один и тот же элемент #batch_detail несколько раз и непрерывно вызывали .append() для этого элемента.

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

Конкретная проблема, с которой вы столкнулись, заключалась в том, что вам нужно было ссылаться на массив, хранящийся в data.location напрямую.

 success: function(dat) {
     // Cache the batch_detail element
     var $detail = $("#batch_detail").html('<label>Locations have been retrieved:<br>' + dat + '<label>');
     $('#batch_buttons').show();
     var count = dat.location.length - 1;
       // Instead of several .append() calls on the same element, create a 
       //   single string, and do one.
     var appendString = '';
     for(i=0; i < count; i++){
         appendString += 'display address: ' + dat.location[i].displayaddr_mdt + 'flag: ' + dat.location[i].flag_mdt;
     }
     $detail.append( appendString );
 }, 
0 голосов
/ 07 ноября 2010

Если я правильно понял ваш сценарий, вы должны сначала получить массив location из data:

var locations = data.location;
for(var location in locations) {
    console.debug(locations[location]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...