Не срабатывает возврат значения из функции
<div id="controls">***</div> <select id="mapping_select_type"> <option> Вид карты </ option> <option value = "HYBRID"> • гибридная карта </option> <option value = "ROADMAP"> • дорожная карта </option> <option value = "SATELLITE"> • спутниковая карта </option> <option value = "TERRAIN"> • физическая карта </option> </select> $(function() { var mapping_page = 'mapping'; var mapping_divs = '#' + mapping_page; var mapping_name = mapping_divs + '_'; var m_type = new Array ('HYBRID', 'ROADMAP', 'SATELLITE', 'TERRAIN'); var mapping_arr = {'mtype':''}; function SelectMaps() { // SelectMaps (); global ; var selector_id = mapping_name + 'select_type'; $( selector_id ).change( function() { mapping_arr['mtype'] = $( selector_id + ' option:selected' ).val(); return mapping_arr; }); } SelectMaps (); $( '#controls' ).html( 'mapping_arr1: ' + JSON.stringify(SelectMaps) ); $( '#controls' ).append( '<br />mapping_arr2: ' + JSON.stringify(mapping_arr) ); }) Необходимо вывести результат выбора из списка. Сам результат позже будет обработан в другом месте. На данном этапе получаемый результат не радует: Код:
mapping_arr1: undefined |
Цитата:
|
Цитата:
|
Ну нет, в РНР такого аналога нет и быть не может.
Ваша функция, это: 1) определить обработчик события onchange спиcку 2) выход Она не ждет когда состояние списка изменится, а объект будет заполнен значением только по изменению в списке. А вот возврат в обработчике в никуда. var mapping_arr = {'mtype':''}; $('select').change( function() { mapping_arr.mtype = this.value; }); //генерировать событие $('select').trigger('change'); //теперь будет заполнено alert(JSON.stringify(mapping_arr)) |
Цитата:
по данному примеру: отказался от функции как таковой. проверил на JsFiddle Ваш код, к сожалению он тоже не срабатывает: $(function() { var mapping_page = 'mapping'; var mapping_divs = '#' + mapping_page; var mapping_name = mapping_divs + '_'; var mapping_arr = {'mtype':''}; $('select').change( function() { mapping_arr.mtype = this.value; }); //генерировать событие $('select').trigger('change'); //теперь будет заполнено $('#controls').html('mapping_arr: ' + JSON.stringify(mapping_arr)); }), но воз и ныне по прежнему адресу. что не так понять не могу... |
Цитата:
Цитата:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script> $(function() { var mapping_arr = {'mtype':''}; $('select').change( function() { mapping_arr.mtype = this.value; }).trigger('change'); alert(JSON.stringify(mapping_arr)) }) </script> <select id="mapping_select_type"> <option value="2">222</option> <option value="3">333</option> </select> И если так: $('#mapping_select_type'), то тоже будет работать. Что именно не работает? PS. К именам свойств объекта не являющихся числами, можно обращаться так: object_name.proprty_name. А к числовым только так: object_name[proprty_name]. |
Цитата:
|
Цитата:
То что я написал, это генерация события у списка, а значит и запуск обработчика. Но обработчик не изменяет состояние списка, а значит в объект будет помещено значение выбранной по умолчанию опции - первой. А вот когда пользователь сделает выбор, в массив попадет уже значение выбранной им опции. |
Цитата:
|
<div id="controls">***</div> <select id="mapping_select_type"> <option> Вид карты </ option> <option value="HYBRID"> • гибридная карта </option> <option value="ROADMAP"> • дорожная карта </option> <option value="SATELLITE"> • спутниковая карта </option> <option value="TERRAIN"> • физическая карта </option> </select> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script> $(function() { var mapping_page = 'mapping'; var mapping_divs = '#' + mapping_page; var mapping_name = mapping_divs + '_'; var mapping_arr = {}; $(mapping_name + 'select_type').change( function() { mapping_arr = {'mtype':''}; $(mapping_name + 'select_type option:selected').each(function() { mapping_arr.mtype = $(this).val(); }); return mapping_arr; }).change(); $('#controls').html('mapping_arr: ' + JSON.stringify(mapping_arr)); }) </script>...введение return также не меняет ситуацию. но если вывод результата находится в пределах обработчика все гуд... <div id="controls">***</div> <select id="mapping_select_type"> <option> Вид карты </ option> <option value="HYBRID"> • гибридная карта </option> <option value="ROADMAP"> • дорожная карта </option> <option value="SATELLITE"> • спутниковая карта </option> <option value="TERRAIN"> • физическая карта </option> </select> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script> $(function() { var mapping_page = 'mapping'; var mapping_divs = '#' + mapping_page; var mapping_name = mapping_divs + '_'; var mapping_arr = {}; $(mapping_name + 'select_type').change( function() { mapping_arr = {'mtype':''}; $(mapping_name + 'select_type option:selected').each(function() { mapping_arr.mtype = $(this).val(); }); $('#controls').html('mapping_arr: ' + JSON.stringify(mapping_arr)); return mapping_arr; }).change(); }) </script> |
Цитата:
|
Цитата:
события асинхронные. $('select').change( function() { $('#controls').html(тут вставляем нужное, получая значение выбранной опции как this.value, напрягать JQ по таким пустякам не стоит.) |
Цитата:
<div id="controls">***</div> <select id="mapping_select_type"> <option> Вид карты </ option> <option value="HYBRID"> • гибридная карта </option> <option value="ROADMAP"> • дорожная карта </option> <option value="SATELLITE"> • спутниковая карта </option> <option value="TERRAIN"> • физическая карта </option> </select> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script> $(function() { var mapping_page = 'mapping'; var mapping_divs = '#' + mapping_page; var mapping_name = mapping_divs + '_'; var mapping_arr = {}; $(mapping_name + 'select_type').change( function() { mapping_arr = {'mtype':''}; $(mapping_name + 'select_type option:selected').each(function() { mapping_arr.mtype = $(this).val(); }); return mapping_arr; }).change(); $('#controls').html('mapping_arr: ' + JSON.stringify(mapping_arr)); }) </script> |
$(...).change( function() {
mapping_arr.mtype = this.value; имя_функции_какого_то_основ ного_скрипта(); }) |
Цитата:
<div id="controls">***</div> <select id="mapping_select_type"> <option> Вид карты </ option> <option value="HYBRID"> • гибридная карта </option> <option value="ROADMAP"> • дорожная карта </option> <option value="SATELLITE"> • спутниковая карта </option> <option value="TERRAIN"> • физическая карта </option> </select> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script> $(function() { var mapping_page = 'mapping'; var mapping_divs = '#' + mapping_page; var mapping_name = mapping_divs + '_'; var map_arr = {}; $(mapping_name + 'select_type').change( function() { map_arr = {'mtype':''}; $(mapping_name + 'select_type option:selected').each(function() { map_arr = $(this).val(); }); SelectMap (map_arr); }).change(); function SelectMap(MapArr) { // SelectMaps (MapArr); var mapping_arr = {}; mapping_arr.mtype = MapArr; $('#controls').html('mapping_arr: ' + JSON.stringify(mapping_arr)); } }) </script> |
...похоже что для наполнения массива необходимыми значениями, а их у меня по условиям работы скрипта может быть несколько, необходимо каждое значение передать в эту функцию и там уже причесать к результирующему выводу.
правильно? jsfiddle.net... |
Цитата:
|
Цитата:
|
Цитата:
$(mapping_name + 'select_type').change( function() { ..... $(mapping_name + 'select_type option:selected').each(function() { это расточительство, когда в обработчике список уже доступен - this. Значением списка при этом является значение его выбранной опции, то есть this.value - $(this).val() при этом это еще одно расточительство. В списке с единственным выбором выбранная опция может быть только одна. Попробуйте исходя из этой аксиомы объяснить, что тут происходит? $(mapping_name + 'select_type option:selected').each(function() { |
Цитата:
добавив еще один список и его обработчик в конечную функцию приходит только крайний вариант выбора, а вот как заставить накапливать все значения, пока не дотумкал... |
...наконец-то моя кость (в которой должен быть мозг) что-то путное выдала: чтобы значения в массиве менялись надо сначала определить структуру самого массива - типа так
var map_arr = { 'mtype1':'', 'mtype2':'', };и т.д. и только потом в обработчиках использовать внесение данных согласно структуре. уже на что-то похоже или опять "степь, да степь кругом"?.. |
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 07:09. |