2017-06-09 1 views
1

私のウェブサイトのモバイル版では、特定の状況下に表示されるJavaScript確認ダイアログがあります。 setTimeoutを使用して確認ダイアログを表示します。 ユーザーがどのタブにいても、confirm dialogが表示されますが、iOS 10ではフォーカスが失われています。ダイアログがiOS10のフォーカスを失うのを確認します

iOSバージョン8 &では、2つのタブがあり、2番目のタブにあるときに正常に動作します。確認ダイアログが前面に表示されます。

解決策または回避策はありますか?

var cf = confirm("Close?"); 
if (cf){ do that....} else { do this... } 

答えて

2

SafariDriverはalertconfirmへの呼び出しをインターセプトするために、ようJSで実装され、そしてpromptは、1は、ウェブページのコンテキストで関数をオーバーライドする必要があります。

挿入するスクリプトをEndスクリプトの代わりにStartスクリプトに変更します。つまり、DOMがロードされた後でも、スクリプトが(onloadイベントの後に注入されるのではなく)解析される前に挿入されます。 :

http://developer.apple.com/library/safari/#documentation/Tools/Conceptual/SafariExtensionGuide/InjectingScripts/InjectingScripts.html#//apple_ref/doc/uid/TP40009977-CH6-SW5

上書き試験対象のページのコンテキストのグローバル警告機能、ない注射したスクリプト。これはexecuteScriptコマンドの要件に似ています。したがって、私たちが挿入したスクリプトが最初にすべきことは、警告オーバーライドを設定するスクリプトタグをDOMに追加することです。このスクリプトタグは、documentElementの最初の子として追加して、ページ内の他の要素の前に確実に実行されるようにする必要があります。これにより、ページ内の何かがアラートを発する機会がある前に、アラートハンドラをセットアップすることができます。

警告が発生すると、警告があったことを拡張機能に通知すると同時に、ページ内の現在のJSスレッドをブロックする必要があります。通常、私たちのページスクリプトはwindow.postMessageを使用して、挿入されたスクリプトと通信します。 postMessageは、MessageEventを非同期で起動します。同期を維持するために、我々は手動でMessageEventのを発射することができます

Use a MessageEvent instead of some other DOM event so we can include a JSON object describing the alert.

var event = document.createEvent('MessageEvent'); 
event.initMessageEvent('message', false, false, { 
    type: "alert", // confirm, or prompt 
    text: "hello" 
}, window.location.origin, '0', window, null); 
window.dispatchEvent(event); 

注入されたスクリプトは、ページのアラートメッセージへの応答をリッスンする必要があります。同期処理のための拡張機能にアラートを送信するには、我々は(AB)はロードからのコンテンツをブロックするためのSafariの拡張機能のメカニズムを使用することができます。

http://developer.apple.com/library/safari/#documentation/Tools/Conceptual/SafariExtensionGuide/MessagesandProxies/MessagesandProxies.html#//apple_ref/doc/uid/TP40009977-CH14-SW9

window.addEventListener('message', function(e) { 
    // Create a beforeload event, which is required by the canLoad method 
    var e = document.createEvent('Events'); 
    e.initEvent('beforeload', false, false); 

    // canLoad sends and waits for a response synchronously. It is the only 
    // synchronous function in the Safari extension messaging API. 
    var response = safari.self.tab.canLoad(e, e.data); 

    // Send the response back to the page using another MessageEvent. 
    var responseEvent = document.createEvent('MessageEvent'); 
    responseEvent.initMessageEvent('message', false, false, { 
    accepted: response.accepted, 
    response: response.value 
    }, window.location.origin, '0', window, null); 
    window.dispatchEvent(responseEvent); 
}, true); 

注、延長のアラート応答はに戻って伝達されなければなりませんコンテキスト境界を越えているので、別のメッセージを使用しているページ。他の唯一のオプションは、相手側で読み取るDOMの応答を格納することです。

最後のステップは、この制限がアラートを処理する方法です。アラートのブロック動作を維持しているので、たとえ未処理のアラートエラーが発生しても、コマンドを実行させることはできません。

1つの可能性は、WebDriverクライアントをアラート処理に参加させることです。 WebDockクライアントは、WebSocketサーバーを提供するだけでなく、XHRエンドポイントも提供する予定です。アラートが検出されると、サーバーは同期POST XHRをこのエンドポイントに送信します。クライアントは、アラートを受け入れるか、または却下した後で応答する必要があります(または、未処理のアラート・エラーが別のコマンドから投げられた場合)。 XHR応答が受信されると、拡張機能はチェーンを完了し、応答を注入されたスクリプトに返します。

さらにhereを見つけることができます。

関連する問題