【问题标题】:SimpleModal - Calling "modal()" on the same elementSimpleModal - 在同一个元素上调用“modal()”
【发布时间】:2011-03-23 14:15:08
【问题描述】:

我有一页我想在其中包含几个由 SimpleModal 实现的模态窗口实例。具体场景如下:

  1. 页面已加载。
  2. 用户点击一个按钮来打开一个模态窗口。
  3. 在模式中,用户插入(输入)他需要的所有信息。
  4. 数据已验证。 如果验证失败,应该会显示一个新的模式并显示错误。这个概念是有一个模式窗口,应该像 javascript alert() 函数一样工作。
  5. 当错误可见时,之前的模式应该会消失。一旦用户单击“确定”,错误就会消失,并且旧的模式应该会出现。

现在,我搜索了一个答案,我看到 Eric Martin(SimpleModal 的开发者)的几篇帖子谈论拥有多个模态窗口。貌似 SimpleModal 不支持,他推荐的是把modal的内容替换成新的。

我想做的是:

  1. 在显示警报之前,我会保留打开模式的 ID。
  2. 隐藏所有打开的模式(隐藏 div)。
  3. 显示警报并绑定确定按钮。
  4. 当用户单击“确定”时,我关闭(警报的)当前模式,获取旧 div 的名称,并通过调用 ShowDialog("getSubsidiariesForCustomer") 再次显示它。

我的问题是当我尝试运行最后一个命令时它不起作用。经过调查,如果在某个元素上调用了 modal() 函数,SimpleModal 插件的实现似乎会保留一个标志。

仅用于一般知识:

  1. 我使用的是简单模式 1.41
  2. 好像我在 JS 的第 216 行失败了:

    // 不允许多次调用 如果(s.d.data){ 返回假; }

我的代码就在本节之后: 我从运行“jBtnNew_Click”的逻辑开始:

Admin.BL.SettingsPage.jBtnNew_Click=function(e)
{
    Admin.BL.EcmSettings.ShowDialog("#getSubsidiariesForCustomer");
    alert(""); //Just for debugging
    Admin.BL.EcmSettings.ShowAlert();
}

Admin.BL.SettingsPage.ShowAlert=function()
{
    var id = $("div.model:visible").eq(0).attr("id");
    $("#alertBtnOk").one("click", function(e){
        $.modal.close();
        if (id != undefined)
        {
            Admin.BL.SettingsPage.ShowDialog(id);
        }
    }
    );
    Admin.BL.SettingsPage.ShowDialog("#alert");
}

Admin.BL.SettingsPage.ShowDialog=function(dialogId)
{
    if (dialogId.indexOf("#") < 0)
    {
        dialogId = "#" + dialogId;
    }
    $("div.model").hide();
    $("#dialog").modal({position:new Array("20%"),
    overlayId:"dialog-overlay",
    containerId:"confirm-container"});
    $(dialogId).show();
}

这是我的 HTML:

获取客户的子公司 客户ID: 顾客姓名: 这是我的警报

任何解决此问题的帮助将不胜感激!

谢谢:)

【问题讨论】:

    标签: jquery simplemodal


    【解决方案1】:

    我认为您的问题 (#4) 可能与我在 SimpleModal 中用于处理 Opera 问题的 setTimeout 代码有关。我需要删除它,但现在您可以尝试通过查找以下内容来编辑 SimpleModal 源:

    setTimeout(function(){
        // opera work-around
        s.d.overlay.remove();
    
        // reset the dialog object
        s.d = {};
    }, 10);
    

    并将其替换为:

    s.d.overlay.remove();
    // reset the dialog object
    s.d = {};
    

    如果这对你不起作用,请告诉我......

    【讨论】:

    • 嗨,Eric,感谢您的评论,但与此同时,我决定以另一种方式实现它。我以为你回复后我会收到一封电子邮件,当我看到我没有收到一封电子邮件时,我已经更改了实现.. 非常感谢你的努力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多