Android Webview-在页面加载完成后使用Javascript更改元素

Android Webview-在页面加载完成后使用Javascript更改元素,javascript,android,dom,webview,Javascript,Android,Dom,Webview,我想在Web视图中使用Javascript更改HTML页面上的一些值。 在页面加载完成后,我尝试了许多不同的方法来评估Javscript 这是我的密码: webview.getSettings().setJavaScriptEnabled(true); webview.getSettings().setDomStorageEnabled(true); webview.getSettings().setBlockNetworkImage(false); webvi

我想在Web视图中使用Javascript更改HTML页面上的一些值。 在页面加载完成后,我尝试了许多不同的方法来评估Javscript

这是我的密码:

    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setDomStorageEnabled(true);
    webview.getSettings().setBlockNetworkImage(false);

    webview.setWebViewClient(new WebViewClient() {
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }


        public void onPageFinished(WebView view, String url) {

            webview.loadUrl("javascript:(function() { document.getElementById('options').value = '" + found.getId() + "'; ;})()");
            button.performClick();

        }
    });
我认为这意味着,在页面完全加载之前,该方法被提前调用。
你有什么想法吗?

为了使用javascript(也称为DOM操纵)更改HTML中的值/内容/样式,我们需要等待DOM就绪或完全加载。在这种情况下,我们将页面加载到widgetWebView中,然后执行我们的业务

我有一个示例代码,我总是在相同的情况下使用

。。。
最终字符串url=”http://example.com";
最终网络视图网络视图=findViewById(R.id.my_网络视图);
最后一个字符串myNewValue=“它有效!”;
webview.getSettings().setJavaScriptEnabled(true);
setWebChromeClient(新的WebChromeClient());
setWebViewClient(新的WebViewClient(){
@凌驾
公共void onPageFinished(WebView视图,字符串url){
//您的自定义javascript在这里
字符串myCustomJS=“document.getElementById('options')。innerHTML=”+
myNewValue+“'”;
//这里我们执行javascript代码
loadUrl(“javascript:(function(){“+myCustomJS+”})()”;
}
});
//这里我们加载url
loadUrl(url);
...
我希望上面的代码能帮助你继续工作


等待DOM就绪的更新

如果您以前使用过jQuery,那么您必须知道

// example 1: jQuery way
$(document).ready(function() {
    // place our logic here
});

// example 2: native javascript way
document.addEventListener('DOMContentLoaded', function() {
    // place our logic here
});
在DOM就绪后,Im使用此技巧在WebView中操纵页面(在示例2中原生JS方式)

另一个问题为什么不使用runnable

因为我们从不知道互联网速度的用户,假设我们将runnable设置为等待
3000ms
3sec
,但web在runnable执行后没有响应接下来发生了什么?用户将有一个白色的空白屏幕并继续等待

希望这一点现在更清楚


参考链接:

谢谢你的想法。我以后再试试。但是你的代码有什么不同呢?@SimonLiebers我上面的代码也叫WebChromeClient,可能对你有帮助。如果您只想加载web url,那么WebViewClient就足够了。但在很多情况下,我总是面临着同样的问题,当我的自定义JS在互联网上多次搜索后无法使用WebViewClient时。最后我发现了为什么我的自定义JS不起作用,然后我只把WebChromeClient称为magic。对不起,我的英语很差。对我来说,它不会改变任何事情。但是如果我在处理程序中调用javascript,经过延迟后,它就会工作@伊恩cikal@SimonLiebers关键是我们在DOM就绪后等待,之后我们可以使用JS以多种方式操作它。或者在您的例子中,将值从Android发送到WebView,Ok是有意义的,但我如何才能等待DOM呢@伊恩·西卡尔