【问题标题】:Pre-fill WebView text fields预填充 WebView 文本字段
【发布时间】:2013-08-09 11:37:05
【问题描述】:

我需要在UIWebView 中预先填写文本字段,并且我知道javascript 是解决此问题的最佳方式。不幸的是,我对javascript 一无所知,过去几个小时一直在摸索,一无所获。

最新的失败尝试:

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

谁能指出我正确的方向?

-编辑-

我还尝试过延迟调用,以防页面未完全加载,如果我调用如下内容:

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

警报出现,但 ID password_5 的字段未填写。

相关字段嵌套在表单中。不知道这样有没有区别?

-编辑 2-

我很确定问题与目标网站上的 HTML / 嵌套有关,因为我刚刚在另一个网站上尝试过,它确实有效。

目标站点嵌套如下:

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

【问题讨论】:

  • 我不确定它是否会有所帮助,但你不是在'testPW' 之后错过了; 吗?
  • 我刚刚测试了您的代码(添加了我在之前的评论中建议的 ;)并且您的 JS 代码对我来说很好。因此,如果可以,请检查您的 HTML 代码
  • 仍然无法正常工作,所以很可能是 HTML。

标签: javascript ios objective-c uiwebview


【解决方案1】:

您必须将 javascript 代码放在一个 NSString 中,然后使用 stringByEvaluatingJavaScriptFromString 执行。这就是代码的样子:

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

【讨论】:

  • 谢谢。我会试试看。
  • Np。让我知道它是否对您有帮助。
  • 仍然没有喜悦。一位同事设法通过 C# 脚本预填充字段,但相同的 javascriptObjective-C 中不起作用。
  • 这肯定行得通,我是从我的一个项目中复制的。问题一定出在其他地方。检查您是否在 javascript 函数中传递了正确的“ID”,检查您的 webView 是否正确,是否设置了委托等。
  • 我已经编辑了 OP 以显示一些其他测试。 AFAICT 委托设置正确,元素 ID 正确且 HTML 在调用 js 之前已完全加载。
【解决方案2】:

我通过在 Firefox 中突出显示元素 ID 并选择 inspect element 获得了元素 ID。 事实证明,这为返回的 ID 提供了不同的 ID:

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

将这些 ID(显然取决于用于导航到页面的内容而有所不同)插入:

[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();"]];

解决了。

感谢大家的帮助。

【讨论】:

【解决方案3】:

使用此代码这将起作用

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多