我用Swift开发了一个混合iOS应用程序,想在WKWebView中检测history.pushstate()。我确实覆盖了WKWebView的方法,但我什么也检测不到。有没有一种方法或技巧来检测历史记录。pushstate()
e0uiprwp1#
这当然是一种解决方法,但如果你被允许编辑内置对象的属性(就像在大多数浏览器中一样),你可以 Package 这两个函数,并使用拦截处理程序来跟踪它们何时被调用:
function track (fn, handler) { return function interceptor () { handler.apply(this, arguments) return fn.apply(this, arguments) } } history.pushState = track(history.pushState, function (state, title, url) { // do something with `state, `title`, and `url` console.log('pushState called with:', { state: state, title: title, url: url }) }) history.replaceState = track(history.replaceState, function (state, title, url) { // do something with `state, `title`, and `url` console.log('replaceState called with:', { state: state, title: title, url: url }) }) history.pushState(null, 'Title 1', '/example-page')
yc0p9oo02#
您可以通过key-value observing观察WKWebView.url
WKWebView.url
var urlObservation: NSKeyValueObservation? ... let webView = WKWebView(...) urlObservation = webView.observe(\.url, changeHandler: { webView, change in print("url changed") })
看来Firefox for iOS也在用这种方式。
2条答案
按热度按时间e0uiprwp1#
这当然是一种解决方法,但如果你被允许编辑内置对象的属性(就像在大多数浏览器中一样),你可以 Package 这两个函数,并使用拦截处理程序来跟踪它们何时被调用:
yc0p9oo02#
您可以通过key-value observing观察
WKWebView.url
看来Firefox for iOS也在用这种方式。