У меня есть php-страница, которая включает в себя следующий javascript:
<script> $(document).ready(function(){ $('#search').hide(); }); $('#L1Locations').live('change',function(){ var htmlstring; $selectedvalue = $('#L1Locations').val(); $.ajax({ url:"<?php echo site_url('switches/getbuildings/');?>" + "/" + $selectedvalue, type:'GET', dataType:'json', success: function(returnDataFromController) { alert('success'); var htmlstring; htmlstring="<select name='L2Locations' id='L2Locations'>"; htmlstring = htmlstring + "<option value='all'>All</option>"; console.log(returnDataFromController); var JSONdata=[returnDataFromController]; alert('string length is' + JSONdata.length); if(JSONdata.length > 0) { for(var i=0;i<JSONdata.length;i++){ var obj = JSONdata[i]; for(var key in obj){ var locationkey = key; var locationname = obj[key]; htmlstring = htmlstring + "<option value='" + locationkey + "'>" + locationname + "</option>"; } } $('#l2locations').html(htmlstring); } else { alert('i think undefined'); $('#l2locations').html(''); } } }); $('#search').show(); }); </script>
то, что я пытаюсь выполнить, динамически показывает поле со списком, если переменная «returnDataFromController» имеет какие-либо элементы.
Но я думаю, что у меня есть ошибка с строкой, которая проверяет JSONdata.length.
Независимо от того, возвращает или нет вызов ajax заполненным массивом или пустым, длина всегда показывает наличие 1. Я думаю, что я смущен относительно того, что подсчитано, когда вы запрашиваете длину. Или, может быть, мое свойство dataType неверно? Я не уверен.
В случае, если это вам поможет, строка «console.log (returnDataFromController)» дает следующие результаты, когда я получаю данные обратно из вызова ajax (и, следовательно, когда комбо должно быть создано)
[16:28:09.904] ({'2.5':"Admin1", '2.10':"Admin2"}) @ http://myserver/myapp/index.php/mycontroller/getbranches:98
В этом случае поле со списком отображается с правильным содержимым.
Но в сценарии, где я возвращаю пустой массив, также создается поле со списком. Вот что выгружает консоль.log:
[16:26:23.422] [] @ http://myserver/myapp/index.php/mycontroller/getbranches:98
Можете ли вы сказать мне, где я ошибаюсь?
РЕДАКТИРОВАТЬ:
Я понимаю, что я рассматриваю данные о возврате как объект – я думаю, что это то, что я хочу, потому что я возвращаю массив. Наверное, мне нужно знать, как правильно проверять длину массива в javascript. Я думал, что это просто.
Благодарю.
РЕДАКТИРОВАТЬ 2: Может быть, мне нужно просто перебрать результаты моего контроллера? Вместо того, чтобы возвращать пустой массив, я должен вернуть false или NULL?
if (isset($buildingforbranch)) { echo json_encode($buildingforbranch); } else { echo json_encode(false); }
ИЗМЕНИТЬ 3:
На основании сообщения, найденного в Parse JSON в JavaScript? , Я изменил код в разделе «Успех» вызова ajax, чтобы выглядеть так:
success: function(returnDataFromController) { var htmlstring; htmlstring="<select name='L2Locations' id='L2Locations'>"; htmlstring = htmlstring + "<option value='all'>All</option>"; console.log(returnDataFromController); var JSONdata=returnDataFromController, obj = JSON && JSON.parse(JSONdata) || $.parseJSON(JSONdata); alert(obj); }
Но я получаю сообщение об ошибке на
[18:34:52.826] SyntaxError: JSON.parse: unexpected character @ http://myserver/myapp/index.php/controller/getbranches:102
Строка 102:
obj = JSON && JSON.parse(JSONdata) || $.parseJSON(JSONdata);