“alert()”和“confirm()”无法使用“apple-mobile-web-app-capable”

时间:2013-09-19 19:40:37

标签: javascript ios safari ios7

在iOS(目前为7.0)下,当我们的网络应用固定到主屏幕时(例如,使用元标记alert()),看起来confirm()apple-mobile-web-app-capable无效。

我发现用户在Twitter上有类似的问题:

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

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

7 个答案:

答案 0 :(得分:14)

我们遇到类似的问题,警报破坏了我们的网络应用。具体情况是从选择列表的更改触发的警报。我们整理了一个非常简单的测试页面:

<!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()也以同样的方式被打破。

答案 1 :(得分:8)

从iOS 7.0.3开始修复了JavaScript alert()confirm()错误。

答案 2 :(得分: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插件,它具有内置的确认覆盖,http://www.ericmmartin.com/projects/simplemodal-demos/上的底部演示。

  3. 我希望其中一些有帮助。

答案 3 :(得分: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。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

安徒生是对的:

  

javascript alert()和confirm()修复了自iOS7.0.3以来的错误

我自己安装并测试过它。

虽然Apple正在解决这个问题,但我还是想找到解决问题的方法,最后找到一个名为Alertify的js插件,我认为这值得分享。我想我会从现在开始使用它,无论错误修复!它只是使警报,提示等看起来真的非常好。认为这是值得分享,因为这篇文章的读者可能使用标准浏览器警报。我被引诱绊倒了它。

答案 6 :(得分:0)

我通过以下代码实现了这一点:

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

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

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

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

突然又恢复正常了。

我想苹果公司有自己的 确认 实现,不需要 窗口。 < / p>