Safari 5.1 prompt()函数并取消

时间:2011-09-08 16:04:15

标签: javascript safari

在大多数浏览器(包括较旧版本的Safari)中,当用户点击“取消”时,Javascript prompt函数返回null,如果用户点击“确定”则返回空字符串文本框。但是在Safari 5.1中,它会为两种情况返回空字符串。

我使用Safari的“报告错误”功能向Apple报告,但谁知道什么时候他们甚至可以承认它更少修​​复它。有没有人有解决方法?

5 个答案:

答案 0 :(得分:3)

var res = prompt('hello?', '')
if (res === null || res === '' && isSafari && confirm('was that cancel?'))
    cancel

答案 1 :(得分:3)

我欣赏抬头 - 我没有注意到这种行为,但现在我发现你是正确的。 Safari 5行为正常,5.1为按钮单击返回空字符串,如果在提示字段中有空字符串。

我唯一的建议是在字段中放置一个空格字符。 只有'OK'按钮才会返回空格,cancel将返回null或空字符串。

var p=prompt('what dya say?',' ');
if(!p)// cancel was *probably* clicked
else if(p===' ')//ok was clicked with no input
else// there is user input

用户可以开始输入内容,将其删除,然后点击“确定”而不是取消, 但是那种情况也可以 取消。

答案 2 :(得分:2)

我设法提出了一个真正的解决方法,因为Safari在5.1中添加了对showModalDialog()的支持。非常方便,那个。

首先,使用以下内容创建一个文件:

<html>
<head>
<title>Prompt</title>
<script type="text/javascript">
function a(){
        if(window.dialogArguments.length > 0)
                document.getElementById('a').textContent = window.dialogArguments[0]+'\n\n';
        if(window.dialogArguments.length > 1)
                document.getElementById('b').value = window.dialogArguments[1];
        document.getElementById('b').focus();
}

function s(b){
        window.returnValue=b?document.getElementById('b').value:null;
        window.close();
}

function kp(e){
        if(!e.DOM_VK_ENTER) e.DOM_VK_ENTER=13;
        if(!e.DOM_VK_RETURN) e.DOM_VK_RETURN=13;
        if(!e.DOM_VK_ESCAPE) e.DOM_VK_ESCAPE=27;

        switch(e.keyCode){
          case e.DOM_VK_ENTER:
          case e.DOM_VK_RETURN:
            if(e.preventDefault) e.preventDefault();
            if(e.stopPropagation) e.stopPropagation();
            e.returnValue = false;
            e.cancelBubble = true;
            s(1);
            return false;

          case e.DOM_VK_ESCAPE:
            if(e.preventDefault) e.preventDefault();
            if(e.stopPropagation) e.stopPropagation();
            e.returnValue = false;
            e.cancelBubble = true;
            s(0);
            return false;

          default:
            return true;
        }
}
</script>
<body style="text-align:center;white-space:pre-wrap" onload="a()">
<span id="a"></span>
<input type="text" id="b" onkeydown="return kp(event)" /><input type="button" value="Ok" onclick="s(1)" /><input type="button" value="Cancel" onclick="s(0)" />
</body>
</html>

然后,对于破解版本的Safari(似乎无法在没有弹出提示并要求用户点击“取消”的情况下进行功能检测,因此您可能需要进行用户代理检查),执行以下Javascript以替换window.prompt

(function(){
        if(window.console && window.console.log)
                window.console.log('Applying bugfix for Safari 5.1\'s prompt()');
        var oldprompt = window.prompt;
        window.prompt = function() {
                return showModalDialog(location.protocol+'//'+location.host+'/js/safari-5.1-bugfix.html', arguments);
        };
        window.prompt.$orig = oldprompt;
})();

当然,将路径/js/safari-5.1-bugfix.html更改为服务器上上创建的HTML文件的正确路径。不幸的是,我们无法使用data: URI,因为Safari显然有另一个错误,它会丢失window.dialogArguments而忽略window.returnValue来查找带有data: URI的对话框。< / p>

然后您可以像往常一样使用prompt()

答案 3 :(得分:0)

我试过,这对我有用

    var location="";
    var p=prompt("type your location",location ); 

if(p!==null)   {    location = p;    alert("ok do query");   }

答案 4 :(得分:-1)

当然,其实有两个。

首先是显而易见的,重新设计你的系统,使空字符串不是有效的响应。想一想,在谈话中,一个人在你的问题的实际答案中茫然地盯着你是否可以接受?

第二个是使用模态对话框(如jQuery)来询问此信息。您将完全控制它,并且应用程序看起来不像1996年制作的那样。