使用本地资产/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 吗?