javascript – WebView.loadUrl()中的Android JS

前端之家收集整理的这篇文章主要介绍了javascript – WebView.loadUrl()中的Android JS前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在WebView中加载一个网页,但删除部分网页.所以,我创建了一个自定义WebViewClient.并且,在onPageFinished()中,我做了一些 javascript删除一些元素.然后,我使WebView可见.

但是,当我运行它时,它将视图设置为可见,然后我看到要删除的元素.就好像JS在后台运行非常慢.它会创建一个糟糕的观看体验,因为它会闪烁整个页面,然后闪烁所需的部分页面.

这是我的onPageFinished()

  1. @Override
  2. public void onPageFinished(WebView view,String url) {
  3.  
  4. view.loadUrl("javascript:"
  5. + "document.getElementsByClassName('header')[0].style.display='none';"
  6. + "document.getElementById('section_0').style.display='none';"
  7. + "document.getElementById('page-actions').style.display='none';"
  8. + "document.getElementsByClassName('languageSelector')[0].style.display='none';"
  9. + "document.getElementById('mw-mf-last-modified').style.display='none';"
  10. + "document.getElementById('footer').style.display='none';");
  11.  
  12. loadingView.setVisibility(View.INVISIBLE);
  13. view.setVisibility(View.VISIBLE);
  14. }

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

解决方法

在onPageFinished()中:
  1. view.loadUrl("javascript:"
  2. + "var FunctionOne = function () {"
  3. + " var r = $.Deferred();"
  4. + " try{document.getElementsByClassName('header')[0].style.display='none';}catch(e){}"
  5. + " try{document.getElementById('section_0').style.display='none';}catch(e){}"
  6. + " try{document.getElementById('page-actions').style.display='none';}catch(e){}"
  7. + " try{document.getElementsByClassName('languageSelector')[0].style.display='none';}catch(e){}"
  8. + " try{document.getElementById('mw-mf-last-modified').style.display='none';}catch(e){}"
  9. + " try{document.getElementById('footer').style.display='none';}catch(e){}"
  10. + " setTimeout(function () {"
  11. + " r.resolve();"
  12. + " },2500);"
  13. + " return r;"
  14. + "};"
  15. + "var FunctionTwo = function () {"
  16. + " window.CallToAnAndroidFunction.setVisible();"
  17. + "};"
  18. + "FunctionOne().done(FunctionTwo);");

在MainActivity.onCreate()中:

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

在MainActivity()中:

  1. public class JsObject {
  2. private View loadingView;
  3. private View view;
  4. JsObject(View view,View loadingView){this.view = view;this.loadingView = loadingView;}
  5. @JavascriptInterface
  6. public void setVisible(){
  7. runOnUiThread(new Runnable() {
  8.  
  9. @Override
  10. public void run() {
  11. view.setVisibility(View.VISIBLE);
  12. loadingView.setVisibility(View.INVISIBLE);
  13. }
  14. });
  15. }
  16. }

因此,它是一个组合JavascriptInterface和制作JS函数来等待JS调用完成之后调用接口(具有可见性设置).

猜你在找的JavaScript相关文章