私はSwiftに小さなiOSアプリケーションを構築しており、WKWebViewを使用しています。私が達成しようとしているのは、Webページが完全にレンダリングされたときに通知されることです。 WKWebViewの既知の問題で、ロード通知が機能しません。クリーナーはウェブページのwindow.onloadにフックする?
しかし、このアプローチはうまくいくように思えますが、その考え方はJavascriptのwindow.onload
関数にフックしてそこからSwiftに通知することです。しかし、ここでも問題が見つかりました。 JQueryを使用すると、いくつかのページでは、Webページですでにwindow.onload
が定義されているため、コールバックは明らかに行われません。純粋なJavascriptの方法を使用している場合、一部のWebページが破損しています。つまり、window.onload
を上書きしているため、明らかにページが読み込まれません。
// using JQuery, this function never get called for web pages that do window.onload =
$(window).load(function() {
window.webkit.messageHandlers.callbackHandler.postMessage(
JSON.stringify({body: "window finished loading"}));
});
// works always but breaks web pages that use window.onload
window.onload = function() {
window.webkit.messageHandlers.callbackHandler.postMessage(
JSON.stringify({body: "window finished loading"}));
};
の質問はどのように私は、既存のwindow.onload
にこのライン通知を追加し、それが存在しない場合は1 window.onload
を定義することができますか?他のアイデアも歓迎します。キューイングwindow.load
実装?
完全に私は、WKWebView
をネイティブに使用してそのような通知を得る2つの既知の方法を以下に示しました。
(1)ライフサイクル通知を取得しますが、Webページがまだ完全にレンダリングされていない場合、コールバック通知が早すぎます。
class ViewController: UIViewController {
// ...
func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
NSLog("didFinishNavigation callback received ... too early!")
}
}
(2)キー・バリューオブザーバー法(KVO)を使用しますが、ここで再び、コールバック通知は、あまりにも早すぎるトリガー:
webView.addObserver(viewController, forKeyPath: "estimatedProgress", options: .New, context: nil)
//
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<()>) {
guard let webView = object as? WKWebView else {return}
guard let change = change else {return}
guard let keyPath = keyPath else {return}
switch keyPath {
case "estimatedProgress":
if ((1.0 - webView.estimatedProgress) < 1e-10) {
NSLog("'estimatedProgress' callback received ... too early!")
}
break
default: break
}
}
それは「ロード」KVOで同じ問題です。
UPDATE:受け入れ答えに加えて、この他の質問running-jquery-after-all-other-js-has-executedにトップランクの答えは、例えば、ポーリングによってあまりにも特定の変更のためのDOMを、このOPを解決すべてのJavascriptがページの読み込みに加えて完了したとき。
['$ $ {document} .ready(fn)'](https://learn.jquery。'fn'を渡した関数は、ページが準備できたら後で呼び出されます。ページの準備が整った後に別のレディ・ハンドラを追加すると、jqueryはすぐにレディ・コールバックを呼び出します。 – doug65536
残念ながら、 '$(window).load(fn)'を使ったときと同じ問題があります。 –
ありがとう!つまり、$(document).ready(fn)は$(window).load(fn)と同じ問題があります。 –