web-dev-qa-db-ja.com

「alert()」および「confirm()」が「Apple-mobile-web-app-capable」で機能しない

IOS(現在7.0)では、Webアプリがホーム画面に固定されているとき(別名メタタグApple-mobile-web-app-capable)にalert()confirm()が機能していないようです。

Twitterで同様の問題を抱えているユーザーを見つけました。

https://Twitter.com/thomasfuchs/status/38013780125970432

それが本当にiOS 7のバグである場合、誰でも一時的な修正がありますか?

21
allaire

JavaScript alert()およびconfirm()のバグは、iOS 7.0.3で修正されました。

8
andersen

アラートがWebアプリを破壊するという同様の問題がありました。特定のケースは、選択リストの変更からトリガーされたアラートでした。次のような非常に簡単なテストページを作成します。

<!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()も同じように壊れています。

14
Barrie

仕様によるものなのかバグなのかはわかりませんが、これが本当の問題であることは確認できます。注意すべきもう1つの点は、ユーザーがパスワードを保存するオプションを有効にしている場合、そのプロンプトもブロックされるため、ログインを必要とするサイトはすべて失敗することです。 (ユーザー名とパスワードのボックスを含むシンプルなフォームでこれを試すことができますが、それ以外の場合は送信されません)。ただし、3つの問題すべてに対して回避策があります。

  1. ログイン-サイトのフォームタグでautocomplete = "off"を設定するか、サイトでIOS7がフルスクリーンモードで実行されていることを検出し、この設定を適用します

    $('form').attr('autocomplete', 'off');
    
  2. アラートと確認-JavaScriptでカスタム関数を作成するか、こことほぼ同じ方法で既存の関数をオーバーライドできます。 http://andrewensley.com/2012/07/override-alert-with-jquery- ui-dialog /http://www.ericmmartin.com/projects/simplemodal-demos/ の下部のデモである、確認オーバーライドが組み込まれたEric MartinのSimpleModalプラグインを使用するのが好きです。

その一部が役立つことを願っています。

5
Richard Wilson

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/

とにかく、このバグはiPhoneではなくiPadを苦しめているようです。

4
Marco Allori

選択ボックスのアニメーションをスムーズに隠すことに関連するバグだと思います。ハッキングは好きではありませんが、この方法は機能します。 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;
}
0
Boris

アンデルセンは正しいです:

iOS7.0.3で修正されたjavascript alert()およびconfirm()のバグ

自分でインストールしてテストしました。

Appleは問題を修正していたが、私はそれを回避するために何かを見つけようと急いで、最終的に私はこれが共有する価値があると思ったAlertifyというjsプラグインを見つけた。バグ修正に関係なく、これからは警告、プロンプトなどが本当に見栄えがよくなります。この投稿の読者は標準のブラウザ警告を使用している可能性が高いので、共有する価値があると思いました。

0
DaNnY BoY