【发布时间】: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,我已经尝试过,但似乎也不起作用(我将更新我的原始帖子以展示我尝试过的内容)