Android WebView 总是在 loadUrl 上为 javascript getElementById 返回 null

IT技术 java javascript android webview
2021-03-06 03:52:36

我尝试在 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)一切正常。我不知道,这里出了什么问题。

感谢您的提示!

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

3个回答

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

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

myview.getSettings().setDomStorageEnabled(true);

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

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

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

瞧。这是工作。

像一个老板一样 !!@Catscratch。像一个老板一样 !!
2021-04-21 03:52:36
@catscratch 请查看此stackoverflow.com/questions/37644551/...它需要帮助。
2021-04-21 03:52:36
实际上,您的问题在 Android 4.4 之前不会发生,因为 Google 已经new WebView从 Android 4.4 版本更改为更好。
2021-05-04 03:52:36
任何完整的例子,请。
2021-05-16 03:52:36
我不知道为什么,但实际上代码需要将声明的东西声明为“var x”。现在开始工作了。
2021-05-21 03:52:36

我也在这个问题上挣扎了很长一段时间。我在空白页上遇到了与@Catscratch 相同的问题,但没有任何效果。奇怪的是,如果您将相同的代码包装在 Javascript 函数中,则一切正常。

因此,

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

工作,而

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

不起作用。

而这一切,而不需要setDomStorageEnabled(true)和不setWebChromeClient()

这些都不起作用。document.getElementsByTagName('a');在 WebView 中返回 undefined 但在桌面上访问时有效
2021-04-23 03:52:36
你能建议我在哪里我必须传递主 URL 或传递主 URL 而不是我 loadUrl of javascript
2021-05-11 03:52:36

另一个似乎有效的解决方法:确保你的javascript“返回”null,例如:

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

然而奇怪的是,如果您不使用,getElementById则 loadUrl 返回值是可以的,不会发生相同的行为。闻起来像某种错误……可能是这个错误,但在某些版本的 android [?]