我正在使用无处不在的jquery validate 插件进行表单验证。它支持使用元数据插件向表单元素添加验证规则。
我正在使用这个功能。当 validate 查找这些规则时,它会在元素上进行此调用:
$(element).metadata()[meta]
wheremeta
是您存储这些规则的前缀。例如
<input data-validate="{maxLength: 12}" name='foo'/>
meta 的值将设置为“验证”以获取这些属性。但是这里有个大问题!
以下是元数据插件将数据属性解析为 json 的操作:
var getObject = function(data) {
if(typeof data != "string") return data;
data = eval("(" + data + ")"); //oh no!!!!!
return data;
}
if ( settings.type == "html5" ) {
var object = {};
$( elem.attributes ).each(function() {
var name = this.nodeName;
if(name.match(/^data-/)) name = name.replace(/^data-/, '');
else return true;
object[name] = getObject(this.nodeValue);
});
}
所以最终发生的是元数据解析所有data-*
属性并尝试评估内容!一旦你包含一个不包含 json 的数据属性,这就会破坏东西。
现在的问题:
似乎元数据和验证都是“尝试过的和真实的”插件。这是使用人们刚刚使用的元数据插件的已知副作用吗?
我通常不喜欢修改插件代码以适应我的项目需求,但这似乎我应该:
- 修复元数据插件不盲目评估东西,不使用评估或
- 修复要使用的验证插件
.data()
而不是元数据插件
另外,除了修改元数据插件之外,还有其他方法吗
赏金后编辑: 我应该更清楚地说明这一点,我会对有关这可能如何发生的一些讨论感兴趣。在规范验证插件和我见过的由 resig 编写的随处使用的插件中如何可能存在如此严重的错误。
修复很简单,我已经应用了它(我选择修改验证插件以在定义“元”时使用 $.data) - 我在这里给出 150 分是关于为什么这仍然是一个问题的想法(或者也许不是!)