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