2009-04-20 80 views
4

爲什麼這個代碼不工作?它顯示Google屏幕,但不會更改文本框的值。我確認JS通過在Safari中運行它,並且此代碼在運行alert('hi')的情況下似乎可以工作。UIWebView - stringByEvaluatingJavaScriptFromString - 不改變文本框的值

NSURL *web_url = [NSURL URLWithString:@"http://www.google.com"]; 
NSURLRequest *web_request = [NSURLRequest requestWithURL:web_url]; 
[web_screen loadRequest:web_request]; 
NSString *js_result = [web_screen stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('input')[1].value='test';"]; 

回答

4

如果您等待頁面首先完成加載,它會工作嗎?

+0

這絕對是問題所在。 – 2010-06-02 18:21:03

4

考慮查看NSURLConnection及其委託方法。您可以使用這些來檢查下載的狀態。

@interface 
... 
NSURLConnection *connectionInProgress; 
NSData *googleRequestResponseData; 
NSURL *googleURL; 
... 

@implementation 
... 
- (void) setUpRequest { 
    googleURL = [[NSURL URLWithString:@"http://www.google.com/"] retain]; 
    googleRequestResponseData = [[NSMutableData data] retain]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30.0]; 
    connectionInProgress = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES]; 
} 

#pragma mark NSURLConnection delegate methods 

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [googleRequestResponseData appendData:data]; 
} 

- (void) connectionDidFinishLoading:(NSURLConnection *)connection { 
    [web_screen loadData:googleRequestResponseData MIMEType:@"application/octet-stream" textEncodingName:@"utf-8" baseURL:googleURL]; 
    NSString *js_result = [web_screen stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('input')[1].value='test';"]; 
    NSLog (js_result); 

    [googleURL release]; 
    [googleRequestResponseData release]; 
    [connectionInProgress release]; 
    connectionInProgress = nil; 
} 

- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    NSLog (@"Connection failed to load data from Google!"); 
    [googleURL release]; 
    [googleRequestResponseData release]; 
    [connectionInProgress release]; 
    connectionInProgress = nil; 
} 

備選地,檢查了本科普塞的ASIHTTPRequest包裝,其包括一種簡化的方法以異步下載(參見ASINetworkQueue,特定地)。

請求下載完成後,您可以使用ASINetworkQueue運行您選擇的方法(例如,運行Javascript代碼)。

5

加載URL操作發生異步。它甚至沒有開始,直到你的方法結束。所以你的JavaScript被推入一個空的UIWebView,然後你的方法結束,然後負載發生。

你需要讓你的方法到底JS被推入之前。這樣做的標準方法是使用一個委託對象,它會有一個叫做它在加載完成時方法。只有這樣,推入JavaScript纔有意義。

10

只是擴大了以前的答案。你需要通過設置一個UIWebView的這樣的委託財產,以符合UIWebViewDelegate協議:

 

web_screen.delegate = self; 
 

然後你就可以實現的委託方法一個知道當一個請求已完成加載,因此準備有腳本像下面這樣運行:

 

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    NSString *js_result = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('input')[1].value='test';"]; 
} 

有關UIWebViewDelegate協議訪問蘋果網站http://developer.apple.com/library/ios/#documentation/uikit/reference/UIWebViewDelegate_Protocol/Reference/Reference.html

+0

謝謝你。它爲我工作。 – Harikrishnan 2013-02-21 05:03:43

2

添加「.innerHTML」的詳細信息後,你要搜索的內容
在你的情況下,請執行以下操作:

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    NSString *js_result = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('input')[1].value='test'.innerHTML"]; 
} 

這對我有用。

檢查這個瞭解更多信息here

相關問題