Tôi đã tìm cách giải quyết thực sự, vì Safari đã thêm hỗ trợ cho showModalDialog()
trong 5.1. Awfully thuận tiện, đó.
Đầu tiên, tạo một tập tin với nội dung này:
<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>
Sau đó, cho các phiên bản bị hỏng của Safari (có vẻ là không có cách nào để tính năng phát hiện điều này mà không nảy lên một dấu nhắc và yêu cầu người dùng nhấn "Hủy", vì vậy có thể bạn sẽ phải làm một tấm séc User-Agent), thực hiện javascript sau đây để thay thế 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;
})();
Tất nhiên, thay đổi đường dẫn /js/safari-5.1-bugfix.html
để đúng đường dẫn đến tạo trên Tệp HTML trên máy chủ của bạn. Rất tiếc, chúng tôi không thể sử dụng số data:
URI vì Safari dường như có lỗi lỗi khác khi mất window.dialogArguments
và bỏ qua window.returnValue
cho các hộp thoại có data:
URI.
Sau đó, bạn có thể sử dụng prompt()
như bình thường.
Rất tốt, cảm ơn bạn! – Bibou