“alert()”和“confirm()”不支持“apple-mobile-web-app-capable”

在iOS(当前为7.0)下,当我们的Web应用程序固定到主屏幕(也就是使用元标记apple-mobile-web-app-capable )时, alert()confirm()不起作用。

我发现一个用户在twitter上有类似的问题:

任何人有一个临时修复,如果它真的是iOS 7中的错误?

JavaScript alert()confirm()错误从iOS 7.0.3开始是固定的。

我们有一个类似的问题,打破我们的Web应用程序的警报 具体的情况是从select列表的变化中触发的一个警报。 我们把这样一个非常简单的testing页面放在一起:

 <!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中运行该页面并更改select列表会触发警报,然后Safari会冻结。 你实际上必须closuresSafari。 这一般会影响Safari – 您的网页应用程序不必固定在主屏幕上。 您应该可以在此testing页面http://jsbin.com/AGoTejA/1上运行iOS 7的iPad上进行testing。

我们已经在iPad 2(MC774B / A)和iPad 3(MD367B / A)上testing了这一点,而且Safari在两者上都崩溃了。

解决这个问题的方法是使用setTimeout()来延迟执行警报。 这个问题似乎只发生在Safari试图显示叠加层的同时显示select列表项和警报。 confirm()也是以同样的方式断开的。

我不知道这是否是由devise或错误,但我可以证实这是一个真正的问题。 还有一件事要注意的是,如果用户可以select保存启用的密码,任何需要login的站点都将失败,因为该提示也被阻止。 (你可以用一个简单的表单用一个用户名和密码框来试试这个,没有其他的东西,它不会提交)。 尽pipe所有三个问题都有解决方法。

  1. login – 在站点的窗体标签中设置autocomplete =“off”,或者检测站点正在运行IOS7并在全屏模式下应用此设置

     $('form').attr('autocomplete', 'off'); 
  2. 警报和确认 – 您可以在JavaScript中编写自定义函数,也可以像在这里一样覆盖现有函数: http : //andrewensley.com/2012/07/override-alert-with-jquery-ui-dialog/ 。 我喜欢使用Eric Martin的SimpleModal插件,它有一个内置的确认覆盖,在http://www.ericmmartin.com/projects/simplemodal-demos/下面的演示&#x3002;

我希望有一些帮助。

我用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/

无论如何,似乎这个bug折磨iPad而不是iPhone。

我认为一个有关隐藏select框animation的错误。 我不喜欢黑客,但这种方法的作品。 在100 ms之后确认调用(在select窗口closures前,这个时间是足够的)

 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()和confirm()错误修复了iOS7.0.3以上版本

只是自己安装和testing。

当苹果解决这个问题的时候,我忙着寻找一些解决办法,最后find一个叫做Alertify的js插件,我认为这是值得分享的。 我想我会从现在开始使用它,无论修正错误! 它只是让警报,提示等看起来真的很好。 认为这是值得分享,因为这个职位的读者可能使用标准的浏览器警报。 我被绊倒了。