使用本地资产/ HTML /资源时,jQuery getScript无法在Android WebView中运行

Oli*_*ain 5 jquery android webview

我有一个包含WebView的原生Android应用程序.我的所有HTML,js和css都已添加到assets文件夹中的Android项目中,所以我在Java代码中初始化我的WebView就像这样......

WebView webView = (WebView)findViewById(R.id.webview);
webView.loadUrl("file:///android_asset/index.htm");
Run Code Online (Sandbox Code Playgroud)

一切正常,直到我需要使用jQuery getScript方法从JavaScript动态加载其他js文件...

var scriptUrl = "scripts/dynamicScript.js";
$.getScript(scriptUrl , function() { alert("Success"); })
    .fail(function(e){ alert("failed: " + JSON.stringify(e)); });
Run Code Online (Sandbox Code Playgroud)

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

failed: {"readState":4,"responseText":"", "status":404, "statusText":"error"}
Run Code Online (Sandbox Code Playgroud)

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

"/scripts/dynamicScript.js"
"./scripts/dynamicScript.js"
"android_asset/scripts/dynamicScript.js"
"../android_asset/scripts/dynamicScript.js"
"file:///android_asset/scripts/dynamicScript.js"
Run Code Online (Sandbox Code Playgroud)

我希望这可能与同源策略有关.任何帮助实现这项工作表示赞赏.

编辑:另外

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

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

$.ajax({
   url: scriptUrl, 
   dataType: 'script', 
   success: function() { alert("Success"); },
   error: function(e){ alert("failed: " + JSON.stringify(e)); },
   async: true
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Oli*_*ain 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);
Run Code Online (Sandbox Code Playgroud)

感谢Phillip Fitzsimmons.不知道为什么jQuery脚本追加不起作用.