Событие срабатывает со второго раза
Доброго времени суток!
Не получилось найти решение проблемы со схожими на форуме, поэтому прошу помощи. Суть проблемы: есть два диалога error и attention. Когда их вызываю, то в первый раз появляются на секунду и пропадают, а в последующие разы срабатывают ожидаемым образом. Есть нюанс - эти диалоговые окна открываются поверх другого диалогового окна, плюс имеется диалоговое окно для AJAX "ход загрузки". Вот фрагмент кода: $(document).ready(function () { $("#ErrorMsg").dialog({ autoOpen: false, buttons: { "Закрыть": function () { $(this).dialog("close"); } }, title: "Ошибка", modal:true }); $("#AttentionMsg").dialog({ autoOpen: false, buttons: { "Закрыть": function () { $(this).dialog("close"); } }, title: "Внимание", modal: true }); }); //Динамически открываю основной диалог function editV(obj) { var id = $(obj).attr("value"); $.ajax({ url: "/Zakaz/GetV/" + id, success: function (data) { //html основного диалога с сервера(их несколько вариантов) $("#div_V").html(data); //кнопка сохранения. Собственно она и отвечает за обработку события, с которым воюю $("#btn_save_v").button({ icons: { primary: 'ui-icon-disk', secondary: null } }).on('click', function () { saveV(); }); $("#btn_cancel_v").button({ icons: { primary: 'ui-icon-circle-close', secondary: null } }); $("#btn_del_v").button({ icons: { primary: 'ui-icon-trash', secondary: null } }); $("#btn_cancel_v").on("click",function () { $("#div_V").dialog("close"); }); $("#btn_master_v").button({ icons: { primary: 'ui-icon-lightbulb', secondary: null } }); $("#div_V").dialog({ modal: true, title: "Редактирование объема", width: 750 }); $("#div_V input,#div_V .klient_input,#div_V .klient_input_min,#div_V .klient_input_money").on("change",function () { var state = $("#StateV").val(); switch (state) { case "Загруженный": $("#StateV").val("Измененный"); break; default: break; } }); } }); } function saveV() { //Критерий, по которому определяем дальнейшие действия: сохранить, ошибка, ничего не менялось(чтоб не гонять данные лишний раз var state = document.getElementById("StateV").value; if (state == "Загруженный") { console.log("Нет никаких изменений"); //текст в диалоге $("#AttentionText").html("Никаких изменений не обнаружено! Если хотите выйти, то просто нажмите соответствующую кнопку."); $("#AttentionMsg").dialog("open"); return false; } var serialisation = $("#form_V").serialize() + "&idZak=" + document.getElementById("IdZak").value; $.ajax({ type: "POST", url: "/Zakaz/SaveV", data: serialisation, error: function (XMLHttpRequest, textStatus, errorThrown) { if (XMLHttpRequest.status == "403") { console.log("Нет прав на редактирование"); errorAJAX("Нет прав для редактирования заказа"); } }, success: function (datas) { //Успешная передача, работаем дальше ... } }); function errorAJAX(msg) { $("#errorText").html(msg); $("#ErrorMsg").dialog("open"); return false; } ASP MVC JQuery версии 2.0.3 JQuery UI - 1.10.3 Кстати, не получилось побороть кодировку в XMLHttpRequest: в хедере передавал кодировку "Content-type: text/plain; charset=windows-1251" - все равно кракозябры рисует, но это, как понимаю, уже тема другого вопроса. Заранее признателен! |
Уточнение по вопросу
Эмпирическим путем выяснил, что проблема в следующем: тело первого диалога подгружается по AJAX, т.е. все button - динамические. Так вот если на эти кнопки повесить обработчики типа "$("#id").button().on("click",function(){...}) ", то первое нажатие приводит к закрытию диалогового окна:blink: . Попробовал через live() в $.(document).ready, так браузер выпадает в ошибку, типа не поддерживается данный метод. Кто подскажет, в чем проблема???:thanks:
|
Цитата:
|
BlackSSA,
вешайте on на элемент выше Цитата:
|
Цитата:
<form> бла-бла-бла <button id="id1">Кнопка</button> <button id="id2">Кнопка2</button> <button id="id3">Кнопка3</button> </form> Я этот фрагмент вставляю по $("#div_id").html("ajax-ответ"), и в success пытаюсь навесить обработчики. |
Цитата:
|
BlackSSA,
$("#div_id").on("click","#id",function |
Цитата:
|
BlackSSA,
в первом посте на какой строке заканчивается функция saveV() ? |
На 87-ой. Но код уже все-равно переделал, пока выяснял ошибку. И наконец дошел до нужного результата:victory: . Проблему решил, когда добавил во все AJAX "async: false" + $("#id_div").on("click","#id_button",function(){.. .}); В режиме дебага обнаружил, что меня склоняет по функции ajax, хотя на этот момент контекст должен был быть получен(на одной форме, вернее - диалоге, 3 ajax-запроса).
Большое спасибо за помощь!:thanks: |
Часовой пояс GMT +3, время: 19:16. |