[英]"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 開始修復。
我不知道這是設計使然還是錯誤,但我可以確認這是一個真正的問題。 需要注意的另一件事是,如果用戶可以選擇保存密碼,則任何需要登錄的站點都將失敗,因為該提示也被阻止。 (您可以使用帶有用戶名和密碼框的簡單表單來嘗試此操作,而沒有其他任何內容,它根本不會提交)。 但是對於所有三個問題都有解決方法。
登錄 - 在網站的表單標簽中設置 autocomplete="off",或者檢測該網站正在運行 IOS7 和全屏模式並應用此設置
$('form').attr('autocomplete', 'off');
警報和確認 - 您可以在 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>
無論如何,似乎這個錯誤影響了 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.