0

我知道这是一个很长的标题^^

我正在使用 MVC 4 和 JQuery 版本 1.8.2。

我在 JQuery 对话框中加载 PartialView 并且一切正常。

最近我想添加一些 Javascript,在对话框中隐藏一个文本框,这开始了我的痛苦。

Javascript隐藏代码有效:

  • 只有一次,如果我用 $(this).dialog('close'); 关闭对话框
  • 每次,如果我用 $(this).remove(); 关闭对话框

我不是 JQuery / Javascript 方面的专家,但我想了解发生了什么:)

这是我的代码:

$(function dialogLink() {

// Don't allow browser caching of forms
$.ajaxSetup({ cache: false });

// Wire up the click event of any current or future dialog links
$('.dialogLink').on('click', function () {
    var element = $(this);

    // Retrieve values from the HTML5 data attributes of the link       
    var dialogTitle = element.attr('data-dialog-title');
    var updateTargetId = '#' + element.attr('data-update-target-id');
    var updateUrl = element.attr('data-update-url');

    // Generate a unique id for the dialog div
    var dialogId = 'uniqueName-' + Math.floor(Math.random() * 1000)
    var dialogDiv = "<div id='" + dialogId + "'></div>";

    // Load the form into the dialog div
    $(dialogDiv).load(this.href, function () {        

        $(this).dialog({
            modal: true,
            height: 'auto',
            width: 'auto',
            resizable: false,
            title: dialogTitle,
            buttons: {
                "Save": function () {
                    // Manually submit the form                       
                    var form = $('form', this);
                    $(form).submit();
                },
                "Cancel": function () { $(this).dialog('close'); }
                //"Cancel": function () { $(this).remove(); }
            }
        });

        // Enable client side validation
        $.validator.unobtrusive.parse(this);

        // Setup the ajax submit logic
        wireUpForm(this, updateTargetId, updateUrl);


        // Working only once code
        $('#PossibleAnswerContainer').hide();

        $('#StatisticDataType').on('change', function (e) {
            e.preventDefault();

            if ($(this).val() === 'List') {
                $('#PossibleAnswerContainer').show();
            } else {
                $('#PossibleAnswerContainer').hide();
            }
        });

    });
    return false;
});
});

function wireUpForm(dialog, updateTargetId, updateUrl) {
$('form', dialog).submit(function () {

    // Do not submit if the form
    // does not pass client side validation
    if (!$(this).valid())
        return false;

    // Client side validation passed, submit the form
    // using the jQuery.ajax form
    $.ajax({
        url: this.action,
        type: this.method,
        data: $(this).serialize(),
        success: function (result) {
            // Check whether the post was successful
            if (result.Success) {
                // Close the dialog
                $(dialog).dialog('close');

                // Reload the updated data in the target div
                $(updateTargetId).load(updateUrl);

            } else {
                // Reload the dialog to show model errors                   
                $(dialog).html(result);

                // Enable client side validation
                $.validator.unobtrusive.parse(dialog);

                // Setup the ajax submit logic
                wireUpForm(dialog, updateTargetId, updateUrl);
            }
        }
    });
    return false;
});
}
4

2 回答 2

0

所以,我最终得到了这个:

$(this).dialog({
                modal: true,
                height: 'auto',             
                width: 'auto',
                resizable: false,
                title: dialogTitle,
                buttons: {
                    "OK": function () {
                        // Manually submit the form                       
                        var form = $('form', this);
                        $(form).submit();
                    },
                    "Cancel": function () { $(this).dialog('close'); }      
                },
                close: function () { $(this).remove(); } 
            });
于 2014-03-10T14:23:22.653 回答
0
// Wire up the click event of any current or future dialog links
$('.dialogLink').on('click'

这种说法是不正确的。on()不像那样.live(),一旦你附加.live()它就会检测到动态添加的元素。

它应该是。

$(document).on('click', '.dialogLink'), function(){

将未来的事件处理程序附加到名为 的静态元素.dialogLink

此外,将$(document), 替换为最近的静态父元素,例如$('#container')

于 2013-07-21T20:28:26.590 回答