2009-04-20 5 views
4

왜이 코드가 작동하지 않습니까? 그것은 구글 화면을 보여 주지만 그것은 텍스트 상자 값을 변경하지 않습니다. 나는 JS가 Safari에서 실행함으로써 작동한다는 것을 확인했으며,이 코드는 alert ('hi')를 실행하면 작동하지 않으므로 달리 작동하는 것으로 보인다.UIWebView - stringByEvaluatingJavaScriptFromString - 텍스트 상자 값을 변경하지 않음

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

답변

4

페이지로드가 완료 될 때까지 기다리는 경우 작동합니까?

+0

에 대한

확인이. –

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; 
} 

대안 비동기 다운로드 ( ASINetworkQueue 참조 상세)에 간단한 방식을 포함하는 벤 Copsey의 ASIHTTPRequest 래퍼를 확인.

요청 다운로드가 완료되면 ASINetworkQueue을 사용하여 원하는 방법 (예 : 자바 스크립트 코드 실행)을 실행할 수 있습니다.

5

로드 URL 동작은 비동기 적으로 발생합니다. 그것은 당신의 방법이 끝날 때까지 시작하지 않습니다. 그래서 귀하의 자바 스크립트가 빈 UIWebView에 푸시되고, 다음 메서드가 끝나면로드가 발생합니다.

js를 밀어 넣기 전에 메소드를 끝내야합니다. 표준 접근 방식은 델리게이트 객체를 사용하는 것입니다. 델리게이트 객체는로드가 완료 될 때 호출되는 메소드를 갖습니다. 그래야만 자바 스크립트를 밀어 넣는 것이 합리적입니다.

10

이전 답변 만 확대하면됩니다.

 

web_screen.delegate = self; 
 

는 그런 다음 요청이로드가 완료 스크립트가 있어야합니다 준비가 될 때 알고 대의원 방법 중 하나를 구현할 수 있습니다 : 당신은이 같이있는 UIWebView의 위임 속성을 설정하여 UIWebViewDelegate 프로토콜을 준수해야합니다 과 같이 실행

 

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

을 UIWebViewDelegate 프로토콜 방문에 대한 자세한 내용은 애플 사이트 http://developer.apple.com/library/ios/#documentation/uikit/reference/UIWebViewDelegate_Protocol/Reference/Reference.html

+0

감사합니다. 그것은 나를 위해 일했습니다. – Harikrishnan

2

추가 '.innerHTML'당신은
를 검색하는 것을 후귀하의 경우에는 다음을 수행하십시오.

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

이것은 저에게 효과적입니다. 확실히 문제가 추가 정보를 here

관련 문제