2013-06-05 191 views
0

我想要一个验证方法,它将检查两个字段是否相等,然后隐藏其中一个。此刻我用equalTo来检查它们是否相等。所以我计划添加一个验证方法,该方法委托给equalTo并根据结果隐藏字段。Jquery验证:从自定义验证方法调用equalTo方法

我遇到的问题是我无法弄清楚如何在校验器的正确实例上调用equalTo。当我打电话时,我总是在equalTo中看到一个错误,“this.settings没有定义”。这等于

// http://docs.jquery.com/Plugins/Validation/Methods/equalTo 
     equalTo: function(value, element, param) { 
      // bind to the blur event of the target in order to revalidate whenever the target field is updated 
      // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead 
      var target = $(param); 
//error here 
      if (this.settings.onfocusout) { 
        target.unbind(".validate-equalTo").bind("blur.validate-equalTo", function() { 
         $(element).valid(); 
        }); 
       } 
       return value === target.val(); 
     }, 

这是我的代码。

// validate form 
$.validator.addMethod("equalToAndHide", function(value, element, param) { 
    //this does not work 
    var result = $.validator.methods.equalTo.call(value, element, param); 
    if(result === true){ 
     $(element).hide(); 
    } 
    return result; 
}, $.validator.format("Values must be equal_???")); 

$('form').validate({ 
         rules : { 

         confirmEmail : { 
          equalToAndHide : utils.byId("alternateEmail") 
         } 
        }, 
        submitHandler : function(form) { 
         accordionAjax.post($(form)); 
        } 
       }); 

我宁愿离开equalTo,因为它是,而不是重写它,并修改调用this.settings,如果可能的话。

回答

2

您不需要在您的自定义方法中调用原始equalTo ...只需使用原件编写一个全新的函数作为您的基础。

这是默认equalTo功能...

function(value, element, param) { 
    var target = $(param); 
    if (this.settings.onfocusout) { 
     target.unbind(".validate-equalTo").bind("blur.validate-equalTo", function() { 
      $(element).valid(); 
     }); 
    } 
    return value === target.val(); 
} 

把它放在你的自定义的方法中,并调整它适合你的需要......

$.validator.addMethod("equalToAndHide", function(value, element, param) { 
     var target = $(param); 
     if (this.settings.onfocusout) { 
      target.unbind(".validate-equalTo").bind("blur.validate-equalTo", function() { 
       $(element).valid(); 
      }); 
     } 
     return value === target.val(); 
     $('#whatever').hide(); 
}, $.validator.format("Values must be equal_???")); 
+0

谢谢,这会奏效。不过,如果可能的话,我宁愿使用真正的equalTo函数,而不是分叉它。这样,当验证插件升级时,我将获得任何改进的好处。由于equalTo函数中有一个TODO,我认为这很可能发生。 –

+0

@MarkChorley,这是你最好的选择。我已经回答了数百个有关jQuery Validate插件的SO问题,并阅读了数百篇。我从来没有看到你这样做,因为这是不可能的。 – Sparky

+0

感谢您的帮助。可以像这样调用一个jQuery Validate方法,因为当我得到错误时我正在这样做。唯一的问题是解决设置引用:是不是在equalTo中存在,那么我的代码将工作。看到这个问题的一个类似的例子:http://stackoverflow.com/questions/7392875/custom-validation-for-jquery-validate-two-method-in-one/7392947#7392947和这一个一些信息的实例验证器:http://stackoverflow.com/questions/1510165/how-can-i-add-remove-or-swap-jquery-validation-rules-from-a-page –