Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Событие срабатывает со второго раза (https://javascript.ru/forum/jquery/43710-sobytie-srabatyvaet-so-vtorogo-raza.html)

BlackSSA 17.12.2013 12:51

Событие срабатывает со второго раза
 
Доброго времени суток!
Не получилось найти решение проблемы со схожими на форуме, поэтому прошу помощи. Суть проблемы: есть два диалога 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" - все равно кракозябры рисует, но это, как понимаю, уже тема другого вопроса.
Заранее признателен!

BlackSSA 18.12.2013 22:38

Уточнение по вопросу
 
Эмпирическим путем выяснил, что проблема в следующем: тело первого диалога подгружается по AJAX, т.е. все button - динамические. Так вот если на эти кнопки повесить обработчики типа "$("#id").button().on("click",function(){...}) ", то первое нажатие приводит к закрытию диалогового окна:blink: . Попробовал через live() в $.(document).ready, так браузер выпадает в ошибку, типа не поддерживается данный метод. Кто подскажет, в чем проблема???:thanks:

рони 18.12.2013 22:42

Цитата:

Сообщение от BlackSSA
live

удалена из jquery начиная с 1.9

рони 18.12.2013 22:44

BlackSSA,
вешайте on на элемент выше
Цитата:

Сообщение от BlackSSA
$("#id").


BlackSSA 18.12.2013 22:50

Цитата:

Сообщение от рони (Сообщение 287719)
BlackSSA,
вешайте on на элемент выше

Простите, но куда выше? По AJAX мне приходит что-то вроде
<form>
бла-бла-бла

<button id="id1">Кнопка</button>
<button id="id2">Кнопка2</button>
<button id="id3">Кнопка3</button>
</form>

Я этот фрагмент вставляю по $("#div_id").html("ajax-ответ"), и в success пытаюсь навесить обработчики.

рони 18.12.2013 22:56

Цитата:

Сообщение от BlackSSA
$("#div_id").html("ajax-ответ"),

так на $("#div_id"). и ставьте on

рони 18.12.2013 22:58

BlackSSA,
$("#div_id").on("click","#id",function

BlackSSA 19.12.2013 00:15

Цитата:

Сообщение от рони (Сообщение 287725)
BlackSSA,
$("#div_id").on("click","#id",function

Не помогло. Повесил в $(document).ready() - в первый раз диалог закрывается, срабатывает только со второго раза. :(

рони 19.12.2013 00:31

BlackSSA,
в первом посте на какой строке заканчивается функция saveV() ?

BlackSSA 19.12.2013 00:42

На 87-ой. Но код уже все-равно переделал, пока выяснял ошибку. И наконец дошел до нужного результата:victory: . Проблему решил, когда добавил во все AJAX "async: false" + $("#id_div").on("click","#id_button",function(){.. .}); В режиме дебага обнаружил, что меня склоняет по функции ajax, хотя на этот момент контекст должен был быть получен(на одной форме, вернее - диалоге, 3 ajax-запроса).

Большое спасибо за помощь!:thanks:


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