簡體   English   中英

“alert()”和“confirm()”不適用於“apple-mobile-web-app-capable”

[英]"alert()" and "confirm()" not working with "apple-mobile-web-app-capable"

在 iOS(當前為 7.0)下,當我們的 web 應用程序固定到主屏幕時(也就是使用元標記apple-mobile-web-app-capable ),看起來alert()confirm()不起作用。

我發現一個用戶在 twitter 上有類似的問題:

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

如果它真的是 iOS 7 中的錯誤,任何人都有臨時修復?

我們遇到了類似的問題,警報破壞了我們的網絡應用程序。 特定情況是從選擇列表的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 - 您的網絡應用程序不必固定在主屏幕上。 您應該能夠在此測試頁面http://jsbin.com/AGoTejA/1上運行 iOS 7 的 iPad 上進行測試。

我們已經在 iPad 2 (MC774B/A) 和 iPad 3 (MD367B/A) 上對此進行了測試,並且 Safari 在兩者上都崩潰了。

解決這個問題的一個技巧是使用 setTimeout() 來延遲警報的執行。 該問題似乎僅在 Safari 嘗試顯示同時顯示選擇列表項和警報的疊加層時發生。 確認()也以同樣的方式被破壞。

JavaScript alert()confirm()錯誤已從 iOS 7.0.3 開始修復。

我不知道這是設計使然還是錯誤,但我可以確認這是一個真正的問題。 需要注意的另一件事是,如果用戶可以選擇保存密碼,則任何需要登錄的站點都將失敗,因為該提示也被阻止。 (您可以使用帶有用戶名和密碼框的簡單表單來嘗試此操作,而沒有其他任何內容,它根本不會提交)。 但是對於所有三個問題都有解決方法。

  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 覆蓋,位於http://www.ericmmartin.com/projects/simplemodal-demos/上的底部演示。

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

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

我認為與平滑隱藏選擇框動畫有關的錯誤。 我不喜歡黑客,但這種方法有效。 確認在 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;
}

安徒生是對的:

從 iOS7.0.3 開始修復了 javascript alert() 和 confirm() 錯誤

剛剛安裝並自己測試。

當 Apple 正在解決這個問題時,我急忙尋找解決方法,最終找到了一個名為 Alertify 的 js 插件,我認為這值得分享。 我想我會從現在開始使用它,無論錯誤修復如何! 它只是讓警報、提示等看起來非常非常好。 認為值得分享,因為這篇文章的讀者可能使用標准瀏覽器警報。 我被它絆倒了。

我用以下代碼發生了這種情況:

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

確認會顯示在 PC(Edge 瀏覽器)上,但不會顯示在 iPhone(Safari 瀏覽器)上

我將代碼更改為以下內容(刪除了窗口。 ):

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

突然它又開始工作了。

我猜蘋果有自己的確認實現,不需要窗口。

我今天在 iOS 16 上注意到了這一點——它將在幾天后公開發布。 這很可能發生在以前的版本上——我只是沒有注意到。

我有一些調試警報,當我單擊某些按鈕時會顯示這些警報。 他們工作正常,直到我使用滑動動作導航回來。 之后,圍繞警報的所有邏輯都正確發生,但沒有顯示對話框。

不,它沒有重新加載網站的先前版本,因為其他一切都如預期的那樣。

如果這是設計使然,我無法想象為什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM