2010-09-17 66 views
10

我有一個附有地圖的表單。點擊地圖將隱藏的輸入添加到窗體中的div。jQuery驗證:如何驗證非表單元素?

我想要一個驗證規則來檢查div是否有任何隱藏的元素。到目前爲止,我只能夠與我有張貼的形式之前手動刪除虛設的元素做到這一點:

<form action="..." method="post" id="signup"> 
    <!-- ... --> 
    <div id="zones_selected"><input type="hidden" name="dummy"></div> 
    <!-- ... --> 
</form> 

$.validator.methods.zones = function (value, element, param) { return ($zone_holder.find('input[name!=dummy]').length > 0); }; 
$('#signup').validate({ 
    rules: { 
    //... 
    'dummy': 'zones' 
    }, 
    //... 
    submitHandler: function(form) { $(form).find('input[name=dummy]').remove(); form.submit(); } 
}); 

然而,這些葉子很多不盡如人意的錯誤放置,因爲我的自定義驗證方法似乎沒有觸發過unhighlight函數,並且我僅僅爲了表單驗證而輸入一個輸入(不是非常不顯眼),我覺得很骯髒。

我想要的是沒有額外的submitHandler和一個規則來檢查隱藏輸入的存在,將有一個unhighlight觸發器(如果用戶點擊地圖 - 這將創建一個新的隱藏輸入 - 我顯示的消息告訴他們這樣做將消失)。

完成此操作的最佳方法是什麼?

回答

3

我試過在過去做這個。如果不對jquery.validator代碼庫進行一些修改,我認爲沒有辦法做到這一點。

當JQuery.Validator.js看,檢查出「元素」的LN 423功能,你會看到這樣的事情

return $([]).add(this.currentForm.elements) 
      .filter(":input") 
      .not(":submit, :reset, :image, [disabled]") 
      .not(this.settings.ignore) 
      .filter(function() { 
       !this.name && validator.settings.debug && window.console && console.error("%o has no name assigned", this); 

       // select only the first element for each name, and only those with rules specified 
       if (this.name in rulesCache || !validator.objectLength($(this).rules())) 
        return false; 

       rulesCache[this.name] = true; 
       return true; 
      }); 

的過濾器(「:輸入」)是什麼會給你的悲傷。