2014-09-26 133 views
2

假设你有下面的代码更新许多元素:如何在多个元素上处理相同的jQuery事件处理程序?

<div class='item'> 
    Name:<input type='text' name='name' data-id='123' value='Name 1'> 
    <button class='update'>update</button> 
</div> 

<div class='item'> 
    Name:<input type='text' name='name' data-id='456' value='Name 2'> 
    <button class='update'>update</button> 
</div> 

和JavaScript来处理更新:

function updateName(name, id){ 
    ... 
} 

什么是jQuery的处理程序,可以找到价值和ID和呼叫updateName?

$('button.update').click(function() { 
    name = ? 
    id = ? 
    updateName(name, id) 
} 

编辑:

预期的行为是,当用户更新输入字段,更新后的值发送到updateName(),而不是原始值。

此外,请注意data-id和value是在输入上,而不是在按钮上。

http://jsfiddle.net/e3g6nfc1/8/

回答

2

像这样:

$('button.update').click(function() { 
    name = $(this).attr('name');//to get value of name attribute 
    id = $(this).data('id'); // to get value of attribute data-id 
    updateName(name, id) 
} 

您也可以使用道具()方法得到name or data-id

name = $(this).prop('name'); 
id = $(this).prop('data-id'); 

但最好是使用数据()方法data-*属性。

+0

我相信'prop'是name属性 – 2014-09-26 21:46:00

+0

是的,你说得对... – 2014-09-26 21:46:51

+0

它是如何从输入获取名称和ID时,处理程序是首选API附在按钮上? – 2014-09-26 23:28:37

4

内部事件处理this是要在这种情况下var否则nameid跳出该函数的范围,并可能成为全局变量展开的DOM元素

$('button.update').click(function() { 
    var name = this.name 
    var id = $(this).data('id'); 
    updateName(name, id) 
} 

音符。

I've argued before that this is awkward and bad to use。你可以达到相同的效果,而不需要像这样使用它:

$('button.update').click(function(e) { 
    var name = e.currentTarget.name 
    var id = $(e.currentTarget).data('id'); 
    updateName(name, id) 
} 

你也不必使用jquery的数据。在reasonably modern browsers$(domElement).data('foo')相当于domElement.dataset['foo']


编辑:不知道如果我错过了这问题,或者如果它得到了编辑,但好像你问不为元素上的按钮属性,但在它之前。在这种情况下,你想$.fn.prev这将是这个样子

$('button.update').click(function(e) { 
    var $prev = $(e.currentTarget).prev(); 
    updateName($prev.name, $prev.data('id')) 
} 

注意,这个假设输入元件直接按钮之前。如果你想找到最接近的前输入元素你会使用$.fn.prevAll

var $prev = $(e.currentTarget).prevAll('input').last(); 
+0

我没有得到你的链接'这是尴尬和坏'使用'在这里在你的答案... – 2014-09-26 21:49:35

+0

@ C-linkNepal Huh?基本上我的观点是'this'是javascript的一个不好的部分。它和其他参数一样(如果你只使用'.call()'来调用函数,它就变得非常明显)。唯一的区别是1)你没有得到它的名字,2)如果你使用简写的'fn()'调用语法,javascript只是猜测它应该是什么。它几乎总是更好地使用常规参数。 – 2014-09-26 21:54:46

+0

在这个答案中,我还没有成为这个。 (我不认为它会出现在你的回答中,它不是关于'this') – 2014-09-26 21:57:02

1

不知道为什么这里的答案是试图找到button元素的input属性...

<div id="container"> 
    <div class='item'> 
     Name:<input type='text' name='name' data-id='123' value='Name 1'> 
     <button class='update'>update</button> 
    </div> 

    <div class='item'> 
     Name:<input type='text' name='name' data-id='456' value='Name 2'> 
     <button class='update'>update</button> 
    </div> 
</div> 

下放事件仅附加到容器(仅选择与.update类是儿童),抓住他们,因为他们“冒泡”。 previousElementSibling用于定位input,但如果布局更复杂,也可以使用jQuery选择器来查找它。

$('#container').on('click','.update',function(e) { 
    updateName(
     e.currentTarget.previousElementSibling.name, 
     $(e.currentTarget.previousElementSibling).data('id') 
    ); 
}); 

JSFiddle

+0

在JS小提琴中,输入一个新名字后,我仍然得到HTML中设置的值。我期待得到更新的价值。 – 2014-09-26 23:34:04

+0

@BSeven'updateName(name,id)'“name”实际上是“value”?或ID? [JSFiddle更新](http://jsfiddle.net/MrYellow/e3g6nfc1/33/) – MrYellow 2014-09-27 02:21:36

+0

你是否在使用HTML属性'name ='name''做任何事情?如果不是,通常的设置是从'name'属性中的'data-id'获得东西。名称=值。 – MrYellow 2014-09-27 02:25:22

相关问题