2009-04-20 8 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

これは間違いなく問題です。 –

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; 
} 

あるいは、非同期ダウンロード(具体的には、ASINetworkQueueを参照)に簡略化されたアプローチを含むベンCopseyのASIHTTPRequestラッパーを、チェックアウト。

要求のダウンロードが完了すると、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

2

追加「.innerHTML」のあなたが
探しているものの後にあなたの場合は次のようにしてください

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

これは私のために働いた。

詳細を確認するhere

関連する問題