沒有直接的方法來監聽來自UIWebView的事件,但可以橋接它們。由於iOS7這是很容易,因爲有JavaScriptCore.framework(你需要將它與項目鏈接):
JSContext *ctx = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
ctx[@"myUpdateCallback"] = ^(JSValue *msg) {
[self fieldUpdated];
};
[ctx evaluateScript:@"document.getElementById('myEditableDiv').addEventListener('input', myUpdateCallback, false);"];
(我目前沒有可能測試代碼,但我希望它的工作原理)
iOS7之前(如果你想支持更低的版本,你必須用這個)這是一個有點更靠譜。您可以在web視圖的委託方法webView:shouldStartLoadWithRequest:navigationType:
聽一些定製的方案,例如:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if ([request.URL.scheme isEqualToString:@"divupdated"]) {
[self fieldUpdated];
return NO;
}
return YES;
}
和火像這樣的web視圖:
[webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('myEditableDiv').addEventListener('change', function() {"
@"var frame = document.createElement('iframe');"
@"frame.src = 'divupdated://something';"
@"document.body.appendChild(frame);"
@"setTimeout(function() { document.body.removeChild(frame); }, 0);"
@"}, false);"];
感謝lupatus,你發佈第一所以標記爲答案。 – Lenny
不適用於我.. @Lenny – Devfly