窗口警告和确认可用,但提示不可用。

4

我想要显示一个JavaScript提示框,让用户输入数据(就像常规的提示框一样)。但是它没有显示出来。window.alert和window.confirm都能够正常弹出,但是prompt却不行。 以下是我尝试运行的代码:

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语句被执行。第一个提示框应该会显示“yes”。但是,它跳过了提示输入的那一行代码。接下来的提示框会显示“Undefined”。
现在,如果我只将关键字prompt更改,如下所示,它就能工作:
var is_expired = document.getElementById("is_expired").value;
    if (is_expired == "yes") {
        alert(is_expired);
        var answer = confirm("Are you sure you?");
        alert(answer);
    }

当我运行代码时,确认框会出现。如果我点击“确定”,那么下一个警告框就会显示“true”,如果我点击“取消”,警告框就会显示“false”。 因此,这里的重点是没有语法错误导致Javascript停止运行。它实际上跳过了那一行并继续执行。那一行有什么问题?我检查了多个网站以确保它是正确的。 添加第二个“default”参数也没有帮助。我尝试过了。而且,没有JavaScript错误来指示问题。 我去了这里,将其改为我的代码(我硬编码is_expired为yes),在那里它可以工作。 任何帮助都将是很棒的。谢谢。 编辑:要明确一点,我不依赖W3school的示例是准确的,我使用他们的“尝试一下”页面来测试自己的代码。我也在jFiddle上做过这个,它可以正常工作。使用控制台检查函数返回“未定义”。 编辑2:实际上,划掉那句话。当控制台中没有命令时,我不小心再次按下了回车键。prompt的实际输出是:
[12:07:55.940] [object Function]

6
页面中是否有其他 JavaScript?你有任何可能会覆盖window.prompt方法的库吗?console.log(window.prompt)会显示什么? - gen_Eric
1
控制台有任何警告吗?console.log(window.prompt) - worenga
1
执行 alert(window.prompt); - 它会显示什么? - Yuriy Galanter
2
@tryingToGetProgrammingStraight:他只是使用了他们的例子,而且可能不知道。这并不值得-1。 - gen_Eric
2
@Troncoso:你可以尝试几件事情。delete window.prompt; 可以删除覆盖并替换原始方法。如果不行,你可以尝试从 iframe 中“窃取”它。查看此答案获取更多信息:https://dev59.com/QWw05IYBdhLWcg3wsz7N#7081490(只需将 console 替换为 prompt) :) - gen_Eric
显示剩余16条评论
3个回答

3

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

2
在函数中声明变量时,请确保使用var关键字,以避免覆盖全局命名空间。听起来您在某个地方这样做了:
function my_thing() {
    var i = 0;
    var j = 0;
    prompt = "What the heck";
}

省略 var 关键字会将 prompt 放在全局命名空间中,覆盖默认的 prompt 函数。

1
根据他的问题,似乎被一个函数覆盖了,否则第二个警告框不会弹出,而是会抛出TypeError。 - Christoph
@Christoph:虽然可能是出于同样的原因。假设他执行了 function prompt(){} 或者 prompt = function(){}; - gen_Eric

2

正如建议的那样,你的代码中有些东西覆盖了 window.prompt 方法,使用的是 function prompt(s) { window.status = s }。不确定这是否是有意为之。

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

  1. You can backup the original at the very start of your page:

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

    Then use originalPrompt instead:

    var answer = originalPrompt("Are you sure you?");
    
  2. You can delete window.prompt; (or set window.prompt = null;), though this may not work in all browsers.

  3. You can create an iframe (which creates a new window environment), and then "steal" the prompt from there.

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接