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