【问题标题】:window.alert and confirm work, but not promptwindow.alert 并确认工作,但不提示
【发布时间】:2013-09-09 15:39:59
【问题描述】:

我正在尝试显示一个 Javascript 提示以供用户输入数据(作为提示的用途)。但是,它不会显示。 window.alert 显示,window.confirm 也显示。但是,不及时。 这是我要运行的代码:

var is_expired = document.getElementById("is_expired").value;
    if (is_expired == "yes") {
        alert(is_expired);
        var answer = prompt("Are you sure you?");
        alert(answer);
    }

当它运行时,将输入 if 语句。第一个警报应显示“是”。但是,它会跳过提示行。下一个警报显示“未定义”。

现在,如果我唯一更改的是关键字提示,它将起作用,如下所示:

var is_expired = document.getElementById("is_expired").value;
    if (is_expired == "yes") {
        alert(is_expired);
        var answer = confirm("Are you sure you?");
        alert(answer);
    }

当我运行它时,会出现确认框。如果我单击 Okay,则下一个警报会显示“true”,如果单击 Cancel,则警报会显示“false”。

所以,这里最大的收获是没有导致 Javascript 停止的语法错误。它实际上跳过了那一行并继续执行。那条线有什么问题?我检查了多个站点以确保它是正确的。 添加第二个“默认”参数也无济于事。我试过了。此外,没有 Javascript 错误表明问题。

我去了 here 并将其更改为我的代码(我将 is_expired 硬编码为是),它在那里工作。

任何帮助都会很棒。谢谢。

编辑:要清楚,我不依赖 W3school 的示例来准确,我使用他们的“试用”页面来测试我自己的代码。我也在 jfiddle 上做了这个,效果很好。使用控制台检查函数返回“未定义”。

EDIT2:实际上,从头开始。当控制台中没有命令时,我不小心再次按了 Enter。提示的实际输出是:

[12:07:55.940] [object Function]

【问题讨论】:

  • 在这里工作正常:jsfiddle.net/j08691/zDZQK。你使用的是什么浏览器?你能在 jsFiddle 上重现这个问题吗?
  • 页面上还有哪些其他 JavaScript?您是否有任何库可能会覆盖 window.prompt 方法? console.log(window.prompt) 显示什么?
  • 控制台中有任何警告吗? console.log(window.prompt)
  • @tryingToGetProgrammingStraight:他只是在使用他们的例子,而且他可能不知道。那不值得-1。
  • @Troncoso:您可以尝试一些事情。 delete window.prompt; 应该删除该覆盖并替换原始方法。如果没有,您可以尝试从 iframe 中“窃取”它。有关更多信息,请参阅此答案:stackoverflow.com/a/7081490(只需将console 替换为prompt):)

标签: javascript


【解决方案1】:

如建议的那样,您的代码中的某些内容已用function prompt(s) { window.status = s } 覆盖了window.prompt 方法。不确定这是不是故意的。

您可以使用几种方法来“恢复”原始prompt

  1. 您可以在页面的开头备份原件:

    var originalPrompt = window.prompt;
    // Whatever code is on your page
    function prompt(s) { window.status = s }
    

    然后改用originalPrompt

    var answer = originalPrompt("Are you sure you?");
    
  2. 您可以delete window.prompt;(或设置window.prompt = null;),但这可能不适用于所有浏览器。

  3. 您可以创建一个 iframe(它会创建一个新的 window 环境),然后从那里“窃取”prompt

    var i = document.createElement('iframe');
    i.style.display = 'none';
    document.body.appendChild(i);
    window.prompt = i.contentWindow.prompt;
    

【讨论】:

    【解决方案2】:

    prompt 应该几乎可以在每个浏览器中使用。一种可能性是检查您是否没有在源代码的某处意外覆盖此函数。如果您在网站上的浏览器控制台中输入prompt,它应该会显示如下内容:

    > prompt
    function prompt() { [native code] }
    
    // or put in your code:
    alert(window.promt);
    

    否则它会以某种方式被覆盖(很可能是因为忘记了 var 关键字):

    > prompt = function(){alert("foo!")}
    > prompt
    function (){alert("foo")}
    
    // calling prompt() would now pop an alert box
    

    【讨论】:

      【解决方案3】:

      在函数中声明变量时,请确保使用var 关键字,以免破坏全局命名空间。听起来你在某处这样做:

      function my_thing() {
          var i = 0;
          var j = 0;
          prompt = "What the heck";
      }
      

      省略 var 关键字会将 prompt 置于全局命名空间中,破坏默认的 prompt 函数。

      【讨论】:

      • 根据他的问题,它似乎被一个函数覆盖了,否则第二个警报不会弹出而是抛出一个TypeError。
      • @Christoph:虽然可能是出于同样的原因。假设他做了function prompt(){}prompt = function(){};
      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      相关资源
      最近更新 更多