Safari 5.1 prompt()函数并取消

Ano*_*mie 16 javascript safari

在大多数浏览器(包括旧版本的Safari)中,Javascript prompt函数null在用户单击"取消"时返回,如果用户在文本框中没有任何内容单击"确定",则返回空字符串.但是在Safari 5.1中,它会返回两个案例的空字符串.

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

Ano*_*mie 2

showModalDialog()自从 Safari在 5.1 中添加了对 Safari 的支持以来,我已经设法想出了一个真正的解决方法。非常方便,那个。

首先,创建一个包含以下内容的文件:

<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>
Run Code Online (Sandbox Code Playgroud)

然后,对于损坏的 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;
})();
Run Code Online (Sandbox Code Playgroud)

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

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