lamo4ok
@lamo4ok
Программист

Почему javascript не считывает изменения в атрибуте селектора?

Ситуация такая. Есть форма, в ней есть кнопка, различные поля и в том числе скрытое поле input с name="queue". Вот код формы:
<form class="cme text-center" id="f-2" name="MyForm">
				<div class="white big-p"><strong>Если еще остались вопросы...</strong></div>	
				<input data-queue="second" type="text" class="form-control" name="name" placeholder="Ваше имя">
				<input data-queue="first" type="text" class="form-control" name="phone" id="phone" placeholder="Номер телефона">
                <input name="type" type="hidden" value="2" />
                <input name="queue" type="hidden" value=true />
				<button id="send_button_s-0" data-queue="Может еще немного о себе?" class="cme-btn btn btn-danger">Заказать консультацию!</button>
				<div id="alert-1" class="white mini-p"></div>
				<div class="callme-result"></div>
			</form>


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

jQuery.getJSON(folder + 'lib/send.php', { // отправка данных
			contentType: 'text/html; charset=utf-8',
			cs 		: cs,
			os 		: os,
			ctime : cnt,
		}, function(i) {
			cmeMsg(form, i.cls, i.message);
			if (i.result=='success' && !Boolean($(e).closest('form').find('input[name="queue"]').val())) {
				setData('callme-sent', i.time);
				form.find('.cme-btn').attr('disabled', 'disabled');
				dl('cmeHide', 4);
				dl('cmeClr', 5);
			} else if (i.result=='success' && Boolean($(e).closest('form').find('input[name="queue"]').val())) {
                $(e).closest('form').find('input[name="queue"]').val("false");
                $(e).parent().find('input[data-queue="first"]').each(function(){
                    $(this).slideToggle();
                });
                $(e).parent().find('input[data-queue="second"]').each(function(){
                    $(this).slideToggle();
                });
                $(e).html($(e).attr("data-queue"));
            }
		});


Как все должно работать: пользователь нажимает кнопку, по которой происходит обработка полей формы, и потом они отправляются на сервер в скрипт php, где происходит обработка этих полей, отправка их по почте и так далее. В этом случае код идет по ветке, где Boolean($(e).closest('form').find('input[name="queue"]').val()) будет возвращать true. После этого данное значение меняется на false, что есть в коде выше:
$(e).closest('form').find('input[name="queue"]').val("false");
И даже при просмотре в Инспекторе данное значение меняется.
Однако при повторном нажатии на кнопку пользователем после того, как он заполнит очередные поля в форме, интерпретатор доходит до условия в коде, где значение Boolean($(e).closest('form').find('input[name="queue"]').val()) по идее должно уже считаться, как false - ведь даже в Инспекторе мы видим, что это так, но вот беда - значение там опять считывается как true. Подозреваю, что тут всему виной callback и асинхронность кода, но не могу понять, как именно это влияет - ведь по идее колбек уже сто раз должен был отработать, что мы видим и в Инспекторе, и собственно по коду это тоже ожидается.

Подскажите, как победить данную проблему.
  • Вопрос задан
  • 278 просмотров
Решения вопроса 1
Попробуйтt вместо attr написать prop
form.find('.cme-btn').prop('disabled', 'disabled');

А тут можно вместо attr написать data и удалить префикс "data-":
$(e).html($(e).data("queue"));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы