“alert()”和“confirm()”不适用于“apple-mobile-web-app-capable”

Posted

技术标签:

【中文标题】“alert()”和“confirm()”不适用于“apple-mobile-web-app-capable”【英文标题】:"alert()" and "confirm()" not working with "apple-mobile-web-app-capable" 【发布时间】:2013-09-19 19:40:36 【问题描述】:

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

我发现一位用户在 twitter 上遇到了类似的问题:

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

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

【问题讨论】:

【参考方案1】:

我们遇到了类似的问题,即警报破坏了我们的网络应用程序。具体情况是从选择列表的 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 应用程序不必固定在主屏幕上。您应该可以在运行 iOS 7 的 iPad 上在此测试页面 http://jsbin.com/AGoTejA/1 上进行测试。

我们已经在 iPad 2 (MC774B/A) 和 iPad 3 (MD367B/A) 上对此进行了测试,但 Safari 在两者上都崩溃了。

解决此问题的一种巧妙方法是使用 setTimeout() 来延迟警报的执行。只有当 Safari 尝试同时显示选择列表项和警报时,才会出现此问题。 confirm() 也以同样的方式被破坏。

【讨论】:

我通过使用 Alertify 解决了这个问题。简单,有效。 fabien-d.github.io/alertify.js/0.4.0rc1 这确实是一个很棒的示例块。您是否已将此情况报告给radar.apple.com?【参考方案2】:

自 iOS 7.0.3 起,javascript alert()confirm() 错误已修复。

【讨论】:

我在 iOS 7.0.4 上,这个错误仍然发生在我身上。 confirm() 在 iPhone 4S 上的 iOS 7.0.4 上适用于我,但在早期的 iO​​S 上不起作用(不确定我之前使用的是哪个 7.0.x)。也许这个错误只发生在 iPad 上。【参考方案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/ 的底部演示。

我希望其中的一些帮助。

【讨论】:

【参考方案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。

【讨论】:

可以确认iphone 6受到影响【参考方案5】:

我使用以下代码遇到了这种情况:

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

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

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

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

然后它突然又开始工作了。

我猜 Apple 有自己的 confirm 实现,它不需要 窗口。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

安徒生是正确的:

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

刚刚自己安装并测试过。

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

【讨论】:

我正在使用 iPad mini 和 iOS 7.0.3,但问题仍然存在于 Safari 中。不过,它适用于 Chrome。 我还可以确认它不适用于 IOS 7.0.3 的两种不同类型的 ipad

以上是关于“alert()”和“confirm()”不适用于“apple-mobile-web-app-capable”的主要内容,如果未能解决你的问题,请参考以下文章

Selenium处理alert/confirm/prompt提示框

vue提示弹窗插件(alert、confirm、msg)

自定义弹窗——alert、prompt、confirm

confirm和alert的区别

confirm和alert的区别

JavaScript 和 jQuery $.alert alert $.confirm confirm 的对比