Подтвердить что ты не робот

"alert()" и "confirm()" не работает с "apple-mobile-web-app-able"

В iOS (в настоящее время 7.0) это выглядит так: alert() и confirm() не работают, когда наше веб-приложение прикреплено к главному экрану (также известный как метатег apple-mobile-web-app-capable).

Я нашел пользователя с аналогичной проблемой в twitter:

https://twitter.com/thomasfuchs/status/380137801259704320

У кого-то есть временное исправление, если это действительно ошибка в iOS 7?

4b9b3361

Ответ 1

Исправлены ошибки JavaScript alert() и confirm() с iOS 7.0.3.

Ответ 2

У нас была аналогичная проблема с предупреждениями, нарушающими наше веб-приложение. Конкретным случаем было предупреждение, которое было вызвано из обмена избранным списком. Мы собрали очень простую тестовую страницу следующим образом:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title></title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width">
    </head>
    <body>
        <select onchange="alert('broken!');">
            <option value="one">One</option>
            <option value="two">Two</option>
        </select>
    </body>
</html>

Запуск этой страницы из Safari в iPad и изменение списка выбора вызывает предупреждение, затем Safari замерзает. Фактически вам нужно закрыть Safari. Это влияет на Safari в целом - ваше веб-приложение не нужно привязывать к главному экрану. Вы должны проверить это на iPad под управлением iOS 7 на этой тестовой странице http://jsbin.com/AGoTejA/1.

Мы протестировали это на iPad 2 (MC774B/A), а iPad 3 (MD367B/A) и Safari сбой на обоих.

Хакерный способ обойти это - использовать setTimeout() для задержки выполнения предупреждения. Проблема только возникает, когда Safari пытается отобразить наложение, которое одновременно отображает элементы списка избранного и предупреждение. Подтвердить() также нарушено таким же образом.

Ответ 3

Я не знаю, по дизайну или ошибке, но я могу подтвердить, что это настоящая проблема. Еще одна вещь, о которой стоит помнить, заключается в том, что если у пользователя есть возможность сохранить пароли, любой сайт, требующий входа в систему, потерпит неудачу, потому что это приглашение также заблокировано. (вы можете попробовать это с простой формой с полем имени пользователя и пароля, а ничего больше и просто не представите). Есть обходные пути, хотя по всем трем вопросам.

  • Вход - установите autocomplete = "off" в теге формы для сайта или обнаружите, что на сайте работает IOS7 и в полноэкранном режиме, и примените этот параметр

    $('form').attr('autocomplete', 'off');
    
  • Оповещения и подтверждения - вы можете либо написать пользовательскую функцию в JavaScript, либо переопределить существующие функции так же, как здесь: http://andrewensley.com/2012/07/override-alert-with-jquery-ui-dialog/. Мне нравится использовать плагин Eric Martin SimpleModal, который имеет встроенное подтверждение подтверждения, нижнюю демонстрацию на http://www.ericmmartin.com/projects/simplemodal-demos/.

Я надеюсь, что это поможет.

Ответ 4

Я решил с помощью setTimeout

<select onchange="setTimeout(function(){alert('not broken!');},200)">
                <option value="one">One</option>
                <option value="two">Two</option>
            </select>

http://jsbin.com/iPuXiVA/4/

В любом случае, кажется, эта ошибка поражает iPad, а не iPhone.

Ответ 5

Я думаю, что ошибка, связанная с плавным отображением ячеек анимации. Мне не нравятся хаки, но этот метод работает. Подтверждение вызвано через 100 мс (этого достаточно для того, чтобы окно выбора закрывалось)

var object;

$('form select').change(function()
{
    object = $(this);
    timer = setTimeout(confirmation, 100);
});

function confirmation()
{
    switch(object.val())
    {
        case 'post_approved':
        case 'post_delete':
        case 'thread_delete': object.parent('form').find('input[name=id]').val(object.parent('form').find('input[name=post_id]').val()); break;
        case 'user_delete_all': object.parent('form').find('input[name=id]').val(object.parent('form').find('input[name=user_id]').val()); break;
        default: return false; break;
    }

    if(object.parent('form').find('input[name=act]').val() === 'post_approved'  || (object.parent('form').find('input[name=act]').val() != '' && confirm('Вы уверены?')))
        object.parent('form').submit();
    else
        return false;
}

Ответ 6

Андерсен прав:

ошибки javascript alert() и подтверждения() исправлены с iOS7.0.3

только что установил и протестировал его сам.

Пока Apple исправляла проблему, я взбирался, чтобы найти что-то для ее работы, и в итоге нашел плагин js под названием Alertify, который, как я думал, стоит поделиться. Я думаю, что я буду использовать его с этого момента, независимо от исправления ошибок! Он просто делает предупреждения, подсказки и т.д., Действительно, действительно хорошими. Думал, что это стоит того, что читатели этого сообщения, вероятно, используют стандартные предупреждения браузера. Я был спокоен, чтобы наткнуться на него.