UIWebView - stringByEvaluatingJavaScriptFromString - 不更改文本框值

时间:2009-04-20 02:16:44

标签: iphone

为什么这段代码不起作用?它显示Google屏幕,但不会更改文本框值。我确认JS在Safari中运行它确实有效,而且这个代码似乎工作正常,因为运行alert('hi')确实有效。

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';"];

5 个答案:

答案 0 :(得分:10)

只是扩展上一个答案。您需要通过设置UIWebView的delegate属性来符合UIWebViewDelegate协议,如下所示:


 web_screen.delegate = self;

然后,您可以实现其中一个委托方法,以了解请求何时完成加载,因此可以让脚本像这样运行:


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

有关UIWebViewDelegate协议的更多信息,请访问Apple网站http://developer.apple.com/library/ios/#documentation/uikit/reference/UIWebViewDelegate_Protocol/Reference/Reference.html

答案 1 :(得分:5)

“加载URL”操作以异步方式进行。它甚至在你的方法结束之后才开始。所以你的javascript被推入一个空的UIWebView,然后你的方法结束,然后加载发生。

你需要让你的方法在推入js之前结束。标准的方法是使用一个Delegate对象,当加载完成时会有一个调用它的方法。只有这样才能推进javascript。

答案 2 :(得分:4)

如果您等待页面首先完成加载,它是否有效?

答案 3 :(得分: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;
}

或者,查看Ben Copsey的ASIHTTPRequest包装器,其中包括异步下载的简化方法(具体见ASINetworkQueue)。

请求下载完成后,您可以使用ASINetworkQueue运行您选择的方法(例如,运行Javascript代码)。

答案 4 :(得分:2)

在您搜索之后添加'.innerHTML' 在您的情况下,请执行以下操作

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

这对我有用。

查看此信息以获取更多信息here