UIWebView - stringByEvaluatingJavaScriptFromString - без изменения значения текстового поля - PullRequest
4 голосов
/ 20 апреля 2009

Почему этот код не работает? Он показывает экран 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 ]

10 голосов
/ 11 ноября 2010

Просто расширим предыдущий ответ. Вам необходимо соответствовать протоколу UIWebViewDelegate, установив свойство делегата UIWebView следующим образом:


 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

5 голосов
/ 02 августа 2010

Действие Load URL происходит асинхронно. Это даже не начинается, пока ваш метод не закончился. Таким образом, ваш javascript помещается в пустой UIWebView, затем ваш метод заканчивается, а затем происходит загрузка.

Вы должны позволить вашему методу завершиться до того, как будет введен js. Стандартный подход для этого состоит в использовании объекта Delegate, который будет вызывать метод, когда загрузка завершится. Только тогда имеет смысл нажать на JavaScript.

4 голосов
/ 20 апреля 2009

Рассмотрим 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) после завершения загрузки запроса.

4 голосов
/ 20 апреля 2009

Работает ли это, если вы дождетесь первой загрузки страницы?

2 голосов
/ 09 октября 2012

добавьте «.innerHTML» после того, что вы ищете
В вашем случае сделайте следующее

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

Это сработало для меня.

проверьте это для получения дополнительной информации здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...