Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Не срабатывает возврат значения из функции (https://javascript.ru/forum/jquery/72580-ne-srabatyvaet-vozvrat-znacheniya-iz-funkcii.html)

WarDoctor 10.02.2018 01:22

Не срабатывает возврат значения из функции
 
<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
mapping_arr2: {"mtype":""}

Что сделано не по правилам?

laimas 10.02.2018 05:57

Цитата:

Сообщение от WarDoctor
Не срабатывает возврат значения из функции

А почему, что-о должно сработать, если функция, это установка обработчика объекту? Вы чего ждете?

WarDoctor 10.02.2018 09:52

Цитата:

Сообщение от laimas (Сообщение 477493)
Вы чего ждете?

По аналогии с php ожидаю изменения значения ключа в массиве, в данном случае объекте, чтобы в другом блоке скрипта использовать весь массив для вывода конечного результата.

laimas 10.02.2018 10:22

Ну нет, в РНР такого аналога нет и быть не может.

Ваша функция, это:

1) определить обработчик события onchange спиcку
2) выход

Она не ждет когда состояние списка изменится, а объект будет заполнен значением только по изменению в списке. А вот возврат в обработчике в никуда.

var mapping_arr = {'mtype':''};
$('select').change( function() {
    mapping_arr.mtype = this.value;
});
//генерировать событие
$('select').trigger('change');
//теперь будет заполнено 
alert(JSON.stringify(mapping_arr))

WarDoctor 10.02.2018 10:32

Цитата:

Сообщение от laimas (Сообщение 477502)
Ну нет, в РНР такого аналога нет и быть не может.

...в php подобное реализовывалось путем объявление переменной -> цикл обработки массива с фильтром -> внесение необходимого в соответствующий ключ -> вывод конечного массива на обработку. но php серверный и перегружать страницу после каждого выбора из списка считаю бредом.
по данному примеру: отказался от функции как таковой. проверил на 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));
})
, но воз и ныне по прежнему адресу. что не так понять не могу...

laimas 10.02.2018 10:48

Цитата:

Сообщение от WarDoctor
в php подобное реализовывалось путем объявление переменной -> цикл обработки массива с фильтром -> внесение необходимого в соответствующий ключ -> вывод конечного массива на обработку.

Это по вашему аналогия события, которое может и не наступить?

Цитата:

Сообщение от WarDoctor
Ваш код, к сожалению он тоже не срабатывает:

Пусть будет ваш селектор, а не 'select':

<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].

WarDoctor 10.02.2018 10:58

Цитата:

Сообщение от laimas (Сообщение 477505)
Это по вашему аналогия события, которое может и не наступить?

Пусть будет ваш селектор, а не 'select':

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
$(function() {
    var mapping_arr = {'mtype':''};
    var o = $('select').change( function() {
        mapping_arr['mtype'] = this.value;
    });

    o.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'), то тоже будет работать. Что именно не работает?

...выдаёт значение первого по списку, а надо чтобы в controls выводилось выбранное. controls - проверочное поле...

laimas 10.02.2018 11:06

Цитата:

Сообщение от WarDoctor
...выдаёт значение первого по списку, а надо чтобы в controls выводилось выбранное

А подумать? Кто на момент определения обработчика будет делать в списке выбор? Некому, потому ранее показанный ваш код и ожидает у моря погоды.

То что я написал, это генерация события у списка, а значит и запуск обработчика. Но обработчик не изменяет состояние списка, а значит в объект будет помещено значение выбранной по умолчанию опции - первой. А вот когда пользователь сделает выбор, в массив попадет уже значение выбранной им опции.

WarDoctor 10.02.2018 11:20

Цитата:

Сообщение от laimas (Сообщение 477507)
А подумать? Кто на момент определения обработчика будет делать в списке выбор? Некому, потому ранее показанный ваш код и ожидает у моря погоды.

То что я написал, это генерация события у списка, а значит и запуск обработчика. Но обработчик не изменяет состояние списка, а значит в объект будет помещено значение выбранной по умолчанию опции - первой. А вот когда пользователь сделает выбор, в массив попадет уже значение выбранной им опции.

...в том-то все и дело, что после выбора из списка конечный результат за пределами обработчика не изменяется. необходимо чтобы результат выбора был доступен не только в пределах обработчика...

WarDoctor 10.02.2018 11:22

<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>

laimas 10.02.2018 11:23

Цитата:

Сообщение от WarDoctor
необходимо чтобы результат выбора был доступен не только в пределах обработчика...

Так зачем тогда глобальный объект mapping_arr, выполняйте все необходимые действия в обработчике. И триггер тоже не нужен, а alert(JSON.stringify(mapping_arr)) без наступления события и должен в этом случае возвращать свойство без значения.

laimas 10.02.2018 11:28

Цитата:

Сообщение от WarDoctor
введение return также не меняет ситуации...

Некому return, это понятно? А $(mapping_name + 'select_type').change( function() и $('#controls').html('mapping_arr: ' + JSON.stringify(mapping_arr));
события асинхронные.

$('select').change( function() {
$('#controls').html(тут вставляем нужное, получая значение выбранной опции как this.value, напрягать JQ по таким пустякам не стоит.)

WarDoctor 10.02.2018 11:39

Цитата:

Сообщение от laimas (Сообщение 477511)
Некому return, это понятно?

...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();
      });
      return mapping_arr;
  }).change();
	
  $('#controls').html('mapping_arr: ' + JSON.stringify(mapping_arr));

})
</script>

