2013-08-09 62 views
5

Tôi cần điền trước các trường văn bản trong một số UIWebView và được cấp để hiểu rằng javascript là cách tốt nhất để thực hiện việc này. Rất tiếc, tôi không biết gì về số javascript và đã lúng túng trong vài giờ qua, không nhận được hư không.Điền trước các trường văn bản WebView

mới nhất nỗ lực bất thành:

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    // username field id = username_5 & pw field id = password_5 
    NSString *javascript = @"\ 
    var user = 'testUser';\ 
    var pw = 'testPW';\ 
    document.getElementById('username_5').value = user; \ 
    document.getElementById('password_5').value = pw; \ 
    ;"; 
    // Execute JS 
    [_emailWebView stringByEvaluatingJavaScriptFromString:javascript]; 
} 

bất cứ ai có thể chỉ cho tôi đi đúng hướng?

-EDIT-

Tôi cũng đã thử cố gắng trì hoãn các cuộc gọi trong trường hợp trang đã không nạp đầy đủ và nếu tôi gọi cái gì đó như:

- (void)webViewDidFinishLoad:(UIWebView *)wv 
{ 
    [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
    [self performSelector:@selector(injectJavascript) withObject:nil afterDelay:1.0]; 
} 

- (void)injectJavascript 
{ 
    [self.emailWebView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('password_5').value = 'testPW';"]]; 
    [self.emailWebView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"window.alert('test');"]]; 
} 

các cảnh báo xuất hiện nhưng lĩnh vực này với ID password_5 là Chưa được điên.

Các trường được đề cập được lồng trong một biểu mẫu. Không biết liệu điều đó có tạo nên sự khác biệt nào không?

-EDIT 2-

Tôi khá chắc chắn rằng các vấn đề có liên quan đến HTML/làm tổ trên các trang web mục tiêu như tôi chỉ cố gắng này trên một trang web khác và nó làm việc.

Các trang web mục tiêu được lồng như thế này:

<html> 
    <head> … </head> 
    <body onload="FinishLoad(1);hideJSWarn();"> 
     <div id="noJSWarn" class="cssSecurityWarning" style="display: none;"> … </div> 
     <table id="table_LoginPage_1" > … </table> 
     <table id="table_LoginPage_2" > … </table> 
     <blockquote> 
     <form id="frmLogin_4" onsubmit="return Login(1)" autocomplete="off" method="POST" action="login.cgi" name="frmLogin"> 
      <input id="tz_offset_5" type="hidden" name="tz_offset"></input> 
      <table id="table_LoginPage_3" > 
      <tbody> 
       <tr> … 
       <td valign="top"> 
        <table id="table_LoginPage_6" > 
        <tbody> 
         <tr> 
         <td> … </td> 
         <td> 
          <input id="username_5" type="text" size="20" name="username"></input> 
+1

Im không chắc chắn nếu nó sẽ giúp đỡ, nhưng không u mất tích '; 'sau'' testPW''? –

+0

Có, cảm ơn - lỗi đánh máy. – Robert

+1

Tôi vừa thử nghiệm mã của bạn (với phần bổ sung ';' tôi đã đề xuất trong bình luận trước) và mã JS của bạn hoạt động tốt cho tôi. Vì vậy, có thể kiểm tra mã HTML của bạn nếu OK của nó –

Trả lời

5

Tôi đã nhận được ID thành phần bằng cách đánh dấu chúng trong Firefox và chọn inspect element. Hóa ra điều này mang lại ID khác nhau cho những người trở lại với:

NSString *body = [self.emailWebView stringByEvaluatingJavaScriptFromString: 
        @"document.getElementsByTagName('body')[0].outerHTML"];    
NSLog(@"%@", body); 

Cắm các ID (mà rõ ràng là khác nhau phụ thuộc vào những gì được sử dụng để điều hướng đến trang) thành:

[self.emailWebView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('username').value = '%@';", user]]; 
[self.emailWebView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('password').value = '%@';", pw]]; 
[self.emailWebView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('input_LoginPage-ipad_1').click();"]]; 

Giải quyết nó.

Cảm ơn tất cả những người trợ giúp của bạn.

+0

hãy xem http://stackoverflow.com/questions/37644551/auto-fill-forms-in-webview-by-javascript-android này. nó cần sự giúp đỡ của bạn. –

4

Bạn phải đặt mã javascript bên trong một NSString và sau đó thực hiện với stringByEvaluatingJavaScriptFromString. Đây là cách mã sẽ trông giống như:

[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('email').value = '%@'", email]]; 
[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.getElementById('pass').value = '%@'", password]]; 
+0

Cảm ơn bạn. Tôi sẽ thử. – Robert

+0

Np. Hãy cho tôi biết nếu nó giúp bạn. –

+0

Vẫn không có niềm vui. Một đồng nghiệp đã quản lý để điền trước các trường thông qua tập lệnh 'C#' nhưng cùng một 'javascript' không hoạt động từ' Objective-C'. – Robert

1

Sử dụng Bộ luật này này sẽ làm việc

view.loadUrl("javascript:(function() { " 
    + " document.getElementById('login').value = '" + emailAdress+ "';" 
    + " document.getElementById('login').readOnly='true'" 
    + "})();");