6

我正在使用 jQuery Validation 插件来验证我网站上的表单。

http://docs.jquery.com/Plugins/Validation

我还使用以下代码为不支持 HTML5placeholder=""属性的浏览器提供占位符支持。

// To detect native support for the HTML5 placeholder attribute
var fakeInput = document.createElement("input"),
    placeHolderSupport = ("placeholder" in fakeInput);

// Applies placeholder attribute behavior in web browsers that don't support it
if (!placeHolderSupport) {

    $('[placeholder]').focus(function() {
        var input = $(this);
        if (input.val() == input.attr('placeholder')) {
            input.val('');
            input.removeClass('placeholder');
        }
    }).blur(function() {
        var input = $(this);
        if (input.val() == '') {
            input.addClass('placeholder');
            input.val(input.attr('placeholder'));
        }
    }).blur().parents('form').submit(function() {
        $(this).find('[placeholder]').each(function() { //line 20
            var input = $(this);
            if (input.val() == input.attr('placeholder')) {
                input.val('');
            }
        });
    });
}

当我提交表单时,会发生以下情况:

在支持该placeholder属性的浏览器中,该validate()函数会触发并且一切都按预期运行。

在不支持该placeholder属性的浏览器中,第 20-25 行清除所有“占位符”,然后validate()函数触发。如果没有错误,则页面提交并且一切正常。

在不受支持的浏览器中,如果出现错误,则会像往常一样应用相应的字段class="error"——但占位符文本不会返回,直到blur()事件发生在特定字段上。这会使这些字段留空——由于没有标签(只有placeholder属性),用户只能猜测每个空字段应该包含什么,直到blur()事件发生。

不受支持的浏览器的另一个问题是,由于占位符修复修改了value属性以显示占位符,因此标​​记为必需的字段在它们应该失败时通过验证。

似乎没有简单的方法可以将验证插件与占位符支持代码一起使用。

我正在寻找修改占位符支持代码或将submitHandler: {}函数作为参数添加到函数中,validate()以使其在不受支持的浏览器中工作。

4

4 回答 4

7

我遇到了类似的问题。你让你的工作了吗?我很想比较笔记。

FWIW,这就是我所做的:

jsfiddle 演示在这里

将输入占位符添加到 jQuery 支持对象:

$.support.placeholder = (function() {
    var i = document.createElement( 'input' );
    return 'placeholder' in i;
})();

占位符链:

$('input')
    .addClass('hint')
    .val( function() {
        if ( !$.support.placeholder ) {
            return $(this).attr('placeholder');
        }
    })
    .bind({
        focus: function() {
            var $this = $(this);
            $this.removeClass('hint');
            if ( $this.val() === $this.attr('placeholder') ) {
                $this.val('');
            }
        },
        blur: function() {
            var $this = $(this),

                // Trim whitespace if only space characters are entered,
                // which breaks the placeholders.
                val = $.trim( $this.val() ),
                ph = $this.attr('placeholder');

            if ( val === ph || val === '' ) {
                $this.addClass('hint').val('');
                if ( !$.support.placeholder ) {
                    $this.val(ph);
                }
            }
        }
    });

添加新的验证规则

添加方法文档

$.validator.addMethod('notPlaceholder', function(val, el) {
    return this.optional(el) || ( val !== $(el).attr('placeholder') );
}, $.validator.messages.required);

在验证规则对象中包含新方法

$('form').validate({
    rules: {
        name: {
            required: true,
            notPlaceholder: true
        },
        email: {
            required: true,
            notPlaceholder: true,
            email: true
        }
    }
});
于 2011-07-09T12:59:34.780 回答
2

我认为将其添加到 jquery.validate.js 中的required函数(第 900 行)是最好的:

required: function(value, element, param) {

        // Our change
        if (element.value == element.defaultValue) {
            return false;
        }
        // End our change
于 2012-01-09T13:16:44.413 回答
1

您可以通过将 this 绑定到提交函数来解决这个问题(通过 jQuery 验证或手动)

 if(element.val() == text){
      element.val('');
 }
于 2011-05-10T17:07:42.870 回答
1

占位符插件更新解决了我的问题:)

于 2012-08-03T11:08:14.967 回答