获取触发事件的元素的ID


969

有什么方法可以获取触发事件的元素的ID?

我在想类似的东西:

$(document).ready(function() {
  $("a").click(function() {
    var test = caller.id;
    alert(test.val());
  });
});
<script type="text/javascript" src="starterkit/jquery.js"></script>

<form class="item" id="aaa">
  <input class="title"></input>
</form>
<form class="item" id="bbb">
  <input class="title"></input>
</form>

当然,如果从第一种形式触发事件,则var test应该包含id "aaa";如果"bbb"从第二种形式触发事件,则var 应该包含id 。


25
您的示例有点奇怪。您要将点击事件附加到“ a”,但没有任何锚点。将其更改为$('input.title')。click(...)对于将来阅读您的问题的人会更加清楚。
杰森·摩尔

3
您可以event.target.id在事件处理程序中使用来获取引发事件的元素的ID。
伊利亚斯·卡里姆

Answers:


1292

在jQuery中,event.target总是指触发事件的元素,其中event传递给函数的参数在哪里。http://api.jquery.com/category/events/event-object/

$(document).ready(function() {
    $("a").click(function(event) {
        alert(event.target.id);
    });
});

还请注意,这也this将起作用,但是它不是jQuery对象,因此,如果您希望在其上使用jQuery函数,则必须将其称为$(this),例如:

$(document).ready(function() {
    $("a").click(function(event) {
        // this.append wouldn't work
        $(this).append(" Clicked");
    });
});

12
哇!谢谢。没意识到jQuery这么好抽象。你摇滚!我认为(this)和(event.target)之间仍然会有区别-作为将事件绑定到的对象与接收事件的对象。
Hafthor

18
不幸的是,event.target不允许访问其自定义属性。为此,必须使用$(this).attr(“ organization:thingy”);。
Zian Choy

16
@ZianChoy-我不太确定“自定义属性”是什么意思,但是$(event.target)如果需要jQuery方法(例如),可以使用$(event.target).attr("organisation:thingy");
nnnnnn 2012年

3
我认为值得注意的是,如果您需要访问事件目标来操纵dom,则可以执行以下操作:$(event.target).eq(0)。然后,您可以使用通常与dom元素一起使用的任何方法,例如$(event.target).eq(0).find('li')。
公鸡

31
请注意,event.target是被单击的真实项目。例如,如果您将click事件绑定到div,并且在该div内包含P和H2元素-event.target如果单击其中的一个,则将返回H2元素或P。无论您单击了哪个子元素,“ this”都会真正返回挂起事件的div。
罗布

169

供参考,试试这个!有用!

jQuery("classNameofDiv").click(function() {
    var contentPanelId = jQuery(this).attr("id");
    alert(contentPanelId);
});

16
@gemma另一个解决方案对我不起作用,但是这个对我有用。感谢您迟到。
HPWD

3
@dlackey对我来说是相同的,其他解决方案在我的firefox 12上不起作用,但是这个解决方案可以。谢谢
linuxatico 2012年

4
对于获得嵌入式SVG中元素的ID来说,最佳答案似乎不起作用。$(this).attr("id");做。
Matt Fletcher 2014年

2
请记住,如果您的click事件在带有子元素的元素上,则即使您是孩子,e.target也将为您提供导致事件触发的确切元素,而this会为您提供该事件所附加的元素。
samrap '16

97

尽管在其他帖子中提到了它,但我还是想说明一下:

$(event.target).id 未定义

$(event.target)[0].id 给出id属性。

event.target.id 还提供了id属性。

this.id 给出id属性。

$(this).id 未定义。

当然,区别在于jQuery对象和DOM对象之间。“ id”是DOM属性,因此您必须位于DOM元素对象上才能使用它。

(它使我绊倒,所以它可能使其他人绊倒了)


1
对我来说,event.target.id什么也没有!
artaxerxe

3
@artaxerxe,这意味着您单击的元素没有id:P; 也不要将jquery用于此类事情。...使用事件javascript属性来代替它会更快。
HellBaby 2014年

$(event.target).attr('selector');对我来说效果很好。
Souleste

84

对于所有事件,不仅可以使用jQuery,还可以使用

var target = event.target || event.srcElement;
var id = target.id

event.target失败,倒在event.srcElement了IE浏览器。为了阐明以上代码,不需要jQuery,但也可以使用jQuery。


10
不使用jQuery意味着运行更少的代码行,同时获得完全相同的结果,如上所示。jQuery提取了js。这是直接的js答案,看一下大小!
xrDDDD

仅使用“ this”关键字是否更好,它始终可以使您访问调用事件的元素的属性?
Morfidon 2015年

6
只需深入研究所有jQuery废话即可获得此答案。谢谢。这比以往任何时候都更加重要:needsmorejquery.com
gromit190 '16

很棒,真的帮助了我
Barbz_YHOOL


28

我动态地从数据库中生成一个表,接收JSON中的数据并将其放入表中。每个表行都有一个唯一的ID,这是执行进一步操作所需的,因此,如果DOM更改,则需要使用不同的方法:

$("table").delegate("tr", "click", function() {
   var id=$(this).attr('id');
   alert("ID:"+id);  
});

2
哦,是的,这就是我想要的。由于现在不赞成使用“委托”,因此它对于较新的“ on”也相同。我有从数据库数据动态创建的复选框,当然它们都有不同的ID,单击这些ID时我需要使用它们来执行某些操作。我在这里使用此方法来获取实际单击的ID。在老派的JS中,我只是通过复选框HTML的每个复选框传递了ID,但使用jQuery事件处理程序模型无法做到这一点。
mikato

