Safari 5.1 с функцией подсказки () и отмены - PullRequest
16 голосов
/ 08 сентября 2011

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

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

Ответы [ 5 ]

3 голосов
/ 08 сентября 2011
var res = prompt('hello?', '')
if (res === null || res === '' && isSafari && confirm('was that cancel?'))
    cancel
3 голосов
/ 08 сентября 2011

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

Единственное, что я могу предложить, это вставить пробел в поленачать с.Только кнопка «ОК» вернет пробел, отмена вернет ноль или пустую строку.

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 'вместо отмены, но такой случай может также быть отменой.

2 голосов
/ 09 сентября 2011

Мне удалось найти реальный обходной путь, так как 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), выполнить следующий 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.

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

0 голосов
/ 09 июля 2015

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

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

if(p!==null)   {    location = p;    alert("ok do query");   }
0 голосов
/ 08 сентября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...