Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Ограничение на одновременный вызов функции / 13 сообщений из 13, страница 1 из 1
18.11.2015, 14:37
    #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
18.11.2015, 14:47
    #39106701
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение на одновременный вызов функции
...
Рейтинг: 0 / 0
18.11.2015, 14:53
    #39106720
zalsily
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение на одновременный вызов функции
Спасибо, похоже ОНО, но не могу понять как его грамотно прикрутить
...
Рейтинг: 0 / 0
18.11.2015, 15:51
    #39106841
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение на одновременный вызов функции
zalsilyПрикрутка функции setTimeout не помогла.
Так смотря как ты это сделал... Где пример?
...
Рейтинг: 0 / 0
18.11.2015, 16:09
    #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
19.11.2015, 08:28
    #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
19.11.2015, 11:44
    #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
20.11.2015, 09:55
    #39108581
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение на одновременный вызов функции
zalsily , пример твой не запускал... Но!
Передавай в обработчик не ссылку на селект, а сразу значение селекта.
...
Рейтинг: 0 / 0
20.11.2015, 10:03
    #39108588
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ограничение на одновременный вызов функции
zalsilyВопрос мой лишь в том, как уйти от ситуации, когда один и тот же метод "SetVal" можно было вызывать лишь после того, как его предыдущий вызов полностью отработает.
Если говорить об обработчиках событий, как в твоем случае, так они вызываются только в момент наступления своих событий. "Ждать чего-то" они не станут. Но выполняться начнут после получения управления.
Напомню, что JS не является языком реального времени. Программные "блоки" получают управление по мере "высвобождения очереди". Если система сильно загружена, то возможно паузы и не соответствия размеров таймаутов.

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

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


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