eval是邪恶的,但是我有选择吗?
"eval is evil", but do I have an option?
我为我正在做的一个项目想出了一些定制的本地化解决方案。这个想法是,我的HTML可以包含以下内容:
<h2 data-l10n="HELLO" data-l10n-params="['Visitor', new Date()]"></h2>
当页面被启动时,一个javascript函数像这样运行:
localizeAll: function(sel) {
var selector = sel || document,
$o = $(selector);
$o.find('[data-l10n]').each(
function() {
var $t = $(this),
val = $t.attr('data-l10n'),
params = $t.attr('data-l10n-params'),
po = null;
if (typeof params !== 'undefined') {
po = eval(params);
log(params, po);
}
var res = doLocalize(val, po);
if (res[0] !== '<') {
$t.text(res);
} else {
$t.text(val);
}
});
}
所以基本上我们搜索任何具有data-l10n
-属性的元素,并为每个对象调用doLocalize()
。此外,元素可以有一个data-l10n-params
属性,它只是一个字符串字面值,可以被解析为一个数组。这个字符串被计算(params
字符串成为po
数组),po
作为可选的第二个参数提供给doLocalize()
。
log(params, po);
语句)是:
['Vistor', new Date()] ["Vistor", Date {Thu Nov 17 2011 10:10:31 GMT+0100 (CET)}]
是的,我在用eval。是的,我知道eval是邪恶的。但是偶尔,我需要传递一个参数给doLocalize()
。
如果没有eval怎么能做到呢?
我认为你的问题是,你有效地嵌入JavaScript在HTML(这是反对不引人注目的JavaScript原则)。
在你的地方,我会添加一个额外的l18n-params.js
文件,其中包含以下内容:
var dataL10Nparams = {
HELLO = ['Visitor', new Date()]
}
现在不需要从HTML属性中读取参数并求值只需调用:
dataL10Nparams['HELLO']
如果您只在HTML属性中提供参数化值,请考虑使用JSON.parse()而不是求值。
相关文章:
- Javascript:当元素中有<选择>时,可拖动元素搞砸了
- 有选择地使用 MathJax 渲染方程
- 有选择地激活按钮
- 在剑道网格中有选择地将编辑行中的单元格切换为编辑模式
- 是否可以有选择地限制 iframe 对其父文档的访问
- 如何告诉DDP有选择地观察更改某些字段,而不是所有定义的字段
- 有选择地使用 replace()
- 如何使用 geojson 有选择地启用 onEachFeature 函数
- Javascript/Node.js我可以使用hashmap有选择地执行函数吗?
- 删除页面中所有文本的背景色,无论我们是否有选择
- 使用JQuery导航到下拉菜单上有选择的页面
- jQuery函数有选择地工作
- eval是邪恶的,但是我有选择吗?
- 根据以前的类名有选择地隐藏链接
- 使用Javascript或CSS,是否有选择CSS样式溢出:隐藏的元素
- 我如何有选择地打印部分网页与原型JS
- 在jQuery中有选择文件路径的方法吗?
- jQuery if有()选择器
- 我如何有选择地堆栈列与twitter引导
- 如何有选择地将一个函数中的所有画布动作转移到另一个函数