2015-10-20 38 views
0

我有以下情況,我不明白爲什麼它不起作用。我在表中有幾個<input>字段,每當用戶點擊其中一個輸入時,我檢查這個元素是否已經在這個表的輸入列表中,如果沒有,我只是添加它。官方添加輸入列表是當用戶至少單擊<input>元素中的一次時。我這樣做是這樣的:如何在jQuery中的onclick事件中使用.each()

var element_input = {"Element": ""}; 
var input_element = []; 


$("#input"+i).click(function(){ 
     element_input.Element = $(this); 
     var found = false;    
     $.each(input_element,function(i){ 
      if(input_element[i].Element === $(this)) 
       input_element.splice(i,1,element_input); 
       found = true; 
     }); 
     if(!found){ 
     input_element.push(element_input); 
     } 
    }); 

但是,這絕對不行!我不知道那裏有什麼問題。他在列表中插入第一個元素是因爲它是空的,這意味着直到代碼結束並且在同一個迭代中再次返回到.each循環,就像再次單擊元素並且他應該開始再次閱讀代碼,當然他添加了這個元素,因爲條件是真的。最後,我有幾次使用相同元素的無限列表。有人能幫助我嗎? THX !!

+0

我在這裏是什麼? –

+1

這真是令人費解的混亂?爲什麼不只是'input_element.indexOf(this)',爲什麼只有一個屬性的對象沒有意義? – adeneo

+0

調用.click函數時使用class而不是id – wayzz

回答

1

對我來說,你的代碼中有太多問題,有些部分對我來說並不清楚。這個代碼和平:

$.each(input_element,function(i){ 
     if(input_element[i].Element === $(this)) 
      input_element.splice(i,1,element_input); 
      found = true; 
    }); 

總是發現將是真實的,檢查支架,也input_element[i].Element === $(this)永遠是假的,因爲你在比較兩個對象。

這裏是你的例子寫在更好的方式。 http://jsfiddle.net/ux6hhefe/2/

+0

THX Grissom!正是我想要的!精彩! –

+0

我用他的自我完成了同一個對象!這當然是錯誤的,我在瘋狂的循環中游泳! –

0

您的代碼不起作用,因爲默認情況下,相等運算符通過引用檢查對象是否相等。在你的情況下,它們總是不同的,因爲每個$()調用返回新對象。

可以通過一行代碼檢查:

$(this)==$(this) 

嘗試使用this代替$(this)

1

一個更準確的解決方案可以是被使用一個類來表示所選擇的元件則當你需要你可以只過濾那些元素。

此外,您可以添加一個公共類到所有的輸入元素,並使用它來添加點擊處理程序。

$(".input").click(function() { 
    $(this).toggleClass('selected'); 
}); 

//then when you need to get all the selected elements 
var input_element = $('.input.selected'); 
//if you want input_element to be an array then use 
var input_element = $('.input.selected').get(); 
相關問題