Iphone UIWebView-stringByEvaluatingJavaScriptFromString-不更改文本框值
为什么这个代码不起作用?它会显示Google屏幕,但不会更改文本框的值。我确认JS是通过在Safari中运行来工作的,而这段代码似乎是通过其他方式工作的,因为运行alert('hi')可以工作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
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"];
}
这对我有用
查看此项了解更多信息这肯定是问题所在。