powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Ограничение на одновременный вызов функции
13 сообщений из 13, страница 1 из 1
Ограничение на одновременный вызов функции
    #39106675
zalsily
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Никак не могу найти решение для задачи:

есть селект с опшионами. Селект подвязан на событие onchange.

Код: html
1.
2.
3.
4.
5.
<select id="myselect" onchange="SetVal(this);">
	<option value="-1">-1</option>
	<option value="2" class="cat0">2</option>
	<option value="5" class="cat1">5</option>
</select>



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

Код: javascript
1.
2.
3.
4.
5.
6.
7.
function SetVal(sender) {
//получаем значение выбранного селекта
var sender_v = sender.value;
$("#div").append("<div>" + sender_v + "</div>");
}

//на выходе должна быть картина вроде: <div>-1</div><div>5</div><div>-2</div><div>5</div><div>-1</div>




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


В итоге, если быстро "бегать" по опшионам селекта, то получим что-то типа такого результата:
Код: html
1.
<div>-15</div><div>2-1</div><div>52-1</div>



Как закрыть выполнение функции в нить (поток)? Или как ограничить одновременную работу функции в 1? Или как оградить использование переменной? Или как начинать выполнять функцию только после того, как дождемся завершения предыдущего её выполнения?

Прикрутка функции setTimeout не помогла.

Как в такой ситуации поступить?
...
Рейтинг: 0 / 0
Ограничение на одновременный вызов функции
    #39106701
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Ограничение на одновременный вызов функции
    #39106720
zalsily
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, похоже ОНО, но не могу понять как его грамотно прикрутить
...
Рейтинг: 0 / 0
Ограничение на одновременный вызов функции
    #39106841
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zalsilyПрикрутка функции setTimeout не помогла.
Так смотря как ты это сделал... Где пример?
...
Рейтинг: 0 / 0
Ограничение на одновременный вызов функции
    #39106868
zalsily
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function DdlChange(sender)
{
   //ставим задержку в 850 мс если быстро выбирать селекторы списка,
   //то в див попадает несколько значений
   setTimeout(function () 
   {
      function SetVal(sender) 
      {
         //получаем значение выбранного селекта
         var sender_v = sender.value;
         $("#div").append("<div>" + sender_v + "</div>");
      }
   }, 850);
}
...
Рейтинг: 0 / 0
Ограничение на одновременный вызов функции
    #39107358
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал вместо тебя пример...

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<script src='http://code.jquery.com/jquery-latest.js'></script>
<!--
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
function SetVal(sender) {
	//получаем значение выбранного селекта
	var sender_v = sender.value;
	$("#div").append("<div>" + sender_v + "</div>");
};
</script>
</head>
<body>
<select id="myselect" onchange="SetVal(this);">
	<option value="-1">-1</option>
	<option value="2" class="cat0">2</option>
	<option value="5" class="cat1">5</option>
</select>
<div id='div'></div>
</body>
</html>


Как ни клацал по селекту, ну никак не мог получить тот эффект, что ты описал вначале...
Все дивы вставляются с тем значением value, что я выбирал. Никакого "совмещения" не происходит.
...
Рейтинг: 0 / 0
Ограничение на одновременный вызов функции
    #39107547
zalsily
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня твой пример 100% также работает, в смысле при очень быстром клацанье по элементам списка иногда проскакивает на выходе два значения.

