2017-08-23 5 views
0

Ich habe eine Website, die Javascript verwendet, die angular verwendet, um zu kontrollieren, was Sie auf der Website sehen. So wird http://somewebsite.com/#page1 angezeigt und wenn Sie auf eine Registerkarte klicken, ändert sich die Position zu http://somewebsite.com/#page2. Es wird kein aktuelles Reload auf der Webseite geben und daher wird func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) nicht ausgelöst. Wie können Sie diese Hash-Änderungen abfangen?Wie erkennen Sie Hash-Änderungen in WKWebView?

Natürlich kann Apple, da der Safari-Webbrowser diese Änderungen in der Adressleiste anzeigen kann.


-Update 19.33:

habe ich einige der Forschung. Unter Verwendung von window.onhashchange im Safari-Browser wird dies jedoch ausgelöst, in der WKWebView nicht. Tauchen tiefer Ich benutze das folgende Javascript, um den Dokumentstandort href jede Sekunde zurückzugeben.

window.setInterval(function(){ alert(document.location) }, 1000); 

Wenn diese Warnung in WKWebView lesen zeigt nie, dass die Lage ändert, während in Safari Sie http://somewebsite.com/#page1 und http://somewebsite.com/#page2 sehen. Es scheint, dass WKWebView diese Funktion nicht unterstützt, die extrem nervig ist.

Antwort

0
let script = WKUserScript(source: "(function() { \"use strict\"; addEventListener(\"hashchange\", function(event) { webkit.messageHandlers.hashchangeMessageHandler.postMessage(null); }); })();", injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: false) 

let configuration = WKWebViewConfiguration() 
configuration.userContentController.add(self, name: "hashchangeMessageHandler") 
configuration.userContentController.addUserScript(script) 

self.webView = WKWebView(frame: CGRect.zero, configuration: configuration) 

Jetzt können Sie den Hash holen geändert URL mit:

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { 
    print("Received message: \(message.name): \(message.body)") 
    print(self.webView.url) 

}