在iOS(目前为7.0)下,当我们的网络应用固定到主屏幕时(例如,使用元标记alert()
),看起来confirm()
和apple-mobile-web-app-capable
无效。
我发现用户在Twitter上有类似的问题:
https://twitter.com/thomasfuchs/status/380137801259704320
任何人都有临时修复,如果它真的是iOS 7中的错误吗?
答案 0 :(得分:14)
我们遇到类似的问题,警报破坏了我们的网络应用。具体情况是从选择列表的更改触发的警报。我们整理了一个非常简单的测试页面:
<!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()也以同样的方式被打破。
答案 1 :(得分:8)
从iOS 7.0.3开始修复了JavaScript alert()
和confirm()
错误。
答案 2 :(得分:5)
我不知道这是设计还是错误,但我可以确认这是一个真正的问题。另一件需要注意的事情是,如果用户可以选择启用保存密码,则任何需要登录的站点都将失败,因为该提示也被阻止。 (您可以使用带有用户名和密码框的简单表单来尝试此操作,而不会提交任何其他内容。但是对于所有三个问题都有解决方法。
登录 - 在网站的表单标记中设置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/上的底部演示。
我希望其中一些有帮助。
答案 3 :(得分:4)
我用setTimeout
解决了<select onchange="setTimeout(function(){alert('not broken!');},200)">
<option value="one">One</option>
<option value="two">Two</option>
</select>
无论如何,似乎这个错误困扰着iPad,而不是iPhone。
答案 4 :(得分:0)
我认为这是一个与平滑隐藏选择框动画相关的bug。 我不喜欢黑客,但这种方法有效。 确认在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;
}
答案 5 :(得分:0)
安徒生是对的:
javascript alert()和confirm()修复了自iOS7.0.3以来的错误
我自己安装并测试过它。
虽然Apple正在解决这个问题,但我还是想找到解决问题的方法,最后找到一个名为Alertify的js插件,我认为这值得分享。我想我会从现在开始使用它,无论错误修复!它只是使警报,提示等看起来真的非常好。认为这是值得分享,因为这篇文章的读者可能使用标准浏览器警报。我被引诱绊倒了它。
答案 6 :(得分:0)
我通过以下代码实现了这一点:
const confirmation = window.confirm(message || 'Are you sure?');
确认将显示在PC(Edge浏览器)上,而不显示在iPhone(Safari浏览器)上
我将代码更改为以下代码(删除了 窗口。 ):
const confirmation = confirm(message || 'Are you sure?');
突然又恢复正常了。
我想苹果公司有自己的 确认 实现,不需要 窗口。 < / p>