2015-10-20 111 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();