使用 jQuery 1.10.2 和 jQuery Mobile 1.3.2,我尝试使用以下简单的 html 创建一个 chrome 打包应用程序...
<!DOCTYPE html>
<html>
<body>
<div data-role="page">
<script async src="events.js" type="text/javascript"></script>
</div>
</body>
</html>
有两个问题。第一个是 jQuery 将拦截加载 events.js 的脚本标签并调用 xhr.open( s.type, s.url, s.async );然而 s.async 是假的。 Chrome 打包应用程序不允许同步加载。所以在 jQuery 中的这一行之前我设置了 s.async = true;
下一个问题是,jquery 将在第一个文档插入时在每个脚本上调用其 globalEval 方法,这会调用 eval,从而在 chrome 打包应用程序中产生此 CSP 错误:
未捕获的 EvalError:拒绝将字符串计算为 JavaScript,因为“unsafe-eval”不是以下内容安全策略指令中允许的脚本源:“default-src 'self' chrome-extension-resource:”。
一种解决方案可能是沙箱(在 list 中添加 html 页面),但这会导致另一个问题: XMLHttpRequest 无法加载 chrome-extension://ocnbknafegfhcgbiciegbfndjckamkoj/events.html。 Access-Control-Allow-Origin 不允许 Origin null。 服务器有“Access-Control-Allow-Origin”,“*”,所以我不会想到这个错误。
那么,第一个同步错误是 jquery 问题吗? 第二个问题也是jquery/chrome打包的应用程序不匹配吗? CSP 有解决方法吗? 有没有办法沙箱但允许页面之间导航?
最佳答案
正如您所提到的,由于内容安全策略 (CSP),您无法在 Chrome 打包应用中使用 globalEval。您也不能使用行内脚本标记,因为 CSP 也认为这存在安全风险。
通过对非 CSP 投诉的 HTML 和 JS 进行沙箱处理,您的做法是正确的,但是为了发出 XHR 请求,您需要在窗口之间使用消息传递服务来消除 Origin 错误。
查看以下网址,其中包含有关如何处理跨源请求的文档:http://developer.chrome.com/apps/app_external.html#cross-origin
关于jquery - Chrome 打包应用程序无法与 jquery 和 jquery mobile 配合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19365017/