2013-06-05 195 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 –