22

在 iOS(当前为 7.0)下,当我们的 web 应用程序被固定到主屏幕时(也就是使用 meta 标签),它看起来好像alert()并且confirm()不工作apple-mobile-web-app-capable

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

https://twitter.com/thomasfuchs/status/380137801259704320

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

4

7 回答 7

14

我们遇到了类似的问题,警报破坏了我们的 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() 也以同样的方式被破坏。

于 2013-09-23T12:54:28.673 回答
9

JavaScriptalert()confirm()错误自 iOS 7.0.3 起已修复。

于 2013-10-22T22:40:54.497 回答
5

我不知道这是设计使然还是错误,但我可以确认这是一个真正的问题。要注意的另一件事是,如果用户可以选择保存密码,则任何需要登录的站点都将失败,因为该提示也被阻止。(您可以使用带有用户名和密码框的简单表单来尝试此操作,仅此而已,它根本不会提交)。尽管所有三个问题都有解决方法。

  1. 登录 - 在站点的表单标签中设置 autocomplete="off",或检测站点正在运行 IOS7 并处于全屏模式并应用此设置

    $('form').attr('autocomplete', 'off');
    
  2. 警报和确认 - 您可以在 JavaScript 中编写自定义函数或以与此处大致相同的方式覆盖现有函数:http: //andrewensley.com/2012/07/override-alert-with-jquery-ui-dialog/ . 我喜欢使用 Eric Martin 的 SimpleModal 插件,它有一个内置的 Confirm override,在http://www.ericmmartin.com/projects/simplemodal-demos/的底部演示。

我希望其中一些有所帮助。

于 2013-09-20T21:03:17.173 回答
4

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

无论如何,似乎这个错误困扰着 iPad 而不是 iPhone。

于 2013-10-21T19:28:42.060 回答
1

我使用以下代码发生了这种情况:

const confirmation = window.confirm(message || 'Are you sure?');

确认将显示在 PC(Edge 浏览器)上,但不会显示在 iPhone(Safari 浏览器)上

我将代码更改为以下(删除了窗口。):

const confirmation = confirm(message || 'Are you sure?');

突然它又开始工作了。

我猜苹果有自己的确认实现不需要窗口。

于 2020-05-26T15:19:04.013 回答
0

安徒生是正确的:

从 iOS7.0.3 开始修复的 javascript alert() 和 confirm() 错误

刚刚自己安装并测试过。

在 Apple 解决此问题时,我争先恐后地寻找解决方法,最终找到了一个名为 Alertify 的 js 插件,我认为这值得分享。我想我会从现在开始使用它,不管错误修复如何!它只是让警报、提示等看起来非常非常好。认为值得分享,因为这篇文章的读者可能会使用标准的浏览器警报。我很兴奋地偶然发现它。

于 2013-10-24T04:37:19.523 回答
0

我认为与平滑隐藏选择框动画有关的错误。我不喜欢黑客,但这种方法有效。在 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;
}
于 2013-10-16T11:10:17.033 回答