【问题标题】:jQuery getScript not working in Android WebView when using Local Assets/HTML/Resources使用本地资产/HTML/资源时,jQuery getScript 在 Android WebView 中不起作用
【发布时间】: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,我已经尝试过,但似乎也不起作用(我将更新我的原始帖子以展示我尝试过的内容)

标签: jquery android webview


【解决方案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 脚本追加没有成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多