Функция приглашения Safari 5.1() и отмена

В большинстве браузеров (включая более старые версии Safari) функция Javascript prompt возвращает null, когда пользователь нажимает "Отмена" и пустая строка, если пользователь нажимает "ОК" ничем в текстовом поле. Но в Safari 5.1 он возвращает пустую строку для обоих случаев.

Я использовал функцию "Сообщить об ошибке" Safari, чтобы сообщить об этом Apple, но кто знает, когда они могут даже признать это гораздо реже. У кого-нибудь есть обход?

Ответы

Ответ 1

Мне удалось найти реальное обходное решение, так как Safari добавила поддержку showModalDialog() в 5.1. Ужасно удобно, что.

Сначала создайте файл с этим контентом:

<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 (кажется, нет возможности распознать это без появления подсказки и просить пользователя нажать "Отмена", поэтому вам, вероятно, придется выполнить проверку User-Agent), замените window.prompt следующим Javascript:

(function(){
        if(window.console && window.console.log)
                window.console.log('Applying bugfix for Safari 5.1\ 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.

Затем вы можете использовать prompt(), как обычно.

Ответ 2

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

Ответ 3

Я высоко ценю головы - я не заметил этого поведения, но теперь вижу, что ты прав. Safari 5 ведет себя нормально, 5.1 возвращает пустую строку для нажатия любой кнопки, , если есть пустая строка в поле приглашения.

Мое единственное предложение - поставить пробел в поле для начала. Только кнопка "ОК" вернет пробел, 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

Пользователь мог начинать что-то вводить, удалять его, а затем удалять 'ok' вместо отмены, но этот случай может также быть отменен.

Ответ 4

Я пробовал, и это сработало для меня

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

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

Ответ 5

Конечно, два на самом деле.

Сначала очевидный, перепроектируйте свою систему, так что пустая строка не является допустимым ответом. Подумайте об этом, когда в разговоре приемлемо, чтобы один парень смотрел на вас глупо в ответ на ваш вопрос?

Второй - использовать модальные диалоги, такие как jQuery, для запроса этой информации. Вы получите полный контроль над ним, и приложение не будет выглядеть так, как будто оно было сделано в 1996 году.