Javascript Underline.js_389;.模板导致来自Chrome扩展的错误
如果我在Google Chrome扩展中使用's,控制台中会出现以下错误: 未捕获错误:此上下文不允许从字符串生成代码Javascript Underline.js_389;.模板导致来自Chrome扩展的错误,javascript,google-chrome-extension,underscore.js,Javascript,Google Chrome Extension,Underscore.js,如果我在Google Chrome扩展中使用's,控制台中会出现以下错误: 未捕获错误:此上下文不允许从字符串生成代码 有没有办法克服这个错误?非常感谢Chromium列表贡献者指出,要以下划线的方式创建函数对象,需要内容安全策略的选项包含“不安全评估” 例如,您的manifest.json可以是 { “清单版本”:2, ... “内容安全策略”:“脚本src'self”“不安全评估”, ... } 然后下划线行为会起作用,因为这个策略允许它。有关该格式的更多信息,请参阅有关该选项的Chrom
有没有办法克服这个错误?非常感谢Chromium列表贡献者指出,要以下划线的方式创建
函数
对象,需要内容安全策略
的选项包含“不安全评估”
例如,您的manifest.json
可以是
{
“清单版本”:2,
...
“内容安全策略”:“脚本src'self”“不安全评估”,
...
}
然后下划线行为会起作用,因为这个策略允许它。有关该格式的更多信息,请参阅有关该选项的Chrome文档。不幸的是,我认为您不能在Chrome扩展中使用下划线.js的uu.template(),至少在新的manifest.json版本2中是如此。同样的道理也适用于尝试使用
从Google Chrome扩展的页面:
没有任何机制可以放松对执行内联JavaScript的限制。特别是,设置包含不安全内联的脚本策略不会产生任何效果。这是故意的
我将研究其他模板引擎,希望它们不会使用新函数对象。清单v2限制,如上所述,禁止使用Eval、新函数和内联脚本-即使在玩内容安全策略时:在v2扩展中
大多数模板库在某种程度上使用evals。
一种解决方案是重写扩展,使所有逻辑都驻留在javascript中,而不驻留在模板中;在这种情况下,这样的解决方案应该是可用的
但是,在清单中有执行Eval和new函数的选项,例如,清单中有以下行:
"sandbox": {
"pages": [
"page1.html",
"directory/page2.html"
]
},
沙盒页面将无法访问扩展或应用程序API,也无法直接访问非沙盒页面(它可能通过postMessage()与其通信)。您可以使用特定CSP进一步限制沙箱权限
现在,Google Chrome团队提供了一个完整的示例,说明如何通过与沙盒iframe以及
希望有一些库会使用这种机制来提供与标准模板用法的完全兼容性,尽管出于性能原因,我建议从模板中删除尽可能多的逻辑
多亏了谷歌,我们的产品阵容中出现了大量的扩展重写:(谷歌刚刚发布了一份新的文档,讨论这个问题的解决方案
您可以使用jQuery的$(“”)
构造编写自己的模板迷你引擎
清洁方式:
function myElement(text) {
var d = $('<div class="abc"/>');
d.text(text);
return d;
}
myElement('my text').appendTo(domParent);
函数myElement(文本){
变量d=$('');
d、 文本(文本);
返回d;
}
myElement(“我的文本”).appendTo(domParent);
肮脏的方式:
var yourTemplate = '<div>${somevar}</div>';
function instTemplate(tmpl, text) {
return $(tmpl.replace(/\$\{somevar\}/g, text));
}
instTemplate(yourTemplate, 'your text').appendTo(domParent);
var-yourTemplate='${somevar}';
函数模板(tmpl,文本){
返回$(tmpl.replace(/\$\{somevar\}/g,text));
}
instTemplate(你的模板,'你的文本').appendTo(domParent);
例如,使用脏方法重写简单的jquery.tmpl模板非常快,如果你知道替换的数据是无害的,等等。我使用下划线.js
因为我想要主干.js
作为我的Chrome扩展,我只是将模板引擎更改为mustach
~如果你有同样的原因,你可以也可以使用下划线.js作为主干,但不要使用\uuu.template()
函数。链接失效,我不知道如何添加“不安全评估”,chrome一直拒绝我尝试的一切。你能给你的答案添加一个例子吗?谢谢。下面是一个将不安全评估添加到清单的例子。json:谢谢!我还发现chrome extensions v2不安全评估目前不起作用。正在进行讨论关于在此处接受不安全评估或将其禁用(问题的当前状态为wontfix):无法从“/home/Envs/todolist”加载扩展。“内容安全策略”的值无效。我收到了上述错误。我创建了一个超级基本的示例来说明如何执行此操作:您可能还会看到由于内容安全策略而拒绝执行内联脚本。X-WebKit-CSP:script src'safe eval';使用Mustache
而不是下划线的。模板对我来说是最简单的解决方案。是的,Mustache
可以+1内联脚本限制只适用于出现在HTML页面内的JS(即“内联”JS)。您可以通过将以前内联的JS放入自己的.JS文件中,并通过脚本标记或其他机制加载它来绕过上面引用的特定内容。换句话说,您引用的内容似乎不适用于不安全的评估问题。具体而言,链接现在已失效