18

事件属性中触发事件的元素

event.currentTarget

我们得到在其上设置了事件处理程序的DOM节点对象。


大多数嵌套节点开始了我们的冒泡过程

event.target

事件对象始终是事件处理程序的第一个属性,例如:

document.querySelector("someSelector").addEventListener(function(event){

 console.log(event.target);
 console.log(event.currentTarget);

});

有关事件委托的更多信息,您可以在http://maciejsikora.com/standard-events-vs-event-delegation/中阅读


11

源元素作为jQuery对象应通过以下方式获取

var $el = $(event.target);

这将使您获得单击的来源,而不是单击功能也已分配的元素。当click事件在父对象EG上时很有用。表行上的click事件需要您单击的单元格

$("tr").click(function(event){
    var $td = $(event.target);
});

7

您可以尝试使用:

$('*').live('click', function() {
 console.log(this.id);
 return false;
});

7

这适用于大多数类型的元素:

$('selector').on('click',function(e){
    log(e.currentTarget.id);
    });

6

在委托事件处理程序的情况下,您可能会有类似以下内容:

<ul>
    <li data-id="1">
        <span>Item 1</span>
    </li>
    <li data-id="2">
        <span>Item 2</span>
    </li>
    <li data-id="3">
        <span>Item 3</span>
    </li>
    <li data-id="4">
        <span>Item 4</span>
    </li>
    <li data-id="5">
        <span>Item 5</span>
    </li>
</ul>

和你的JS代码是这样的:

$(document).ready(function() {
    $('ul').on('click li', function(event) {
        var $target = $(event.target),
            itemId = $target.data('id');

        //do something with itemId
    });
});

undefined由于LI的内容包装在中<span>,您很有可能会发现itemId为,这意味着<span>可能将成为事件目标。您可以通过一小笔支票来解决此问题,如下所示:

$(document).ready(function() {
    $('ul').on('click li', function(event) {
        var $target = $(event.target).is('li') ? $(event.target) : $(event.target).closest('li'),
            itemId = $target.data('id');

        //do something with itemId
    });
});

或者,如果您希望最大程度地提高可读性(并且还避免不必要的jQuery包装调用重复):

$(document).ready(function() {
    $('ul').on('click li', function(event) {
        var $target = $(event.target),
            itemId;

        $target = $target.is('li') ? $target : $target.closest('li');
        itemId = $target.data('id');

        //do something with itemId
    });
});

使用事件委托时,该.is()方法对于验证事件目标(除其他事项外)是否确实是您需要的值非常宝贵。使用.closest(selector)搜索了DOM树,并使用.find(selector)(一般加上.first(),如.find(selector).first())来搜索下吧。使用.first()时无需使用.closest(),因为它仅返回第一个匹配的祖先元素,而.find()返回所有匹配的后代。


1
有用!我进行了调整,因为我只有一个简单的<li id =“ numberID”>,所以我使用了itemId = $ target.attr('id')。
Zappescu

请注意使用简单的ID属性,因为每个ID在该页面上都必须是唯一的。因此,如果您出于某种原因需要在该页面上拥有两个这样的列表,则可能会出现重复的ID,这是一件坏事。这就是为什么我倾向于总是仅将data-id用于将来的目的。
同步

6

使用可以使用.on事件

  $("table").on("tr", "click", function() {
                    var id=$(this).attr('id');
                    alert("ID:"+id);  
                });

5

这对高于z-index以上答案中提到的event参数的工作:

$("#mydiv li").click(function(){

    ClickedElement = this.id;
    alert(ClickedElement);
});

这样,您将始终获得id(在此示例中li)元素的。同样,当单击父级的子级元素时。


4
var buttons = document.getElementsByTagName('button');
var buttonsLength = buttons.length;
for (var i = 0; i < buttonsLength; i++){
    buttons[i].addEventListener('click', clickResponse, false);
};
function clickResponse(){
    // do something based on button selection here...
    alert(this.id);
}

在这里工作的JSFiddle 。


我认为这有点像过时的选择才能使它起作用
ArnasPečelis2015年

2
@ArnasPečelis过时了吗?不,只是没有jQuery。
凯文B

4

只需使用this参考

$(this).attr("id")

要么

$(this).prop("id")

id将从click()分配了元素的元素中获取属性。如果需要将更多数据传输到该方法,则需要data-some-id="<?php $someId; ?>"$$(this).data(“ some-id”)进行检索。
罗兰

3

this.element.attr("id") 在IE8中工作正常。


2

这两项工作,

jQuery(this).attr("id");

alert(this.id);

2
$(".classobj").click(function(e){
    console.log(e.currentTarget.id);
})

@ManuelMannhardt此答案中没有链接,它是仅代码的答案,而不是仅链接的答案
barbsan

1

您可以使用该函数获取更改项的ID和值(在我的示例中,我使用了Select标签。

              $('select').change(
                   function() {
                        var val = this.value;
                        var id = jQuery(this).attr("id");
                        console.log("value changed" + String(val)+String(id));
                   }
               );

0

我正在与

jQuery自动完成

我尝试event如上所述查找,但是当请求函数触发时,它似乎不可用。我过去this.element.attr("id")是获取元素的ID的,它似乎工作正常。


0

如果是Angular 7.x,则可以获取本机元素及其ID或属性。

myClickHandler($event) {
    this.selectedElement = <Element>$event.target;
    console.log(this.selectedElement.id)
    this.selectedElement.classList.remove('some-class');
}

的HTML:

<div class="list-item" (click)="myClickHandler($event)">...</div>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.