2015-05-20 109 views
6

我寫了下面的遞歸輸入驗證器,它適用於我。有沒有更好的方式來訪問每個DOM元素,並檢查它是否是一個輸入字段並驗證它?遞歸驗證HTML輸入元素

function formValidator(parent) 
{ 
    //base case no children 
    if(parent.children().length == 0) 
     return 

    //recurse through each childs' child 
    parent.children().each(function(){ 
     formValidator($(this)); 

    /** 
    * Work : check if this node is an input node 
    */ 
     if($(this).is("input")) 
     { 
      var type = $(this).attr('type'); 

      if(type =="text") 
       //do work bro 

     } 

    });//end for each 

} 
+2

此問題可能更適合[代碼審查堆棧交換](http://codereview.stackexchange.com),因爲您的問題的本質是尋求改進而不是幫助解決問題。 –

+0

噢,我,我甚至不知道代碼審查是一件事情。我可以在那裏移動我的帖子,還是有人可以爲我移動它? – dimlee

+0

你可以在這裏刪除你的帖子並在那裏重新發布(首選),或者將其標記爲主持人的注意力,要求它被遷移(可能避免這種情況,因爲它對於勞累過度的版主更有用)。 - 現在你有一個答案,我不認爲你**可以**刪除它。 –

回答

4

如果你更好意味着更少的冗長,這相當於功能

parent.find('*').each(function(){ 
    /** 
    * Work : check if this node is an input node 
    */ 
     if($(this).is("input")) 
     { 
      var type = $(this).attr('type'); 

      if(type =="text") 
       //do work bro 

     } 

    });//end for each 

注意,沒有必要遞歸這裏是因爲

parent.find('*') 

使用*(all-selector)。這將得到所有的孩子和嵌套的孩子。

更新

爲了提高性能,您可以重構上面

parent.find('input[type="text"]').each(function(){ 
     var type = $(this).attr('type'); 

       //if(type =="text") 
        //above no longer needed 
     });//end for each 

這將讓所有嵌套input元素,所以你就不必連檢查

if($(this).is("input")) 
+0

我喜歡這個答案,但我很溫和地好奇哪個會更有效率。 – dimlee

+0

@dimlee,查看我更新的性能增益答案 – AmmarCSE

+0

您可以避免使用'parent.find'('input:text')進行'type'檢查......' –

3

我會使用更窄的選擇器:

parent.children().find("input:text").each(function(){ 
    // Valid $(this) element to validate 
}); 
+0

這排除了OP代碼處理('if($(this).is(「input」))'')的'parent'的直接子代的輸入。你可以通過刪除'children()'方法來修復它。 –