Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Android WebView中修改DOM?_Javascript_Android_Webview - Fatal编程技术网

Javascript 如何在Android WebView中修改DOM?

Javascript 如何在Android WebView中修改DOM?,javascript,android,webview,Javascript,Android,Webview,我需要修改Android WebView中的DOM页面(使用id或classname隐藏一些元素,并替换一些函数或CSS样式的默认impl)。我已尝试在WebViewClient.onPageLoaded中插入javascript: webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { getSu

我需要修改Android WebView中的DOM页面(使用id或classname隐藏一些元素,并替换一些函数或CSS样式的默认impl)。我已尝试在
WebViewClient.onPageLoaded
中插入javascript:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        getSupportActionBar().setTitle("Finishing ");
        getSupportActionBar().setSubtitle(url);
        view.loadUrl("javascript:alert('hello world 2');");
        getSupportActionBar().setTitle("Finished");
    }
});

(此处显示js发出的警报,而不是实际隐藏)。这并不是我们想要的,因为所有页面都是在未加载时显示的

由于某些原因,js在
onPageStarted
中加载不起作用-它会阻止加载原始URL:

webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            getSupportActionBar().setTitle("Started ");
            getSupportActionBar().setSubtitle(url);

            webView.evaluateJavascript("alert('hello world 1');", null);
            // view.loadUrl("javascript:alert('hello world 1');") prevents too
        }

是否可以在页面开始加载之前插入JS?在
WebView
中回调DOM事件的任何技巧?

在加载端之前,不能在DOM中注入JS,因为DOM是呈现和加载的网站

您可以尝试使用
HttpClient-HttpClient=newdefaulthttpclient()获取网页的源代码
和一个
BufferedReader
并以
字符串传递它。之后,您可以修改该字符串,并在
html
-字符串的主体中插入一个新的
script
标记:

<script>
    alert("Hey, whats up?");
</script>

它应该加载警报弹出窗口。

我解决了这样一个问题,但我在
onPageFinished
方法中解决了这个问题。 可以在DOM操作之前不可见webview。所以用户不会受到流程的影响

 public class WebClient extends WebViewClient {
   ...

        @Override
        public void onPageFinished(WebView view, String url) {

                view.loadUrl("javascript:document.getElementById(\"jumbotron-test\").innerHTML = \"\";void(0);");
                webView.setVisibility(View.VISIBLE);

        }
    }

这可能是解决方案,但有时由于原始页面的脚本而不起作用。为了使它正确,我需要解析html并制作脚本链,以使我的脚本和原始页面的脚本运行,这是相当困难的。顺便说一句,实际的目的不是隐藏元素,而是创建包装或修改css以使元素不可见“这实际上不是我们想要的,因为所有页面都是在未加载时显示的。”
 public class WebClient extends WebViewClient {
   ...

        @Override
        public void onPageFinished(WebView view, String url) {

                view.loadUrl("javascript:document.getElementById(\"jumbotron-test\").innerHTML = \"\";void(0);");
                webView.setVisibility(View.VISIBLE);

        }
    }