Webview JavaScript加载不一致

Webview JavaScript加载不一致,java,android,webview,Java,Android,Webview,我正在开发一个应用程序,它可以获取一个网页,并注入JavaScript来为移动设备格式化网站。这段代码在我的Nexus5和Nexus7上都运行良好。然而,在我的Moto G和LG G2上,它的注入并不一致。有时页面会正确加载,JavaScript会改变网站的外观。其他情况下,加载页面时不进行任何更改。我已经找了一个多星期的原因,但什么也没找到。下面是我正在使用的代码 这是一个样本片段 public class Summary extends Fragment { @Overrid

我正在开发一个应用程序,它可以获取一个网页,并注入JavaScript来为移动设备格式化网站。这段代码在我的Nexus5和Nexus7上都运行良好。然而,在我的Moto G和LG G2上,它的注入并不一致。有时页面会正确加载,JavaScript会改变网站的外观。其他情况下,加载页面时不进行任何更改。我已经找了一个多星期的原因,但什么也没找到。下面是我正在使用的代码

这是一个样本片段

public class Summary extends  Fragment  {


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {        
        super.onActivityCreated(savedInstanceState);
    }

    @SuppressLint("SetJavaScriptEnabled")
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

        View myFragmentView = inflater.inflate(R.layout.summary, container, false);

        final ProgressDialog pd = ProgressDialog.show(getActivity(), "FRC Manual", "Loading");
        final WebView webView = (WebView) myFragmentView.findViewById(R.id.webview1);
        String url = "http://google.com";

        Functions.webViewSettings(webView);
        Functions.zoom(webView);
        Functions.cache(webView, getActivity());

        webView.setWebViewClient(new MyWebViewClient() {

            boolean loadingFinished = true;
            boolean redirect = false;

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String urlNewString) {
                if (!loadingFinished) {
                    redirect = true;
                }

                loadingFinished = false;
                view.loadUrl(urlNewString);
                return true;
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap facicon) {
                loadingFinished = false;
                //SHOW LOADING IF IT ISNT ALREADY VISIBLE  
            }

            @Override
            public void onPageFinished(WebView view, String url)
            {
                if(!redirect) {
                    loadingFinished = true;
                    Functions.javascript(webView, url);
                    Functions.javascript(webView, url);
                    Functions.javascript(webView, url);
                    pd.dismiss();

                }
                if(loadingFinished && !redirect) {
                    Functions.javascript(webView, url);
                    Functions.javascript(webView, url);
                    Functions.javascript(webView, url);
                    pd.dismiss();
                } 
                else {
                    redirect = false;
                    Functions.javascript(webView, url);
                    Functions.javascript(webView, url);
                    Functions.javascript(webView, url);
                    pd.dismiss();
                }
                super.onPageFinished(webView, url);
            }
        });
        webView.loadUrl(url);

        return myFragmentView;


    }




    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (Uri.parse(url).getHost().equals("www.example.com")) {
                // This is my web site, so do not override; let my WebView load the page
                return false;
            }
            // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;
        }
    }

}
这是处理所有webview设置的类

    public class Functions {

    public static void javascript(WebView view, String url) {
         view.loadUrl("javascript:var con = document.getElementById('header_container'); "
                 + "con.style.display = 'none'; javascript:var con = document.getElementById('footer'); "
                 + "con.style.display = 'none'; javascript:var con = document.getElementsByClassName('ChapterTools RightPos')[0].style.visibility='hidden';"
                 + "javascript:var con = document.getElementsByClassName('showhide_button1')[0].style.visibility='hidden';"
                 + "javascript:var con = document.getElementsByClassName('colmid')[0].style.right='100%'; "
                 + "javascript:var con = document.getElementsByClassName('colleft')[0].style.right='initial'; "
                 + "javascript:var con = document.getElementsByClassName('col1')[0].style.width='98%'; "
                 + "javascript:var con = document.getElementsByClassName('col1')[0].style.top='-50px'; "
                 + "javascript:var con = document.getElementsByClassName('colmask threecol')[0].style.right='2%'; "
                 + "javascript:var con = document.getElementsByClassName('colmask threecol')[0].style.width=''; "
                 + "javascript:var img = document.getElementsByTagName('img'); for (var i = 0; i < img.length; ++i) {img[i].style.maxWidth='100%';} "
                 + "javascript:var img = document.getElementsByTagName('img'); for (var i = 0; i < img.length; ++i) {img[i].style.height='';} "
                 + "javascript:var img = document.getElementsByTagName('table'); for (var i = 0; i < img.length; ++i) {img[i].style.width='';} ");
    }

    public static void zoom(WebView view) {
        if (MainActivity.getEnableZoom()==true)view.getSettings().setBuiltInZoomControls(true);
        else view.getSettings().setBuiltInZoomControls(false);
    }

    public static void cache(WebView view, Activity test) {
         if (!isNetworkAvailable(test))view.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ONLY );
         else {
             if(MainActivity.getUpdateCache()==true)view.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT );
             else {
                 if(MainActivity.getEnableCache()==true)view.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ONLY );
                 else view.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT );
             }
         }
    }

    @SuppressWarnings("deprecation")
    @SuppressLint({ "SetJavaScriptEnabled", "SdCardPath" })
    public static void webViewSettings(WebView view) {
        view.getSettings().setJavaScriptEnabled(true);
        view.getSettings().setDomStorageEnabled(true);
        view.setVerticalScrollBarEnabled(false);
        view.setHorizontalScrollBarEnabled(false);
        view.getSettings().setLoadWithOverviewMode(true);
        view.getSettings().setUseWideViewPort(true);
        view.getSettings().setRenderPriority(RenderPriority.HIGH);

        view.getSettings().setAppCacheMaxSize( 5 * 1024 * 1024 ); // 5MB
        view.getSettings().setAppCachePath("/data/data/de.app/cache");
        view.getSettings().setAllowFileAccess( true );
        view.getSettings().setAppCacheEnabled( false );
    }

    public static boolean isNetworkAvailable(Activity test) {
        ConnectivityManager connectivityManager = (ConnectivityManager) test.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null;
    }

}
公共类函数{
公共静态void javascript(WebView视图,字符串url){
view.loadUrl(“javascript:var-con=document.getElementById('header_-container');”
+“con.style.display='none';javascript:var con=document.getElementById('footer');”
+“con.style.display='none';javascript:var-con=document.getElementsByClassName('ChapterTools RightPos')[0]。style.visibility='hidden'
+“javascript:var con=document.getElementsByClassName('showhide_button1')[0]。style.visibility='hidden';”
+“javascript:var con=document.getElementsByClassName('colmid')[0]。style.right='100%'
+“javascript:var con=document.getElementsByClassName('colleft')[0]。style.right='initial'
+“javascript:var-con=document.getElementsByClassName('col1')[0]。style.width='98%;”
+“javascript:var con=document.getElementsByClassName('col1')[0]。style.top='-50px'
+“javascript:var-con=document.getElementsByCassName('colmask threecol')[0]。style.right='2%'
+“javascript:var-con=document.getElementsByClassName('colmask threecol')[0]。style.width=”
+“javascript:var-img=document.getElementsByTagName('img');for(var i=0;i
也许“旧”webview类(Moto G和LG G2=>pre-KitKat)在javascript注入方面存在一些问题。在Nexus5(KitKat)上运行一个新的、更好的基于chromium的网络视图

也许您应该考虑使用JavascriptInterface:

webView.addJavascriptInterface(new MyJavaScriptInterface(), "Android");
然后可以从javascript代码中调用java

反过来说,我会严格地将js代码与java代码分开。因为本机代码中的一个错误或更改意味着您必须更新应用程序。但js代码中的错误或简单更改可以在服务器端解决,无需更新

javascript函数:

function foo() {
 // do something
}
爪哇:


对于调试问题,我建议覆盖

,我对如何使用它有点困惑。你有一个有用的链接来帮助我吗?到目前为止,我发现的东西把我弄糊涂了。编辑:对不起,我有点太快了。。。我修改了我的答案。
webView.loadUrl("javascript:foo()");