Iphone UIWebView-stringByEvaluatingJavaScriptFromString-不更改文本框值

Iphone UIWebView-stringByEvaluatingJavaScriptFromString-不更改文本框值,iphone,Iphone,为什么这个代码不起作用?它会显示Google屏幕,但不会更改文本框的值。我确认JS是通过在Safari中运行来工作的,而这段代码似乎是通过其他方式工作的,因为运行alert('hi')可以工作 NSURL *web_url = [NSURL URLWithString:@"http://www.google.com"]; NSURLRequest *web_request = [NSURLRequest requestWithURL:web_url]; [web_screen loadReque

为什么这个代码不起作用?它会显示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';"];

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

请考虑查看
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的包装器,其中包括一种异步下载的简化方法(具体请参见
ASINetworkQueue


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

加载URL操作以异步方式进行。直到您的方法结束,它才开始。因此,javascript被推送到一个空的UIWebView中,然后方法结束,然后加载


您需要在推送js之前让方法结束。实现这一点的标准方法是使用委托对象,当加载完成时,委托对象上会调用一个方法。只有这样,才有必要插入javascript。

仅扩展前面的答案。您需要通过如下设置UIWebView的delegate属性来遵守UIWebViewDelegate协议:


 web_screen.delegate = self;
然后,您可以实现其中一个委托方法,以了解请求何时完成加载,从而准备让脚本按如下方式运行:

- (void)webViewDidFinishLoad:(UIWebView *)webView { NSString *js_result = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('input')[1].value='test';"]; } -(无效)webViewDidFinishLoad:(UIWebView*)webView{ NSString*js_result=[webView stringByEvaluatingJavaScriptFromString:@“document.getElementsByTagName('input')[1]。value='test';”; }
有关UIWebViewDelegate协议的更多信息,请访问苹果网站,在搜索内容后添加“.innerHTML”
在您的情况下,请执行以下操作

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


查看此项了解更多信息

这肯定是问题所在。