2013-08-03 31 views
0

我有一個我創建的Asp.Net用戶控件。爲了簡單起見,一些html已被刪除。javascript數組不是唯一的

<asp:Panel ID="PanelInputControl" runat="server" CssClass="input-control input-period"> 
    <div ID="InputWrapperMonth" runat="server" class="input-wrapper input-month"> 
     <asp:TextBox ID="TextBoxMonth" runat="server" 
      MaxLength="2"> 
     </asp:TextBox> 
    </div> 
    <div ID="InputWrapperYear" runat="server" class="input-wrapper input-year"> 
     <asp:TextBox ID="TextBoxYear" runat="server" 
      MaxLength="4"> 
     </asp:TextBox> 
    </div> 
</asp:Panel> 

我也有一個javascript函數,它根據數據輸入的有效性添加類。我再次刪除了一些剩餘的代碼。

下面是如何建立$ EL:

var $el = $(this).closest('.form').find('input[type="text"], input[type="checkbox"], select, textarea'); 

這裏的javascript函數我打電話:

function updateInputStatus($el) { 

    var controls = []; 

    $el.each(function() { 

     $control = $(this).closest('.input-control'); 

     if ($.inArray($control, controls) < 0) { 
      controls.push($control); 
     } 
    }) 
} 

$ EL是一個或多個輸入控制裝置 - 文本框,下拉列表等。在這個例子讓說TextBoxMonth和TextBoxYear是我們的對象$ el,並且觸發了javascript函數。

我想要做的是建立一個獨特的輸入控制對象的數組。在這個例子中PanelInputControl會被找到兩次,但我只希望它被添加到數組中一次。

實際情況是,代碼$.inArray($control, controls) < 0始終返回-1,無論情況如何(在數組中找不到它),我不明白爲什麼。

我也試過在最後加上這段代碼var cleanArray = $.unique(controls);,但是這些副本仍然保留在數組中。

我很困惑 - 有什麼建議嗎?

+0

'$(元素)=== $(element)'爲false,因爲它們是兩個不同的對象,即使它們包含相同的DOM元素。考慮將實際DOM元素存儲在'controls'而不是jQuery包裝器中。 – DCoder

+1

我不明白爲什麼'$ el'會多次包含相同的元素。 – JJJ

+0

@juhana - $ el不會多次包含相同的元素,但在這個示例中,它們都引用了同一個父對象,然後被複制。 – dotnetnoob

回答

3

隨着每次循環迭代創建一個新的jQuery對象:

$control = $(this).closest('.input-control'); 

而正是這些jQuery的對象,你.push()到您的controls陣列。即使這些jQuery對象中的某些可能包含對相同DOM元素的引用,但您與$.inArray()進行比較的是jQuery對象,它們都是不同的對象,因此不是重複的。

.closest()方法本身不會重複的,所以你可以這樣做:

controls = $el.closest('input-control'); 

然後你controls變量將是一個jQuery對象,只是有什麼在$el獨特最接近input-control元素。

如果你特別想有controls是jQuery的對象的數組,每個只包含一個input-control元素,但是,沒有重複,你可以這樣做:

controls = $.map($el.closest('input-control'), function(v,i) { return $(v); }); 
+0

很好的答案 - 我不會在一百萬年後意識到這一點 – dotnetnoob