WebView.loadUrl()中的Android JS

我想在WebView中加载一个网页,但删除网页的一部分。 所以,我创build了一个自定义的WebViewClient。 而在onPageFinished(),我做了一些JavaScript来删除一些元素。 然后,我使WebView可见。

但是,当我运行它,它将视图设置可见,然后我看到被删除的元素。 就好像JS在非常缓慢的背景下运行一样。 它会产生糟糕的观看体验,因为它会闪烁整个页面,然后闪烁所需的部分页面。

这是我的onPageFinished()

@Override public void onPageFinished(WebView view, String url) { view.loadUrl("javascript:" + "document.getElementsByClassName('header')[0].style.display='none';" + "document.getElementById('section_0').style.display='none';" + "document.getElementById('page-actions').style.display='none';" + "document.getElementsByClassName('languageSelector')[0].style.display='none';" + "document.getElementById('mw-mf-last-modified').style.display='none';" + "document.getElementById('footer').style.display='none';"); loadingView.setVisibility(View.INVISIBLE); view.setVisibility(View.VISIBLE); } 

有想法该怎么解决这个吗?

Solutions Collecting From Web of "WebView.loadUrl()中的Android JS"

在onPageFinished()中:

 view.loadUrl("javascript:" + "var FunctionOne = function () {" + " var r = $.Deferred();" + " try{document.getElementsByClassName('header')[0].style.display='none';}catch(e){}" + " try{document.getElementById('section_0').style.display='none';}catch(e){}" + " try{document.getElementById('page-actions').style.display='none';}catch(e){}" + " try{document.getElementsByClassName('languageSelector')[0].style.display='none';}catch(e){}" + " try{document.getElementById('mw-mf-last-modified').style.display='none';}catch(e){}" + " try{document.getElementById('footer').style.display='none';}catch(e){}" + " setTimeout(function () {" + " r.resolve();" + " }, 2500);" + " return r;" + "};" + "var FunctionTwo = function () {" + " window.CallToAnAndroidFunction.setVisible();" + "};" + "FunctionOne().done(FunctionTwo);"); 

在MainActivity.onCreate()中:

 this.webView.addJavascriptInterface(new JsObject(webView, loadingView), "CallToAnAndroidFunction"); 

在MainActivity()中:

 public class JsObject { private View loadingView; private View view; JsObject(View view, View loadingView){this.view = view;this.loadingView = loadingView;} @JavascriptInterface public void setVisible(){ runOnUiThread(new Runnable() { @Override public void run() { view.setVisibility(View.VISIBLE); loadingView.setVisibility(View.INVISIBLE); } }); } } 

所以,这是一个使JavascriptInterface和JS函数等待JS调用在调用接口(使用可见性设置)之前完成的组合。

你可以试着加快你的WebView:

 webview.getSettings().setRenderPriority(RenderPriority.HIGH); webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 

无论如何,你不应该马上看到你的WebView。 为什么不创build一个接口(请参阅http://developer.android.com/guide/webapps/webview.html ,将JavaScript代码绑定到Android),并从您的JavaScript拨打电话到:

 public void myCallback(){ view.SetVisibilitu(View.VISIBLE) }; 

animation结束后?