messagehandlers - swift javascript 連携



stringByEvaluatingJavaScriptFromStringがいつ終了したかの判別 (3)

HTMLページをロードするUIWebViewあります。 このページには、[終了]と[送信]という2つのボタンがあります。 ユーザーが終了ボタンをクリックできないようにするため、ページの読み込みが完了したら(つまりwebViewDidFinishLoadが呼び出されたら)、HTMLを操作してこれらのボタンの1つを削除するためにstringByEvaluatingJavaScriptFromStringを使用します。 私はまたwebViewDidStartLoadUIWebViewユーザーインタラクションを無効にし、 webViewDidFinishLoadそれを再度有効にしwebViewDidFinishLoad

私が見つけている問題は、 stringByEvaluatingJavaScriptFromStringが完了するまでに1、2秒かかることです。それはそれ自身のスレッドで行われているようです。 そのため、 webViewDidFinishLoadが呼び出され、 UIWebViewでユーザー操作が有効になります。ユーザーが素早い場合は、 stringByEvaluatingJavaScriptFromStringが終了する前に[終了]ボタンをクリックできます。 stringByEvaluatingJavaScriptFromStringは、終了時を知る方法がなく、独自のスレッド上にあるように見えるため(ユーザーがwebViewDidFinishLoad呼び出すことはwebViewDidFinishLoad )、ユーザーが終了後にExitボタンをタップするのを完全に防ぐ唯一の方法は、UIWebViewでユーザー操作を有効にすることのみです。いくらかの遅れ、それは信頼できません(どれくらい遅れて遅れるべきかをどうやって知ることができますか?)

stringByEvaluatingJavaScriptFromStringがスレッド上で実行されることにstringByEvaluatingJavaScriptFromStringはありませんが、完了したことを知らせることはできません。 この問題を回避するための他の提案はありますか?

編集:要するに、私が知りたいのは、 stringByEvaluatingJavaScriptFromString実行中にUIWebViewを無効にし、JavaScriptが終了したときにUIWebViewを再度有効にできるかどうかです。

編集2:ここでは、JSエンジンが終了したときにどうにかして調べることができるということを暗示しているように思われる記事がありますが、同じことを言っている他の参考文献が見つかりません: http://drnicwilliams.com/2008/11/10/to-webkit-or-not-to-webkit-within-your-iphone-app/ : http://drnicwilliams.com/2008/11/10/to-webkit-or-not-to-webkit-within-your-iphone-app/

編集3ブラッドスミスからの答えに基づいて、それは私が実際にJavaScriptが実行された後UIWebViewがそれ自身をロードし終えた時を知る必要があるようです。 私はそこにある種の遅延を入れる必要があるように見えます。

https://ffff65535.com


html要素に直接onclickイベント用のスタブ関数をインライン化するのはどうですか。 後で適切な場合は、html要素をonclickイベントハンドラ関数にバインドできます。

<button onclick="function () { };"/>

stringByEvaluatingJavascriptFromStringを実行した後、あなたはあなたの問題を解決するために以下のコードを試すことができます。

webView.userInteractionEnabled = NO;
while (webView.loading) {
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]];
}
webView.userInteractionEnabled = YES;

あなたのために働いているかどうか教えてください。


ページに挿入しているJavaScriptを使用して、ページを別の場所に移動し(document.location = "foo")、webView:ShouldLoadRequest:を使用してその要求を探し、必要なものをトリガーしてnoを返すことができます。 (そして普通はyesを返す)





uiwebview