Для того, что бы все-таки заметить проявляющийся описанный выше эффект, добавим еще логики в код-обработчик:


Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<script src='http://code.jquery.com/jquery-latest.js'></script>
<!--
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
function SetVal(sender) {
	//получаем значение выбранного селекта
	var sender_v = sender.value;
        //получаем текст выбранного селекта
        var sender_t = $("#myselect" + " option:selected").text();
        var strdoted = sender_t.split("");
        for (var i = 0; i < sender_t.length; i++) {
           if (strdoted[i] == "=") {
               strdoted[i] = "";
           }
           else
               break;
           }
        sender_t = strdoted.join("");
	$("#div").append("<div>" + [color=red]sender_t[/color] + "</div>");
};
</script>
</head>
<body>
<select id="myselect" onchange="SetVal(this);">
	<option value="-1">-1</option>
	<option value="=================Длинная строка первого элемента" class="cat0">=================Длинная строка первого элемента</option>
	<option value="======================А это оооочень длинная строка второго элемента" class="cat1">======================А это оооочень длинная строка второго элемента</option>
        <option value="=============================А это самая длинная строка третьего элемента" class="cat1">=============================А это самая длинная строка третьего элемента</option>
</select>
<div id='div'></div>
</body>
</html>



В итоге можем получить что-то вроде такого:
Код: html
1.
<div>Длинная строка первого элемента======================А это оооочень длинная строка второго элемента</div><div>А это самая длинная строка третьего элемента</div>



И тут можно долго "колдовать" что б забить еще логики для "тормозов" метода с целью все же заставить почаще давать "сбои". Вопрос мой лишь в том, как уйти от ситуации, когда один и тот же метод "SetVal" можно было вызывать лишь после того, как его предыдущий вызов полностью отработает. В серверных языках программирования есть такое понятие "безопасный код", "ограничение на доступ к переменной, методу" и т.п. Вот как тут что-то подобное прикрутить???
...
Рейтинг: 0 / 0
Ограничение на одновременный вызов функции
    #39108581
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zalsily , пример твой не запускал... Но!
Передавай в обработчик не ссылку на селект, а сразу значение селекта.
...
Рейтинг: 0 / 0
Ограничение на одновременный вызов функции
    #39108588
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zalsilyВопрос мой лишь в том, как уйти от ситуации, когда один и тот же метод "SetVal" можно было вызывать лишь после того, как его предыдущий вызов полностью отработает.
Если говорить об обработчиках событий, как в твоем случае, так они вызываются только в момент наступления своих событий. "Ждать чего-то" они не станут. Но выполняться начнут после получения управления.
Напомню, что JS не является языком реального времени. Программные "блоки" получают управление по мере "высвобождения очереди". Если система сильно загружена, то возможно паузы и не соответствия размеров таймаутов.

Но порядок "следования" при выполнении не меняется. Что запущено ранее - получит управление ранее.
...
Рейтинг: 0 / 0
Ограничение на одновременный вызов функции
    #39108615
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
zalsilyИ тут можно долго "колдовать" что б забить еще логики для "тормозов" метода с целью все же заставить почаще давать "сбои". Вопрос мой лишь в том, как уйти от ситуации, когда один и тот же метод "SetVal" можно было вызывать лишь после того, как его предыдущий вызов полностью отработает. В серверных языках программирования есть такое понятие "безопасный код", "ограничение на доступ к переменной, методу" и т.п. Вот как тут что-то подобное прикрутить???Метод никак не может быть вызван до того, как предыдущий вызов завершился. Вы неправильно понимаете, что происходит. Не делайте так
Код: javascript
1.
var sender_t = $("#myselect" + " option:selected").text();

и все будет хорошо. Это вызов по какой-то причине вернул вам несколько строк.
...
Рейтинг: 0 / 0
Ограничение на одновременный вызов функции
    #39109035
zalsily
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как тогда в другой способ правильно получить текст выбранного элемента???
...
Рейтинг: 0 / 0
Ограничение на одновременный вызов функции
    #39109109
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
zalsilyА как тогда в другой способ правильно получить текст выбранного элемента???
Код: javascript
1.
sender_t = sender.options[sender.selectedIndex].text
...
Рейтинг: 0 / 0
Ограничение на одновременный вызов функции
    #39110567
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zalsilyА как тогда в другой способ правильно получить текст выбранного элемента???
Передавай его сразу в обработчик, вместо ссылки на элемент.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Ограничение на одновременный вызов функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]