我在Twitter上找到一个用户遇到了类似的问题:
https://twitter.com/thomasfuchs/status/380137801259704320
如果iOS 7中真的存在错误,有人能提供临时解决方案吗?
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应用程序不必被固定到主屏幕上。你可以在运行iOS7的iPad上的测试页面上测试此功能。
我们在iPad 2(MC774B/A)和iPad 3(MD367B/A)上进行了测试,Safari在两者上都崩溃。
解决此问题的一种hacky方法是使用setTimeout()来延迟警报的执行。问题似乎只会在Safari尝试同时显示显示选择列表项和警报时出现。confirm()也有同样的问题。
iOS 7.0.3版本修复了JavaScript的alert()
和confirm()
的漏洞。
我不知道这是设计上的问题还是一个漏洞,但我可以确认这是个真正的问题。另外需要注意的一点是,如果用户已经启用了保存密码选项,任何需要登录的网站都将失败,因为那个提示也被阻止了。(你可以尝试使用一个只有用户名和密码框的简单表单来测试,它根本无法提交)。但是对于所有这三个问题都有解决方法。
Login - set autocomplete="off" in the form tag for the site, or detect that the site is running IOS7 and in fullscreen mode and apply this setting
$('form').attr('autocomplete', 'off');
Alerts and Confirms - you can either write a custom function in JavaScript or override the existing functions in much the same way as here: http://andrewensley.com/2012/07/override-alert-with-jquery-ui-dialog/. I like using Eric Martin's SimpleModal plugin which has a built in Confirm override, the bottom demo on 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>
无论如何,似乎这个bug只影响iPad而不是iPhone。我今天在iOS 16上注意到了这个问题 - 这将在几天后公开发布。很可能在之前的版本中也发生过,只是我没有注意到。
我有一些调试警报,当我点击某些按钮时会显示出来。它们在导航回去时使用滑动手势后就无法正常工作了。之后,围绕警报的所有逻辑都正确执行,但对话框却没有显示出来。
而且不,它并没有重新加载之前的网站版本,因为其他一切都如预期那样。
如果这是设计上的问题,我无法想象为什么会这样。
const confirmation = window.confirm(message || 'Are you sure?');
确认框在PC上会显示(Edge浏览器),但在iPhone上不会显示(Safari浏览器)。
我将代码更改为以下内容(删除了 window.):
const confirmation = confirm(message || 'Are you sure?');
我认为与平滑隐藏选择框动画相关的一个 bug。 虽然我不喜欢使用 hack,但这种方法可行。 在 100 毫秒后调用 Confirming(这足以等待选择窗口关闭)。
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;
}
Andersen 是正确的:
iOS 7.0.3 已修复了 javascript alert() 和 confirm() 的错误。
我刚刚安装并测试过了。
在 Apple 解决问题之时,我抓紧时间寻找解决方法,最终找到了一个叫做 Alertify 的 js 插件,我认为这值得分享。不管有没有 bug,我现在都会使用它!它可以让警告、提示等看起来非常好看。我认为这值得分享,因为本帖子的读者可能正在使用标准浏览器警报。我很高兴能够偶然发现它。