"alert()" 和 "confirm()" 与 "apple-mobile-web-app-capable" 不兼容。

24
在iOS(目前版本为7.0)下,当我们的Web应用程序被固定到主屏幕时(即使用meta标签apple-mobile-web-app-capable),似乎alert()和confirm()不起作用。
我在Twitter上找到一个用户遇到了类似的问题:

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

如果iOS 7中真的存在错误,有人能提供临时解决方案吗?


哇,iOS 16.7 还是有这个问题。 - undefined
8个回答

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应用程序不必被固定到主屏幕上。你可以在运行iOS7的iPad上的测试页面上测试此功能。

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

解决此问题的一种hacky方法是使用setTimeout()来延迟警报的执行。问题似乎只会在Safari尝试同时显示显示选择列表项和警报时出现。confirm()也有同样的问题。


1
我通过使用Alertify解决了这个问题。简单而有效。http://fabien-d.github.io/alertify.js/0.4.0rc1/ - rob345
这是一个非常棒的示例代码块。你已经向radar.apple.com报告了吗? - Dru Freeman

8

iOS 7.0.3版本修复了JavaScript的alert()confirm()的漏洞。


2
我使用的是iOS 7.0.4,这个bug仍然存在。 - Rizwan Sattar
1
confirm() 在我的 iPhone 4S 上的 iOS 7.0.4 上运行良好,但在早期版本的 iOS 上无法正常工作(不确定之前使用的是哪个 7.0.x 版本)。也许这个 bug 只会出现在 iPad 上。 - Nurpax

5

我不知道这是设计上的问题还是一个漏洞,但我可以确认这是个真正的问题。另外需要注意的一点是,如果用户已经启用了保存密码选项,任何需要登录的网站都将失败,因为那个提示也被阻止了。(你可以尝试使用一个只有用户名和密码框的简单表单来测试,它根本无法提交)。但是对于所有这三个问题都有解决方法。

  1. 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');
    
  2. 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/.

我希望这些对您有所帮助。


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/

无论如何,似乎这个bug只影响iPad而不是iPhone。

可以确认 iPhone 6 受影响。 - treyBake

1

我今天在iOS 16上注意到了这个问题 - 这将在几天后公开发布。很可能在之前的版本中也发生过,只是我没有注意到。

我有一些调试警报,当我点击某些按钮时会显示出来。它们在导航回去时使用滑动手势后就无法正常工作了。之后,围绕警报的所有逻辑都正确执行,但对话框却没有显示出来。

而且不,它并没有重新加载之前的网站版本,因为其他一切都如预期那样。

如果这是设计上的问题,我无法想象为什么会这样。


1
我已经试图解决这个问题多年了。虽然没有付出太多努力,但我们有一个提交按钮,会给你一个确认信息:“确定要提交吗?”对于95%的用户来说,它是有效的,但每隔几天我们仍然会遇到使用移动Safari浏览器的用户遇到这个问题。 - itsadevnotcat
既然你经常收到这个消息,我非常想知道现在iOS 17已经公开发布(大约3小时前),你是否还会收到这个消息! - undefined

1
我用以下代码遇到了这个问题:
const confirmation = window.confirm(message || 'Are you sure?');

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

我将代码更改为以下内容(删除了 window.):

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

突然间它又开始工作了。
我猜想苹果公司采用了自己的实现方式来实现confirm,不需要使用window.

0

我认为与平滑隐藏选择框动画相关的一个 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;
}

0

Andersen 是正确的:

iOS 7.0.3 已修复了 javascript alert() 和 confirm() 的错误。

我刚刚安装并测试过了。

在 Apple 解决问题之时,我抓紧时间寻找解决方法,最终找到了一个叫做 Alertify 的 js 插件,我认为这值得分享。不管有没有 bug,我现在都会使用它!它可以让警告、提示等看起来非常好看。我认为这值得分享,因为本帖子的读者可能正在使用标准浏览器警报。我很高兴能够偶然发现它。


我正在使用iOS 7.0.3的iPad mini,在Safari中仍然存在问题。但在Chrome上可以正常工作。 - Alpár
我还可以确认,在两种不同类型的IOS 7.0.3 iPad上它也无法工作。 - Plippie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接