使用本地资产/HTML/资源时,jQuery getScript 在 Android WebView 中不起作用

Posted

技术标签:

【中文标题】使用本地资产/HTML/资源时,jQuery getScript 在 Android WebView 中不起作用【英文标题】:jQuery getScript not working in Android WebView when using Local Assets/HTML/Resources 【发布时间】:2012-04-05 22:53:45 【问题描述】:

我有一个包含 WebView 的原生 android 应用。我所有的 html、js 和 css 都已添加到资产文件夹中的 Android 项目中,因此我正在 Java 代码中初始化我的 WebView,如下所示...

WebView webView = (WebView)findViewById(R.id.webview);
webView.loadUrl("file:///android_asset/index.htm");

一切正常,直到我需要使用 jQuery getScript 方法从 javascript 动态加载一个额外的 js 文件...

var scriptUrl = "scripts/dynamicScript.js";
$.getScript(scriptUrl , function()  alert("Success"); )
    .fail(function(e) alert("failed: " + JSON.stringify(e)); );

基本上脚本没有加载,我收到以下消息:

failed: "readState":4,"responseText":"", "status":404, "statusText":"error"

我还尝试了 scriptUrl 的以下替代方案,并得到完全相同的结果和消息:

"/scripts/dynamicScript.js"
"./scripts/dynamicScript.js"
"android_asset/scripts/dynamicScript.js"
"../android_asset/scripts/dynamicScript.js"
"file:///android_asset/scripts/dynamicScript.js"

我预计这可能与same-origin-policy 有关。感谢您提供任何帮助来完成这项工作。

编辑:另外

我现在还尝试了以下 $.getScript() 的替代方法。

使用非异步“脚本”ajax 调用。这导致与上面完全相同...

$.ajax(
   url: scriptUrl, 
   dataType: 'script', 
   success: function()  alert("Success"); ,
   error: function(e) alert("failed: " + JSON.stringify(e)); ,
   async: true
);

并且还在头部动态插入一个脚本标签。这似乎不起作用(例如,如果我只是在 dynamicScript.js 中有一个警报,则它从未见过)...

$("<script type='text/javascript' src='" + scriptUrl +"'></script>").appendTo("head");

我可能还值得指出的是,如果我远程托管网站而不是本地资产,则上述所有尝试都有效,但这不是一个可行的解决方案 IE 如果我按如下方式实例化它就可以工作...

WebView webView = (WebView)findViewById(R.id.webview);
webView.loadUrl("http://remote-server/index.htm");

【问题讨论】:

看起来 jQuery 的 getScript 在底层使用了 Ajax,所以这将是一个不适用于本地文件的 HTTP 请求。您能否改为以“传统”方式导入文件?如果它需要是动态的,也许您可​​以使用 document.write 将“脚本”标签注入到您的 html 中? 感谢您的建议 Phil,我已经尝试过,但似乎也不起作用(我将更新我的原始帖子以展示我尝试过的内容) 【参考方案1】:

啊哈,我似乎猜到了,这个老经典完成了工作......

var scriptUrl = "scripts/dynamicScript.js";
var head = document.getElementsByTagName("head")[0];
script = document.createElement('script');
script.type = 'text/javascript';
script.src = scriptUrl;
script.onload = function()  alert("Success"); ;
script.onerror = function(e)  alert("failed: " + JSON.stringify(e)); ;
head.appendChild(script);

感谢菲利普·菲茨西蒙斯。不知道为什么 jQuery 脚本追加没有成功。

【讨论】:

以上是关于使用本地资产/HTML/资源时,jQuery getScript 在 Android WebView 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

防止在 Yii 框架上使用 ajaxButton/ajaxSubmitButton 加载 jQuery 资产

可以在没有 CSS 资产的情况下安全地使用 jQuery-UI 吗?

本地化资产管理

html 使用promises的jQuery资产排队

如何让 Flutter 的 webview 处理从本地 html 加载的本地资产?

Heroku jQuery JavaScript 库未加载 - 404 错误