在 iOS(当前为 7.0)下,当我们的 web 应用程序被固定到主屏幕时(也就是使用 meta 标签),它看起来好像alert()
并且confirm()
不工作apple-mobile-web-app-capable
。
我在推特上发现一个用户有类似的问题:
https://twitter.com/thomasfuchs/status/380137801259704320
如果它真的是iOS 7中的一个错误,有人有临时修复吗?
在 iOS(当前为 7.0)下,当我们的 web 应用程序被固定到主屏幕时(也就是使用 meta 标签),它看起来好像alert()
并且confirm()
不工作apple-mobile-web-app-capable
。
我在推特上发现一个用户有类似的问题:
https://twitter.com/thomasfuchs/status/380137801259704320
如果它真的是iOS 7中的一个错误,有人有临时修复吗?
我们遇到了类似的问题,警报破坏了我们的 Web 应用程序。具体情况是从选择列表的 onchange 触发的警报。我们整理了一个非常简单的测试页面,如下所示:
<!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>
在 iPad 中从 Safari 运行该页面并更改选择列表会触发警报,然后 Safari 会冻结。您实际上必须关闭 Safari。这通常会影响 Safari - 您的 Web 应用程序不必固定在主屏幕上。您应该能够在此测试页面http://jsbin.com/AGoTejA/1上运行 iOS 7 的 iPad 上对此进行测试。
我们已经在 iPad 2 (MC774B/A) 和 iPad 3 (MD367B/A) 上对此进行了测试,Safari 在两者上都崩溃了。
解决此问题的一种巧妙方法是使用 setTimeout() 来延迟警报的执行。只有当 Safari 尝试同时显示选择列表项和警报时,才会出现此问题。confirm() 也以同样的方式被破坏。
JavaScriptalert()
和confirm()
错误自 iOS 7.0.3 起已修复。
我不知道这是设计使然还是错误,但我可以确认这是一个真正的问题。要注意的另一件事是,如果用户可以选择保存密码,则任何需要登录的站点都将失败,因为该提示也被阻止。(您可以使用带有用户名和密码框的简单表单来尝试此操作,仅此而已,它根本不会提交)。尽管所有三个问题都有解决方法。
登录 - 在站点的表单标签中设置 autocomplete="off",或检测站点正在运行 IOS7 并处于全屏模式并应用此设置
$('form').attr('autocomplete', 'off');
警报和确认 - 您可以在 JavaScript 中编写自定义函数或以与此处大致相同的方式覆盖现有函数:http: //andrewensley.com/2012/07/override-alert-with-jquery-ui-dialog/ . 我喜欢使用 Eric Martin 的 SimpleModal 插件,它有一个内置的 Confirm override,在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。
我使用以下代码发生了这种情况:
const confirmation = window.confirm(message || 'Are you sure?');
确认将显示在 PC(Edge 浏览器)上,但不会显示在 iPhone(Safari 浏览器)上
我将代码更改为以下(删除了窗口。):
const confirmation = confirm(message || 'Are you sure?');
突然它又开始工作了。
我猜苹果有自己的确认实现不需要窗口。
安徒生是正确的:
从 iOS7.0.3 开始修复的 javascript alert() 和 confirm() 错误
刚刚自己安装并测试过。
在 Apple 解决此问题时,我争先恐后地寻找解决方法,最终找到了一个名为 Alertify 的 js 插件,我认为这值得分享。我想我会从现在开始使用它,不管错误修复如何!它只是让警报、提示等看起来非常非常好。认为值得分享,因为这篇文章的读者可能会使用标准的浏览器警报。我很兴奋地偶然发现它。
我认为与平滑隐藏选择框动画有关的错误。我不喜欢黑客,但这种方法有效。在 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;
}