【问题标题】:0x800a139e - JavaScript runtime error: cannot call methods on dialog prior to initialization; attempted to call method 'close'0x800a139e - JavaScript 运行时错误:无法在初始化之前调用对话框上的方法;试图调用方法“关闭”
【发布时间】:2013-05-04 23:50:24
【问题描述】:

我的取消按钮在 JQuery 模态对话框上无法正常工作,我非常感谢一些帮助。 这是我单击模式的取消按钮时遇到的异常:

0x800a139e - JavaScript 运行时错误:无法调用对话框上的方法 初始化之前;试图调用方法'close'

这是我在模态框上显示的部分视图:

@model Models.Office
@{  
    Layout = null;
}
 @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/jqueryui")
    @Styles.Render("~/Content/bootstrap")
    @Scripts.Render("~/bundles/bootstrap")
    @Styles.Render("~/Content/css")
    @Styles.Render("~/Content/themes/base/css")
    @Scripts.Render("~/bundles/modernizr")
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>

<script type="text/javascript">
    function CloseModal() {
        $(this).dialog("close");
        }
</script>


@*@using (Ajax.BeginForm("EditOffice", "Admin", new AjaxOptions { HttpMethod = "POST", UpdateTargetId = "edit-Dialog" }))*@
@using (Html.BeginForm("CreateEditOffice", "Admin", "POST"))
{ 
    <fieldset>
        <legend>Office</legend>
        @if (ViewBag.IsUpdate == true)
        { 
            @Html.HiddenFor(model => model.OfficeId)
        }

        <div class="display-label">
            @Html.DisplayNameFor(model => model.OfficeName)
        </div>
        <div class="Input-medium">
            @Html.EditorFor(model => model.OfficeName)
            @Html.ValidationMessageFor(model => Model.OfficeName)
        </div>

        <div class="display-label">
            @Html.DisplayNameFor(model => model.SupportNo)
        </div>
        <div class="Input-medium">
            @Html.EditorFor(model => model.SupportNo)
            @Html.ValidationMessageFor(model => model.SupportNo)
        </div>

        <div class="display-label">
            @Html.DisplayNameFor(model => model.SupportEmail)
        </div>
        <div class="Input-medium">
            @Html.EditorFor(model => model.SupportEmail)
            @Html.ValidationMessageFor(model => model.SupportEmail)
        </div>
        <div class="display-label">
            @Html.DisplayNameFor(model => model.SupportFax)
        </div>
        <div class="Input-medium">
            @Html.EditorFor(model => model.SupportFax)
            @Html.ValidationMessageFor(model => model.SupportFax)
        </div>

        <div class="display-label">
            @Html.DisplayNameFor(model => model.SupportFtp)
        </div>
        <div class="Input-medium">
            @Html.EditorFor(model => model.SupportFtp)
            @Html.ValidationMessageFor(model => model.SupportFtp)
        </div>
    </fieldset>
    <br />
    <div class="pull-right">
        @if (ViewBag.IsUpdate == true)
        { 
            <button class="btn btn-primary" type="submit" id="btnUpdate" name="Command" value ="Update">Update</button>
        }
        else
        { 
            <button class="btn btn-primary" type="submit" id="btnSave" name="Command" value="Save">Save</button>
        }
            <button type="button" id="Cancel" class="btn btn-primary" onclick="CloseModal()">Cancel</button>
    </div>
}

那么这是父视图上的脚本:

<script type="text/javascript">
    $(document).ready(function () {
        $(".editDialog").on("click", function (e) {
            // e.preventDefault(); use this or return false
            var url = $(this).attr('href');
            $("#dialog-edit").dialog({
                title: 'Edit Office',
                autoOpen: false,
                resizable: false,
                height: 450,
                width: 380,
                show: { effect: 'drop', direction: "up" },
                modal: true,
                draggable: true,
                open: function (event, ui) {
                    $(this).load(url);
                },
                close: function (event, ui) {
                    $("#dialog-edit").dialog().dialog('close');
                }
            });

            $("#dialog-edit").dialog('open');
            return false;
        });
    });   
</script>

我做错了什么????

【问题讨论】:

  • 旁注:您应该使用.dialog({ autoOpen: false }) 而不是.dialog().dialog('close')

标签: javascript jquery asp.net-mvc jquery-ui


【解决方案1】:

onclick="CloseModal()" 等内联处理程序不会在被调用的函数内设置this。您必须通过 this 参考内联:

onclick="CloseModal(this)"

function CloseModal(el) {
    $(el).dialog("close");
}

或者只是使用 jQuery 附加处理程序,它会在事件处理程序内部设置 this 引用:

//instead of onclick="", attach the handler inside DOM ready:
$(function() {
    $('#Cancel').click(CloseModal);
});
function CloseModal() {
    $(this).dialog("close");
}

这假设在页面结构完成呈现时存在#Cancel,并且您的标记有效(没有重复的 ID)。

【讨论】:

  • 感谢@Fabricio 的及时帮助!
  • 这是它现在抛出的错误消息:0x800a139e - JavaScript 运行时错误:在初始化之前无法调用对话框上的方法;试图调用方法“关闭”
  • 您能否将呈现的 HTML 和 JS 放入 jsbin.comjsfiddle.net 以重现问题?很可能是在第一个 .dialog({/*opts*/}) 之前调用了 CloseModal(),或者仍然存在关于 this 的引用错误。
  • 还在.dialog('close') 之前添加console.log(this)/console.log(el) 以检查该函数是否真的是罪魁祸首以及它是否实际上引用了正确的元素。
  • obrigado @Fabrício pela sua ajuda。 Como eu estava encalhado neste problema eu resolvi usar uma outra alternativa que funcionou。一个 unica desvantagem e que tenho de voltar ao 控制器... mas funciona, para ja vai ter de servir infelizemente... Obrigado mais uma vez!
【解决方案2】:

$(this).dialog("关闭");

使用对话框名称而不是“this”,例如..$("header").dialog("close");

它对我有用。

问候

巴斯卡。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-29
    • 2019-10-02
    • 1970-01-01
    • 2013-03-10
    • 2013-03-08
    • 1970-01-01
    • 2014-12-14
    • 2013-02-10
    相关资源
    最近更新 更多