使用jquery元数据插件和jquery验证插件的主要烦恼

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的数据属性,就会中断这些内容.

现在的问题是:

看起来元数据和验证都是"经过验证的"插件.这是使用人们刚刚使用的元数据插件的已知副作用吗?

我通常不喜欢修改插件代码来满足我的项目需求,但这似乎应该是:

  • 修复元数据插件,不要盲目评估东西,不要使用eval或
  • 修复要使用的validate插件.data()而不是元数据插件

此外,还有其他方法来修改元数据插件

post bounty edit: 我应该更清楚一点,我会对如何发生这种情况的讨论感兴趣.如何在规范的验证插件和我看过的resig编写的插件中都存在如此大的错误.

一个修复很简单,我已经应用了它(我选择修改验证插件,以便在定义'meta'时使用$ .data) - 我在这里给150分的想法是为什么这仍然是一个问题(或者可能它不是!)

Jef*_* To 7

正如您所发现的,"错误"(使用eval)取决于元数据插件,而不是验证插件.

您链接到的元数据插件的版本实际上是一个分叉; jQuery团队有正式的回购.如果查看提交历史记录,您会发现自2007年以来没有任何真正的代码更新.该插件自2011年4月起已被正式弃用.

(John Resig在2008年7月发表了关于HTML5数据属性的博客,jQuery核心的支持在201010月发布的1.4.3中得到了支持.)

所以我想你的问题"这可能发生了怎么回事"的答案就是你不再想要使用插件了:-)

(更新:"官方"回购现在是"由jQuery的基金会孤儿项目"下.)

至于验证插件,除了一些演示meta选项,我在文档中找不到任何元数据插件.正在进行的工作是添加对数据属性的支持弃用元数据插件,因此希望在下一个版本准备就绪时,最终可以放弃元数据插件.