对于loadUrl上的javascript getElementById,Android WebView始终返回null

时间:2014-09-01 08:52:07

标签: java javascript android webview

我尝试从Android客户端应用程序填写webview中的表单。我知道它应该如何工作,但getElementById总是为我返回null。我在不同的网站上试过。

以下是www.google.com的示例。

MyWebView view = new MyWebView(this);
view.getSettings().setJavaScriptEnabled(true);
view.loadUrl("http://www.google.com");
view.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView v, String url) {
        v.loadUrl(url);
        return true;
    }
    @Override
    public void onPageFinished(WebView v, String url) {
        v.loadUrl("javascript:document.getElementById('mib').value = 'aaa';");              
    }
});
setContentView(view);

MyWebView类(仅供参考)。

class MyWebView extends WebView {
    Context context;
    public MyWebView(Context context) {
        super(context);
        this.context = context;
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // do some multi touch stuff
        return true;
    }
}

我总是得到错误:

09-01 04:35:26.453: I/chromium(2962): [INFO:CONSOLE(1)] "Uncaught TypeError: Cannot set property 'value' of null", source: https://www.google.de/?gws_rd=ssl (1)

但元素" mib"应该在网站上。使用桌面浏览器(带有移动模拟的chrome)一切正常。我不知道,这里出了什么问题。

感谢提示!

编辑: 我取得了一些进展。关于this站点,我还需要setDomStorageEnabled(true)。 不,我可以找到DOM对象并设置值,但是我没有显示修改后的站点,而是获得了一个只有我设置的值的新空白。例如。一个带有文字的白色空白网站" aaa"。

3 个答案:

答案 0 :(得分:33)

最后我找到了解决方案!这是一个非常奇怪的行为。

首先,您需要在webview上指定setDomStorageEnabled(true)。否则DOM不起作用。我想知道为什么没有教程给出一个暗示。但好的。

myview.getSettings().setDomStorageEnabled(true);

在此之后,我结束了一个白色的空白页面,只有我设置的值。奇怪的是,javascript:document.getElementById('myfield').value = 'aaa';返回一个值。就是我设定的那个。因此创建了一个仅包含字符串“aaa”的新空白页。

我通过修改javascript来抛弃返回结果来解决它:

javascript:var x = document.getElementById('myfield').value = 'aaa';

瞧瞧。它正在发挥作用。

答案 1 :(得分:11)

我也在这个问题上挣扎了很长一段时间。我和@Catscratch的空白页面有同样的问题,没有任何效果。奇怪的是,如果你在Javascript函数中包含相同的代码,那一切都可以。

因此,

 webView.loadUrl("javascript:(function() { document.getElementById('email_field').value = '" + email + "'; })()");

有效,而

webView.loadUrl("javascript:document.getElementById('email_field').value = '" + email + "';");

不起作用。

所有这些没有需要setDomStorageEnabled(true)且没有setWebChromeClient()

答案 2 :(得分:0)

另一种解决方法似乎有效:确保javascript“return”null,例如:

loadUrl("javascript:document.getElementById('myfield').value = 'aaa'; null");

然而,奇怪的是,如果您没有使用getElementById,那么loadUrl可以返回值,但不会发生相同的行为。闻起来像某种bug ......它可能是this bug但可能在某些版本的android中没有修复[?]