laimas 10.02.2018 11:51

$(...).change( function() {
mapping_arr.mtype = this.value;
имя_функции_какого_то_основ ного_скрипта();
})

WarDoctor 10.02.2018 11:57

Цитата:

Сообщение от laimas (Сообщение 477515)
$(...).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>

WarDoctor 10.02.2018 12:04

...похоже что для наполнения массива необходимыми значениями, а их у меня по условиям работы скрипта может быть несколько, необходимо каждое значение передать в эту функцию и там уже причесать к результирующему выводу.
правильно? jsfiddle.net...

laimas 10.02.2018 12:10

Цитата:

Сообщение от WarDoctor
правильно?

Нет не правильно. Подумайте, что в обработчике нелогично?

WarDoctor 10.02.2018 12:16

Цитата:

Сообщение от laimas (Сообщение 477518)
Нет не правильно. Подумайте, что в обработчике нелогично?

...похоже, что надо вот так: jsfiddle.net - ведь будут различные переменные добавляться...

laimas 10.02.2018 12:26

Цитата:

Сообщение от WarDoctor
похоже, что надо вот так

Так вообще не надо.

$(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() {

WarDoctor 10.02.2018 12:31

Цитата:

Сообщение от laimas (Сообщение 477520)
$(mapping_name + 'select_type option:selected').each(function() {

...это обход всех возможных значений списка. тут Вы правы - излишества тупицы. мой косяк.
добавив еще один список и его обработчик в конечную функцию приходит только крайний вариант выбора, а вот как заставить накапливать все значения, пока не дотумкал...

WarDoctor 10.02.2018 12:40

...наконец-то моя кость (в которой должен быть мозг) что-то путное выдала: чтобы значения в массиве менялись надо сначала определить структуру самого массива - типа так
var map_arr = {
  'mtype1':'',
  'mtype2':'',
  };
и т.д. и только потом в обработчиках использовать внесение данных согласно структуре. уже на что-то похоже или опять "степь, да степь кругом"?..

laimas 10.02.2018 12:42

Цитата:

Сообщение от WarDoctor
это обход всех возможных значений списка.

А какое может быть множество значений у одной опции? Если нужно получить все значения списка, то селектор не должен содержать :selected. Но тогда встает вопрос - "Нахрена это делать по изменению в списке, если это можно сделать один раз при загрузке страницы"?

WarDoctor 10.02.2018 13:17

Цитата:

Сообщение от laimas
Но тогда встает вопрос - "Нахрена это делать по изменению в списке, если это можно сделать один раз при загрузке страницы"?

...при загрузке считывается текущее значение, а нужен именно результат выбора. в любом случае СПАСИБО за помощь. одна голова с мозгами помогла другой без мозгов найти оптимальное решение нестандартной задачи...


Часовой пояс GMT +3, время: 07:09.