【问题标题】:JS - custom "confirm" dialogJS - 自定义“确认”对话框
【发布时间】:2016-02-05 09:01:18
【问题描述】:

我正在尝试替换在 JS 上使用 confirm 警报时弹出的基本对话框。 (没有 jQuery)
基本上我正在尝试启动一个打开弹出窗口的函数,将我想要运行的命令作为参数传递。然后该命令将作为onClick 函数添加到相应的按钮。

这是一个准系统示例,其中命令可以是 window.open('location') 或 function(par1,par2); function2(par1); 或简单的 stuff.innerHTML = 'foo'

function confirm(command) {
    openPopup();
    popup_button_close.onclick = function(){ closePopup(); };
    popup_button.onclick = function(){ command; closePopup(); };
}

不幸的是,上面的示例不起作用,我猜是因为字符串没有被解释为实际代码,并且弹出窗口在不执行命令的情况下关闭。

您认为最好的方法是什么?使用eval() 会是一个有效的选项吗?
我是在正确的道路上还是应该用回调重新考虑整个事情?
因为我的理解是,通过回调,我需要硬编码对确认按钮的每个响应,而不是像我在这里尝试做的那样动态地传递它,这不是一个选择。

【问题讨论】:

  • 我建议将command 设为回调函数,或者为回调添加另一个参数。如果eval 是解决方案,则可能有问题。
  • 是的,我也得出了这个结论,事实上eval() 是我最后的解决方案,以防任何其他选项失败。无论如何,不​​是把command 变成一个回调函数,使它成为一个固定的函数,而不是我想要实现的灵活的解决方案吗?
  • 不应该,你可以在调用时传递一个匿名函数,confirm(function() { /* do stuff */ });。
  • 避免 window.open 并在页面内容上使用绝对定位的 div。
  • 我无法避免,而且我知道它会导致回调出现问题,新窗口被阻止。

标签: javascript callback popup eval confirm


【解决方案1】:

最后我发现,我必须传递一个包含函数的 var,而不是传递一个字符串。
代码现在看起来像这样并且完美运行:

var command = new Function(string);
function confirm(command) {
    openPopup();
    popup_button_close.onclick = function(){ closePopup(); };
    popup_button.onclick = function(){ command(); closePopup(); };
}

【讨论】:

    【解决方案2】:

    您可以利用setTimeout() 接受字符串作为完整语句:

    function confirm(command) { // as a string "func(p1, p2, ...)"
        openPopup();
        popup_button.onclick = function(){
          setTimeout(command, 10);
        };
        closePopup();
    }
    

    这样您还可以减少代码,因为关闭弹出窗口不需要事件绑定。

    【讨论】:

      猜你喜欢
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2011-10-19
      相关资源
      最近更新 更多