【问题标题】:JQuery dialog show HTML content and prevent removing HTML after dialog is closed?JQuery 对话框显示 HTML 内容并防止在对话框关闭后删除 HTML?
【发布时间】:2017-06-13 18:00:44
【问题描述】:

过去几天我一直在研究单页应用程序。我面临的问题之一与 JQuery 对话框有关。我想在 JQuery 对话框中显示我的表单。有几个不同的屏幕,每个屏幕都有不同的形式。用户将单击添加或编辑按钮。我正在传递 div id,该内容应该出现在对话框中。每个 div 都有唯一的 id,每个 div 内部都有不同的形式。这是我创建 JQuery 对话框的代码:

JQuery 对话框:

var dialogDiv;
$.extend({ 
    alert: function (message, title, height, width, print) {
        var dialogButtons = {
            "Ok": function() {
                message.hide();
                $(this).dialog("close");
            }
        };

        if (print) dialogButtons.Print = function() {
            $(this).dialog().printArea();
        };

        if (!dialogDiv) {
            dialogDiv = $("<div>"); 
        }   
        dialogDiv.dialog( {
            buttons: dialogButtons,
            resizable: false,
            title: title,
            modal: true,
            width: height,
            height: width,
            overflow:"auto",
            position: {
                    my: "center",
                    at: "center",
                    of: window
            }
        }).html(message);
    }
});

以下是我的不同表单的 div 容器示例:

//Form 1
<div id="myForm1" class="frmLayout">
    <form name="frmUser" id="frmUser" method="POST" action="#">
        <fieldset>
            <legend>User Info</legend>
            <div class="formItem">
                <span class="required" style="color:red;"><b>Required Fields</b></span>
            </div>
            <div class="formItem">
                <label for="last_name" class="required">Last Name:</label>
                <input type="text" name="ur_lname" id="ur_lname" value="" size="20" maxlength="30" />
            </div>
            <div class="formItem">
                <label for="first_name" class="required">First Name:</label>
                <input type="text" name="ur_fname" id="ur_fname" value="" size="20" maxlength="30" />
            </div>
            <div class="formItem">
                <label for="dob" class="required">DOB:</label>
                <input type="text" name="ur_dob" id="ur_dob" value="" size="10" maxlength="10" />
            </div>
            <div class="formItem">
                <p align="center"><input type="button" name="urSubmit" id="urSubmit" value="Submit"></p>
            </div>
        </fieldset>
    </form>
</div>

//Form 2
<div id="myForm2" class="frmLayout">
        <form name="frmVehicle" id="frmVehicle" method="POST" action="#">
            <fieldset>
                <legend>Vehicle Info</legend>
                <div class="formItem">
                    <span class="required" style="color:red;"><b>Required Fields</b></span>
                </div>
                <div class="formItem">
                    <label for="name" class="required">Name:</label>
                    <input type="text" name="ur_name" id="ur_name" value="" size="20" maxlength="30" />
                </div>
                <div class="formItem">
                    <label for="model" class="required">Model:</label>
                    <input type="text" name="ur_model" id="ur_model" value="" size="20" maxlength="30" />
                </div>
                <div class="formItem">
                    <p align="center"><input type="button" name="urSubmitV" id="urSubmitV" value="Submit"></p>
                </div>
            </fieldset>
        </form>
    </div>

...Form 3 和 Form 4 类似。

一旦用户访问主页,所有 HTML 内容都会被加载并设置为 display:none。以下是此内容如何在对话框中显示的示例:

$('input[name="my button name"]').on('click', function formSubmit(){
    var tabID = $('#tabID').val(); //each tab on my home page has unique id. Current tab value is set to hidden field.
    var divID = $('#'+tabID+'Form'); //This line of code will select correct form
    $.alert(divID.show(),'Form Input',800,600); //here I show the content
});

此代码的问题是,一旦我关闭对话框,divID 内容就会从页面中消失。例如,我将单击第一个选项卡上的添加按钮。表格 1 将显示在对话框中。一旦我转到选项卡 2 并单击并显示表单 2,然后返回选项卡 1 并尝试单击添加按钮,我将在我的 JQuery 对话框中获得空白页。由于某种原因,以前的内容已从页面中删除。 我想知道如何解决这个问题,最好的解决方案是什么?在 JQuery 对话框中显示之前,我应该如何复制我的 HTML 内容,还是有更好的方法来做到这一点?如果有人可以提供帮助或有任何示例,请告诉我。

谢谢。

【问题讨论】:

  • 你可以使用.clone()
  • 在第一个JS中.dialog()方法来自哪里? Bootstrap.js?
  • @TonySamperi .() 对话框是 JQuery 函数。
  • @doutriforce 我已经尝试过克隆,但我的 div 中的表单出现在我的屏幕上。你能举个例子吗?
  • 不,不是。你是说 jQueryUI?

标签: javascript jquery html dialog jquery-ui-dialog


【解决方案1】:

所以问题是你每次都生成模态...... 我会这样做:

var dialogDiv;
$.extend({ 
    alert: function (message, title, height, width, print, clone) {
        var dialogButtons = {
            "Ok": function() {
                message.hide();
                $(this).dialog("close");
            }
        };

        if (print) dialogButtons.Print = function() {
            $(this).dialog().printArea();
        };

        if (!dialogDiv) {
            dialogDiv = $("<div>"); 
        } 
        if(clone){
            dialogDiv = $("body").append(dialogDiv);
        }
        dialogDiv.dialog( {
            buttons: dialogButtons,
            resizable: false,
            title: title,
            modal: true,
            width: height,
            height: width,
            overflow:"auto",
            position: {
                   my: "center",
                   at: "center",
                   of: window
            }
        }).html(message);
    }
});

我注意到 UI 对话框适用于页面中已有的 DIV。 但不是传递现有元素,而是创建一个。 在我看来,这就是你丢失内容的原因。 使用“克隆”参数,您可以传递真/假,以决定是否要在正文中附加一个新的 div。 所以它会在未来可用。

【讨论】:

  • 克隆参数中应该传递什么?这与之前的代码有何不同?
  • 你看不出区别在哪里吗?
  • 我看到您在函数中添加了新参数,但没有什么可以告诉我这将如何影响对话框的构建或我应该在 clone 参数中传递什么?
  • 我在答案底部添加了描述。请重新加载!
  • 为什么要发送clone 作为参数,如果它应该始终为真?
猜你喜欢
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多