我有一个包含WebView的原生Android应用。我所有的HTML,js& css已添加到assets文件夹中的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");
我可能也值得指出,如果我远程托管网站而不是本地资产,所有上述尝试都有效但是这不是一个可行的解决方案,如果我实例化如下,它可以工作......
WebView webView = (WebView)findViewById(R.id.webview);
webView.loadUrl("http://remote-server/index.htm");
答案 0 :(得分:7)
啊哈,我似乎已经怀疑它,这个古老的经典作品完成了工作......
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);
感谢Phillip Fitzsimmons。不知道为什么jQuery脚本追加不起作用。