JQuery UI Диалог + Подтвердить - PullRequest
       31

JQuery UI Диалог + Подтвердить

8 голосов
/ 30 сентября 2010

У меня проблемы с проверкой диалогового окна jQuery UI с использованием Jquery Validate после нажатия кнопки Сохранить.

Вот мой код для создания диалога Jquery.Он загружает диалоговое окно из целевого URL-адреса href:

$(document).ready(dialogForms);

function dialogForms() {
  $('a.dialog-form').click(function() {
    var a = $(this);
    $.get(a.attr('href'),function(resp){
      var dialog = $('<div>').attr('id','formDialog').html($(resp).find('form:first').parent('div').html());
      $('body').append(dialog);
      dialog.find(':submit').hide();
      dialog.find('#return').hide();
      dialog.dialog({
        title: a.attr('title') ? a.attr('title') : '',
        modal: true,
        buttons: {
          'Save': function() {submitFormWithAjax($(this).find('form'));},
          'Cancel': function() {$(this).dialog('close');}
        },
        close: function() {$(this).remove();},
        width: 'auto'
      });
    }, 'html');
    return false;
  });
}

function submitFormWithAjax(form) {
    form = $(form);
    $.ajax({
        beforeSend: function(data) {
            //alert("beforesend");
            form.validate();
        },
        url: form.attr('action'),
        data: form.serialize(),
        type: (form.attr('method')),
        dataType: 'text',
        error: function(data) {
            alert(data);
            $('#result').html(data);
        },
        success: function(data) {
            //alert("success");
            $('#result').html(data);
            setTimeout("reloadPage()", 500);
        }
    });
  return false;
}

Вызывается beforeSend, но, похоже, не вызывается метод validate, который находится на родительской страницеДиалог называется.

        $(document).ready(function() {
            $("#event_form").validate({
                rules: {
                    Name: {
                        required: true
                    },
                    Category: {
                        required: true
                    }
                },
                messages: {
                    Name: "Please enter an event name",
                    Category: "Please choose a category"
                },
                submitHandler: function(form) {
                    alert("validated");
                    //                    $('#loading_1').show();
                    //                    $('#proceed_c').hide();
                    //                    $(form).ajaxSubmit();
                    //                    //form.submit();
                },
                errorPlacement: function(error, element) {
                    error.appendTo(element.next(".status"));
                }
            });

}

Проблема в beforeSend в submitFormWithAjax function, расположении $("#event_form").validate или submitHandler: function(form) в нем?Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

7 голосов
/ 05 октября 2010

Когда вы инициализируете диалоговое окно jQueryUI, оно модифицирует DOM, весь диалог извлекается из его местоположения на странице и вставляется непосредственно перед тегом </body>. Вы можете увидеть это с Firebug. Это вызывает проблему для проверки, потому что теперь форма пуста. Чтобы решить эту проблему, в открытое событие диалога добавьте его в форму. Звучит очень странно, но поверьте мне, это работает:)

dialog.dialog({
    title: a.attr('title') ? a.attr('title') : '',
    modal: true,
    buttons: {
      'Save': function() {submitFormWithAjax($(this).find('form'));},
      'Cancel': function() {$(this).dialog('close');}
    },
    close: function() {$(this).remove();},
    open: function(){
        $(this).parent().appendTo($('#event_form'));
    },
    width: 'auto'
  });

Edit:

<form id='event_form'>
  <div id="dialog" title="DialogTitle"> 
  </div>
</form>
2 голосов
/ 12 ноября 2012

Немного другой подход к этому. Мне нужно было повторно использовать мою модальную форму, поэтому я добавляю ее, как только jquery «создает» модальную форму:

    $("#mdl_Subject").dialog({
    autoOpen: false,
    show: "drop",
    hide: "drop",
    modal: true,
    create: function () {
        $(this).parent().appendTo($('#aspnetForm'));
    }
});
...