mko*_*yak 3 jquery jquery-validate
我正在使用无处不在的jquery validate插件进行表单验证.它支持使用元数据插件将验证规则添加到表单元素.
我正在使用此功能.当validate查找这些规则时,它会对元素进行调用:
$(element).metadata()[meta]
Run Code Online (Sandbox Code Playgroud)
where meta存储这些规则的前缀.例如
<input data-validate="{maxLength: 12}" name='foo'/>
Run Code Online (Sandbox Code Playgroud)
meta的值将设置为"validate"以获取这些属性.但这里有一个重大问题!
以下是元数据插件将数据属性解析为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);
});
}
Run Code Online (Sandbox Code Playgroud)
所以最终发生的事情是元数据解析所有data-*属性并尝试评估内容!只要包含不包含json的数据属性,就会中断这些内容.
现在的问题是:
看起来元数据和验证都是"经过验证的"插件.这是使用人们刚刚使用的元数据插件的已知副作用吗?
我通常不喜欢修改插件代码来满足我的项目需求,但这似乎应该是:
.data()而不是元数据插件此外,还有其他方法来修改元数据插件
post bounty edit: 我应该更清楚一点,我会对如何发生这种情况的讨论感兴趣.如何在规范的验证插件和我看过的resig编写的插件中都存在如此大的错误.
一个修复很简单,我已经应用了它(我选择修改验证插件,以便在定义'meta'时使用$ .data) - 我在这里给150分的想法是为什么这仍然是一个问题(或者可能它不是!)
正如您所发现的,"错误"(使用eval)取决于元数据插件,而不是验证插件.
您链接到的元数据插件的版本实际上是一个分叉; jQuery团队有正式的回购.如果查看提交历史记录,您会发现自2007年以来没有任何真正的代码更新.该插件自2011年4月起已被正式弃用.
(John Resig在2008年7月发表了关于HTML5数据属性的博客,jQuery核心的支持在2010年10月发布的1.4.3中得到了支持.)
所以我想你的问题"这可能发生了怎么回事"的答案就是你不再想要使用插件了:-)
(更新:在"官方"回购现在是"由jQuery的基金会孤儿项目"下.)
至于验证插件,除了一些演示和meta选项,我在文档中找不到任何元数据插件.正在进行的工作是添加对数据属性的支持并弃用元数据插件,因此希望在下一个版本准备就绪时,最终可以放弃元数据插件.
| 归档时间: |
|
| 查看次数: |
3488 次 |
| 最近记录: |