PHP массив вытащить в JS
Всем доброго!
Скажите пожалуйста, как реализовать такую схему и возможно ли это? Есть массив <? $model = array ( 'Honda'=>array('Accord', 'Accord Inspire', 'Acty', 'Acty Truck'), 'Mazda'=>array('Atenza', 'Autozam', 'AZ-3','Autozam Revue','Axela'), 'Nissan'=>array('AD', 'Almera', 'Almera Classic'), ); ?> Далее скрипт и форма <script> function loadCar(v){ var mas = eval(<?=json_encode($model["Honda"])?>); var el = document.getElementById('names'); while(el.childNodes.length>0){ el.removeChild(el.childNodes[el.childNodes.length-1]); } for(var i=0;i<mas.length;i++){ var opt = document.createElement("option"); opt.innerHTML=mas[i]; el.appendChild(opt); } } </script> <form> <select id="f_MarkaModel" name="f_MarkaModel" onchange="loadCar(this.value)"> <? foreach ($model as $brand => $carList) { echo '<option onchange="loadModel('.$brand.')" value="' . $brand . '">' . $brand . '</option>' . "\n"; } ?> </select> <select id="names"> <option>Выберите модель</option> </select> </form> Собственно вопрос в том, как мне получить не список hond а то, что появляется в (v) после смены селектора. |
Я так понял, это надо?
<script> function loadCar(v){ alert(v); } </script> <form> <select id="f_MarkaModel" name="f_MarkaModel" onchange="loadCar(this.value)"> <option value="kill">kill</option> <option value="all">all</option> <option value="humans">humans</option> </select> </form> |
Цитата:
Поскольку нет value у опшинов, то и получить там можно только индекс, который в общем и будет совпадать с индексом элемента массива. |
Нашел на js, принцип такой: вопрос - ответ, сервер выдает список с id. По id как есть все валится в объект, типа кэша, если юзер еще раз такой же выбор сделает, ну сидит тычет пагу, то скрипт проверяет есть такой id и, если есть - сервер не трогает, берет из свалки, иначе вопрос - ответ - в свалку. В финале рендер
var pop_filters = function(id) { var filters = JSON.parse(raw_filters[id]); // clear data list while (filter_datalist.lastChild) filter_datalist.removeChild(filter_datalist.lastChild); for(var i in filters) { var op = document.createElement('option'); op.value = filters[i]; op = filter_datalist.appendChild(op); op.appendChild(document.createTextNode(filters[i])); } }; |
filter_datalist - datalist, который тут ничем от select не отличается.
Ну вот, по тексту функции значение записывается одновременно в валуе и в текст. |
Вообще-то вопрос был не по коду. В том виде, в котором он написан - он работает. Выводит массив хонда, но при смене марки авто, когда alert(v); показывает Mazda или Nissan он не сработает так, ибо php уже не работает... тут надо ajax использовать или как-то еще... хм... но я не знаю как это реализовать, вот и прошу помощи.
|
idontknow, подожди, у тебя внутри функции loadCar(v) есть переменная v, в которой у тебя value из <option>($brand).
зачем тебе лишний запрос к серверу, если на клиенте все данные уже есть? Или что тебе надо вернуть? Уточни вопрос. |
угу, есть! :) но массив у меня в php
<?=json_encode($model["Honda"])?> как вместо "Honda" я поставлю loadCar(v) ? В этом-то и есть вопрос собственно |
idontknow, ах вот оно чо))
ну.. логика такая: вот тут смотри, как использовать XHR. Отправляешь пыхе эту v, на той стороне уже пыхой смотришь, что пришло и возвращаешь (прямо вот <?=json_encode($model[то, что пришло (v) ])?>), но только смотри, чтобы ничего лишнего не вернулось) и на этой стороне кидаешь то, что вернулось в переменную mas.. |
спасибо за совет. я тут и сам уже в эту сторону смотрю и пытаюсь это сделать, но пока не получается. методов кучу перепробовал... вот и думал, что кто-то может знает как это по шагам сделать. Потому как не получается у меня вернуть ничего.
Буду дальше пробовать, но люди добрые, может кто-то знает как это реализовать с лёту? Буду премного благодарен. пока же читаю, смотрю и пробую методом работает/неработает кучу примеров |
если не собираешься вникать, можно вот это использовать
|
$.ajax({ type : 'POST', url: 'путь к пхп файлу', data: { ind: v }, success: function(data){ var options = JSON.parse(data); for (var i = 0, i < options.length){ //создаем <option>, кидаем в нужный селект } } }) а на пыхе <? $model = array ( 'Honda'=>array('Accord', 'Accord Inspire', 'Acty', 'Acty Truck'), 'Mazda'=>array('Atenza', 'Autozam', 'AZ-3','Autozam Revue','Axela'), 'Nissan'=>array('AD', 'Almera', 'Almera Classic'), ); echo json_encode($model[$_REQUEST['ind']]); ?> ну или около того |
собираюсь вникать! не сегодня, так позже пригодится
|
idontknow, тогда рабочие примеры кидай и жалуйся, что именно не работает))
|
вставил код и не получается, ошибка:
Uncaught ReferenceError: loadCar is not defined onchange |
idontknow, какой код вставил?))
если тот, с $.ajax, то тут надо jQuery подключать)) а ты же собрался вникать)) |
jQuery подключена уже.
да собрался вникать, код удалил с $.ajax с чего начать? |
Цитата:
|
ну опять так же, как и в остальных случаях ((( вставил код
Асинхронный XMLHttpRequest function loadCar(v){ var xmlhttp = getXmlHttp() xmlhttp.open('GET', '/car.php', true); if (xmlhttp.readyState == 4) { if(xmlhttp.status == 200) { alert(xmlhttp.responseText); } }; xmlhttp.send(null); .... ... Ошибка - Uncaught ReferenceError: getXmlHttp is not defined loadCar onchange |
getXmlHttp() надо же объявить сначала, вставь ранее вот это:
function getXmlHttp(){ var xmlhttp; try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } } if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest(); } return xmlhttp; } |
О! Спасибо!
Теперь состояние readyState такое: 1 - Loading И больше ничего... это норм? |
idontknow, неа, не норм)
в car.php что написал?) |
да ничего просто эхо бла бла бла.
если напрямую файл открываю то и выходит всё ок. ((((((((((( вот что там лежит <? echo 'ddddddddddddddd!!!'; ?> |
а покажи полностью функцию loadCar()
|
попробовал синхронный - работает!!! круть! странное дело, а в чем дело? )))))))))))))
|
вот полностью
var xmlhttp = getXmlHttp() xmlhttp.open('GET', '/car.php', false); xmlhttp.send(null); if(xmlhttp.status == 200) { alert(xmlhttp.responseText); } alert(xmlhttp.status); var mas = eval(v); var el = document.getElementById('names'); while(el.childNodes.length>0){ el.removeChild(el.childNodes[el.childNodes.length-1]); } for(var i=0;i<mas.length;i++){ var opt = document.createElement("option"); opt.innerHTML=mas[i]; el.appendChild(opt); } } |
idontknow, Синхронные запросы применяются только в крайнем случае, когда кровь из носу необходимо дождаться ответа сервера до продолжения скрипта. В 999 случаях из 1000 можно использовать асинхронные запросы. © тот же ман, на который я тебе ссылку уже давал..
про onreadystatechange там же почитай и сделай асинхронно)) |
я это видел, поэтому и делал асинхронный. но он не пашет! как узнать почему?
|
idontknow, посмотри еще раз полностью код своей функции, там нету свойства onreadystatechange
|
сделал, с синхронным, с асинхронным не могу разобраться. вообще уже не могу въехать, куда мне надо это свойство вставить?
|
Да это неоперабельно. Задача - баян, в каком-нить w3school наверняка есть готовый пример, а у него, типа, не получается.
|
Цитата:
сервер сделал страницу страница захотела строку #1 сервер выдал строку страница добавила себе строку захотела еще - посмотрела - а была такая? если была - взяла у себя если не было - попросила сервер сервер выдал строку гоуту #1 НЕ функция подгоняется к данным, а данные подгоняются к функции. Функция есть, а данных может не быть вообще. КОгда появятся - она зохавает и сделает что-то полезное. |
Цитата:
|
Viral, Спасибо огромное за помощь!!! Асинхронный в следующий раз разбирать буду. :)
|
Цитата:
Цитата:
Тут и не полмиллиона, но около 6к не думаю, что на страницу это всё вливать есть смысл, и работать потом с этим массивом неудобно будет. Всё сделано, так что ГУД! |
Не забудьте
document.body.style.cursor = "wait"; |
интересная штука ))) но она в полях инпута почему-то курсор не меняет. вне пределов поля - работает.
|
Часовой пояс GMT +3, время: 20:09. |