webview4.4以上版本使用loadurl加载过长js文件失效问题

因为业务需要, 需要在使用Webview的时候,动态的加载js文件到页面中,之前SDK Target版本为16 , 无论JS文件多大,使用一切正常~

近期将target版本改为了19 ,发现存在js过大的时候,使用4.4以上版本执行项目,JS文件不执行。

查看源码发现在4.4版本以上内核对处理js做了区别处理:

495    @Override
496    public void loadUrl(final String url, Map<String, String> additionalHttpHeaders) {
497        // TODO: We may actually want to do some sanity checks here (like filter about://chrome).
498
499        // For backwards compatibility, apps targeting less than K will have JS URLs evaluated
500        // directly and any result of the evaluation will not replace the current page content.
501        // Matching Chrome behavior more closely; apps targetting >= K that load a JS URL will
502        // have the result of that URL replace the content of the current page.
503        final String JAVASCRIPT_SCHEME = "javascript:";
504        if (mAppTargetSdkVersion < Build.VERSION_CODES.KITKAT &&
505                url != null && url.startsWith(JAVASCRIPT_SCHEME)) {
506            mFactory.startYourEngines(true);
507            if (checkNeedsPost()) {
508                mRunQueue.addTask(new Runnable() {
509                    @Override
510                    public void run() {
511                        mAwContents.evaluateJavaScriptEvenIfNotYetNavigated(
512                                url.substring(JAVASCRIPT_SCHEME.length()));
513                    }
514                });
515            } else {
516                mAwContents.evaluateJavaScriptEvenIfNotYetNavigated(
517                        url.substring(JAVASCRIPT_SCHEME.length()));
518            }
519            return;
520        }
521
522        LoadUrlParams params = new LoadUrlParams(url);
523        if (additionalHttpHeaders != null) params.setExtraHeaders(additionalHttpHeaders);
524        loadUrlOnUiThread(params);
525    }

进一步查看,发现在4.4版本, 系统提供了:

632    public void evaluateJavaScript(String script, ValueCallback<String> resultCallback) {
633        checkThread();
634        mAwContents.evaluateJavaScript(script, resultCallback);
635    }

查看说明

Asynchronously evaluates JavaScript in the context of the currently displayed page. If non-null, |resultCallback| will be invoked with any result returned from that execution. This method must be called on the UI thread and the callback will be made on the UI thread.

Parameters
script	the JavaScript to execute.
resultCallback	A callback to be invoked when the script execution completes with the result of the execution (if any). May be null if no notificaion of the result is required.

发现该方法用于执行JavaScript 方法, 那么既然有了它,就可以不用loadurl ,so 区分版本试一下, 果然有了效果。

另外其实还有个偷懒的解决方法:因为loadurl区分版本是用的target , 那么把target改小点呗,但是版本早晚要升上来, 治标不治本。

时间: 2024-08-01 11:02:28

webview4.4以上版本使用loadurl加载过长js文件失效问题的相关文章

JQuery 加载 CSS、JS 文件的方法有哪些?

在进行web前端开发(http://www.maiziedu.com/course/web-px/)时,我们可能会需要使用JQuery加载一个外部的css文件或者js文件,加载外部文件的方法有多种,下面具体看看各种加载方法 JS 方式加载 CSS.JS 文件: //加载 css 文件function includeCss(filename) { var head = document.getElementsByTagName('head')[0]; var link = document.cre

使用getScript()方法异步加载并执行js文件

使用getScript()方法异步加载并执行js文件 使用getScript()方法异步请求并执行服务器中的JavaScript格式的文件,它的调用格式如下所示: jQuery.getScript(url,[callback])或$.getScript(url,[callback]) 参数url为服务器请求地址,可选项callback参数为请求成功后执行的回调函数. 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E

手机端和PC端分别加载不同的js文件

分手机端和PC端其实方法很多,我们在响应式设计.响应式网站建设中经常碰到此类需求.下面说说我们在项目中遇到的需求: 手机端和PC端分别加载不同的js客服代码(注意:是要在PC和手机端分别加载不同的js文件) 第一种方法(简单型): <script type="text/javascript"> // 根据屏幕尺寸 if (screen && screen.width > 480) { document.write('<script type=&q

php ci框架中加载css和js文件失败的原因及解决方法

在将html页面整合到ci框架里面的时候,加载css和js失败.原因是ci框架是入口的框架 对框架中文件的所有请求都需要经过index.php处理完成,当加载外部的css和js文件的时候要使 用base_url()函数处理外部的链接. 在控制器中需要先载入url相关的类 public function test() { $this->load->helper('url'); $this->load->view('admin/test'); } 在test.php的view视图中.

.NET Web后台动态加载Css、JS 文件,换肤方案

后台动态加载文件代码: //假设css文件:TestCss.css #region 动态加载css文件 public void AddCss() { HtmlGenericControl _CssFile = new HtmlGenericControl("link"); _CssFile.ID = "CssFile"; _CssFile.Attributes["rel"] = "stylesheet"; _CssFile.A

25.使用getScript()方法异步加载并执行js文件

使用getScript()方法异步请求并执行服务器中的JavaScript格式的文件,它的调用格式如下所示: jQuery.getScript(url,[callback])或$.getScript(url,[callback]) 参数url为服务器请求地址,可选项callback参数为请求成功后执行的回调函数. 例如,点击“加载”按钮,调用getScript()加载并执行服务器中指定名称的JavaScript格式的文件,并在页面中显示加载后的数据内容,如下图所示: 在浏览器中显示的效果: 从图

JavaScript_动态加载CSS和JS文件

项目中需要用到动态加载CSS 文件,整理了一下,顺便融合了动态加载JS 的功能写成了一个对象,先上代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var dynamicLoading = {   css: function(path){  if(!path || path.length === 0){   throw new Error('argument "path" is required !');

JavaScript动态加载CSS和JS文件

var dynamicLoading = { css: function(path){ if(!path || path.length === 0){ throw new Error('argument "path" is required !'); } var head = document.getElementsByTagName('head')[0]; var link = document.createElement('link'); link.href = path; lin

如何点击按钮后在加载外部的Js文件

或许有朋友遇到过,想等自己点击按钮之后才执行某一个js文件,那么,你运气好,看到了我的代码了哈哈, <html> <head> <title></title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js" type="text/javascript"></script> <scri