Ответ 1
Исправлены ошибки JavaScript alert()
и confirm()
с iOS 7.0.3.
В iOS (в настоящее время 7.0) это выглядит так: alert()
и confirm()
не работают, когда наше веб-приложение прикреплено к главному экрану (также известный как метатег apple-mobile-web-app-capable
).
Я нашел пользователя с аналогичной проблемой в twitter:
https://twitter.com/thomasfuchs/status/380137801259704320
У кого-то есть временное исправление, если это действительно ошибка в iOS 7?
Исправлены ошибки JavaScript alert()
и confirm()
с iOS 7.0.3.
У нас была аналогичная проблема с предупреждениями, нарушающими наше веб-приложение. Конкретным случаем было предупреждение, которое было вызвано из обмена избранным списком. Мы собрали очень простую тестовую страницу следующим образом:
<!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 пытается отобразить наложение, которое одновременно отображает элементы списка избранного и предупреждение. Подтвердить() также нарушено таким же образом.
Я не знаю, по дизайну или ошибке, но я могу подтвердить, что это настоящая проблема. Еще одна вещь, о которой стоит помнить, заключается в том, что если у пользователя есть возможность сохранить пароли, любой сайт, требующий входа в систему, потерпит неудачу, потому что это приглашение также заблокировано. (вы можете попробовать это с простой формой с полем имени пользователя и пароля, а ничего больше и просто не представите). Есть обходные пути, хотя по всем трем вопросам.
Вход - установите 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/.
Я надеюсь, что это поможет.
Я решил с помощью setTimeout
<select onchange="setTimeout(function(){alert('not broken!');},200)">
<option value="one">One</option>
<option value="two">Two</option>
</select>
В любом случае, кажется, эта ошибка поражает iPad, а не iPhone.
Я думаю, что ошибка, связанная с плавным отображением ячеек анимации. Мне не нравятся хаки, но этот метод работает. Подтверждение вызвано через 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;
}
Андерсен прав:
ошибки javascript alert() и подтверждения() исправлены с iOS7.0.3
только что установил и протестировал его сам.
Пока Apple исправляла проблему, я взбирался, чтобы найти что-то для ее работы, и в итоге нашел плагин js под названием Alertify, который, как я думал, стоит поделиться. Я думаю, что я буду использовать его с этого момента, независимо от исправления ошибок! Он просто делает предупреждения, подсказки и т.д., Действительно, действительно хорошими. Думал, что это стоит того, что читатели этого сообщения, вероятно, используют стандартные предупреждения браузера. Я был спокоен, чтобы наткнуться на него.