2014-03-07 39 views
6

內改變上一個UIWebView文本時使用UIWebView可編輯的內容,用戶可以輸入在編輯DIV自己的文字。IOS:你如何檢測用戶對內容編輯DIV

每當用戶更改可編輯文本(類似於the UITextField值更改事件)時,是否有辦法在ViewController上觸發事件?

的視圖控制器需要知道用戶何時改變文本的原因有兩個;要知道,如果用戶輸入任何文字的,隨着內容的文字發展到調整的UIWebView。

UIWebView委託似乎沒有包括這種類型的事件。這可能將不得不通過JavaScript實現,但似乎無法找到答案在那裏。幫幫我!

回答

7

沒有直接的方法來監聽來自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);"]; 
+0

感謝lupatus,你發佈第一所以標記爲答案。 – Lenny

+0

不適用於我.. @Lenny – Devfly

1

你需要爲了得到這個工作做一些JS砍。

首先,創建一個帶有腳本的JS文件,該腳本添加了一個觀察者,該觀察者在開始編輯時會觀察所有可編輯的div(我不知道JS應該如何完成這項工作,而是在Google上快速搜索應該有所幫助)。然後回調應該調用特製的url,如:

textFieldBeginEditing://whateveryoulike 

將JS文件注入到UIWebView中。一種可能的技術:

- (void)injectJavascript:(NSString *)resource { 
    NSString *jsPath = [[NSBundle mainBundle] pathForResource:resource ofType:@"js"]; 
    NSString *js = [NSString stringWithContentsOfFile:jsPath encoding:NSUTF8StringEncoding error:NULL]; 

    [self.webView stringByEvaluatingJavaScriptFromString:js]; 
} 

取自another so thread

最後,在UIWebViewDelegate method shouldStartLoadingRequest

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    // ... check the url schema 
    NSURL *url = request.URL; 
    if ([url.scheme isEqual:@"textFieldBeginEditing"]){ 
     // here you can handle the event 
     return NO; // important 
    } 
}