【问题标题】:JavaScript puzzle to solve : window.confirm = divConfirm(strMessage)要解决的 JavaScript 难题:window.confirm = divConfirm(strMessage)
【发布时间】:2011-01-04 15:10:18
【问题描述】:

场景是:旧网站已经写了很多 JS 代码。如果用户想将所有警报消息更改为基于 JQuery、YUI、Prototype 等非常常见的新时代爵士 Div 警报。
主要有tree JS dialogs
1.提醒

要改变这一点很简单,我们只需要编写新函数来显示 div 弹出窗口并显示消息,然后覆盖 window.alert

function showDivAlert(strMessage){
//div popup logic and code
}

window.alert = showDivAlert;

2.提示

这看起来也很容易编写函数来接受字符串并显示输入值的文本框。现在,由于返回动作是基于单击“确定”按钮的,所以在这里生活很容易。


function shoDivPromp(strMessage){
//div pop up to show the text box and accept input from the user
}
window.prompt = shoDivPromp;

3.确认

现在上面两个很容易覆盖和修改默认对话框,但确认有复杂性。
但是,默认的 JS 确认对话框会停止 JS 执行,并且当用户单击确定或取消时,会通过确定返回值 (true/false) 来恢复执行。但是,如果我们使用 div 弹出窗口,执行不会停止,这就是问题。
我们仍然可以实现确认,但在这种情况下,我们必须绑定 OK 和 CANCEL 案例的方法,这些方法将附加到 OK 和 CANCEL 按钮。有了这个函数签名就会像。 function newConfirm(msg, fun OkAction(), fun CancelAction)

现在这是一个问题,它不能帮助我改变整个站点的确认对话框,就像我们对 alert() 所做的那样; 问题
我不确定它是否可能实现,但我认为可以使用一些 JS 模式。如果可能,请告诉我。

【问题讨论】:

  • 我不明白你如何解决提示但不确认。如何获取提示调用的输入值?
  • 哦,我认为你是对的,我没有抓住重点,提示对话框也存在关于确认同步的问题......抱歉,我在思考时错过了这个。

标签: asp.net javascript jquery ajax


【解决方案1】:

现在的问题是,这不能帮助我改变整个站点的确认对话框,就像我们对 alert() 所做的那样;

没错。无法在原生 JavaScript 中重现警报/确认/提示功能的同步特性。有一种非标准方法showModalDialog 可以使用单独的弹出式文档来实现,但并非所有浏览器都支持它,并且通常被认为是非常不可取的。

所以插件替换策略行不通。您将不得不更改脚本其余部分中调用这些方法的每个位置。

通常的模式是使用内联匿名函数来实现,使用闭包来保存局部变量,例如。替换:

function buttonclick() {
    var id= this.id;
    if (confirm('Are you sure you want to frob '+id+'?'))
        frob(id);
    wipe(id);
}

与:

function buttonclick() {
    var id= this.id;
    myConfirm('Are you sure you want to frob '+id+'?', function(confirmed) {
        if (confirmed)
            frob(id);
        wipe(id);
    });
}

如果您需要保留this,则需要查看进一步的嵌套闭包或 function.bind 来执行此操作。如果您在循环中拨打confirm,事情就会变得更加困难。

显然,您还必须确保在确认框打开时关键全局状态不会改变。通常,通过将页面的其余部分变灰并覆盖以阻止点击通过,可以将这种风险降到最低。但是,如果您有超时,它们仍然可以触发。

【讨论】:

  • +1,我认为更新这样的旧网站的一部分是消除模态框的同步特性,并尽可能多地异步工作。没有人喜欢网页上的模态弹出窗口。
【解决方案2】:

所有 3 个方法实际上都会停止 js 执行,而不仅仅是确认,因为它们都是模态对话框。就个人而言,我会尽量保持一切异步,因为模式对话框会阻止与当前文档的交互。

您最好的选择是按照您自己的建议使用新确认弹出窗口中的回调函数。

我很难准确理解您想要实现的目标。听起来您想要执行以下操作:

  • 运行一些 javascript 代码
  • 显示“确认”框
  • 等到确定按钮或取消按钮被点击
  • 当用户点击ok时继续代码,当用户点击cancel时返回。

您想要这样做的原因是,使用回调函数覆盖函数需要重写使用确认函数的每一段代码。如果您需要我的建议,我会继续重写代码,使其异步执行。如果不锁定包含对话框的“确定”和“取消”操作的文档,则无法延迟脚本执行。

【讨论】:

    【解决方案3】:

    如果您更改了警报/提示/确认角色。减慢执行挂起的用户交互以运行以下代码。

    覆盖这些函数,代码继续执行。

    要实现这一点,您必须修改代码的每个部分并像使用异步函数一样工作。

    然后你可以使用任何windows插件sexy-alert-box,覆盖Alert/Prompt/Confirm

    【讨论】:

      【解决方案4】:

      函数签名就是:

       function newConfirm(msg, okAction, cancelAction);
      

      并将用作:

       function newConfirm(msg, okAction, cancelAction){
         var ok = doWhateverPromptIsNecessary();
         if (ok) {
           okAction();
         } else {
           cancelAction();
         }
       }
      

      也就是说,要将函数“指针”作为参数传递给函数,只需传入不带 () 的函数名即可。函数签名是一样的。

      【讨论】:

      • 是的,您是正确的,但我正在寻找一些可以在函数体内执行此操作的神奇模式。这只能帮助我覆盖 window.confirm = confirm(str) 对话框。上面唯一的问题是我必须更改代码中已经使用的所有 confim 的调用。
      • 很遗憾,正如其他人所指出的那样,这是不可能的。
      猜你喜欢
      • 2023-02-02
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 2020-04-12
      • 2012-01-25
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多