Obtention de l'ID de l'élément qui a déclenché un événement


969

Existe-t-il un moyen d'obtenir l'ID de l'élément qui déclenche un événement?

Je pense à quelque chose comme:

$(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>

Sauf bien sûr que la var testdoit contenir l'identifiant "aaa", si l'événement est déclenché à partir du premier formulaire, et "bbb", si l'événement est déclenché à partir du second formulaire.


25
Votre exemple est un peu étrange. Vous attachez un événement de clic à «a», mais ne disposez d'aucune ancre. Le changer en $ ('input.title'). Cliquer (...) serait un peu plus clair pour les futurs lecteurs de votre question.
Jason Moore

3
Vous pouvez utiliser event.target.iddans le gestionnaire d'événements pour obtenir l'id de l'élément qui a déclenché un événement.
Ilyas karim

Réponses:


1293

Dans jQuery, se event.targetréfère toujours à l'élément qui a déclenché l'événement, où eventest le paramètre passé à la fonction. http://api.jquery.com/category/events/event-object/

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

Notez également que thiscela fonctionnera également, mais que ce n'est pas un objet jQuery, donc si vous souhaitez utiliser une fonction jQuery dessus, vous devez vous y référer comme $(this), par exemple:

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

12
Hou la la! Merci. Je ne savais pas que jQuery résumait si bien cela. Tu gères! Je pense qu'il y aurait toujours la différence entre (this) et (event.target) - étant l'objet auquel vous avez lié l'événement par rapport à l'objet qui a reçu l'événement.
Hafthor, le

18
Malheureusement, event.target ne permet pas d'accéder à ses attributs personnalisés. Pour ce faire, il faut utiliser $ (this) .attr ("organization: thingy") ;.
Zian Choy, le

16
@ZianChoy - Je ne sais pas trop ce que vous entendez par "attributs personnalisés", mais vous pouvez utiliser $(event.target)si vous avez besoin d'une méthode jQuery, par exemple $(event.target).attr("organisation:thingy");.
nnnnnn

3
Je pense qu'il est à noter que si vous avez besoin d'accéder à la cible d'événement pour manipuler le dom, vous pouvez faire quelque chose comme ceci: $ (event.target) .eq (0). Vous pouvez ensuite utiliser n'importe quelle méthode que vous utiliseriez normalement avec un élément dom comme $ (event.target) .eq (0) .find ('li') par exemple.
Coq

31
Veuillez noter que: event.target est le véritable élément sur lequel vous cliquez. Si vous, par exemple, vous liez un événement click à un div, et, à l'intérieur de ce div, se trouve un élément P et un élément H2 - event.target renverra l'élément H2 ou le P, si vous cliquez sur l'un d'entre eux. "this" retournera vraiment le div sur lequel vous avez suspendu l'événement, quel que soit l'élément enfant sur lequel vous avez cliqué.
Rob

169

Pour référence, essayez ceci! Ça marche!

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

16
@gemma L'autre solution n'a pas fonctionné pour moi mais celle-ci l'a fait. Merci d'être en retard.
HPWD

3
@dlackey c'est la même chose pour moi, l'autre solution n'a pas fonctionné sur mon firefox 12, mais celle-ci l'a fait. Merci
linuxatico

4
La meilleure réponse ne semble pas fonctionner pour obtenir l'ID d'un élément dans un SVG intégré. $(this).attr("id");Est-ce que.
Matt Fletcher

2
Gardez à l'esprit que si votre événement click est sur un élément avec des enfants, e.targetvous donnera l'élément exact qui a déclenché l'événement même s'il s'agissait d'un enfant, tandis que thisvous donnera l'élément auquel l'événement est attaché.
samrap

97

Bien que cela soit mentionné dans d'autres articles, je voulais le préciser:

$(event.target).id n'est pas défini

$(event.target)[0].id donne l'attribut id.

event.target.id donne également l'attribut id.

this.id donne l'attribut id.

et

$(this).id n'est pas défini.

Les différences, bien sûr, sont entre les objets jQuery et les objets DOM. "id" est une propriété DOM, vous devez donc être sur l'objet élément DOM pour l'utiliser.

(Ça m'a fait trébucher, donc ça a probablement déclenché quelqu'un d'autre)


1
pour moi, event.target.idne donne rien!
artaxerxe

3
@artaxerxe cela signifie que votre élément cliqué n'a pas d'identifiant: P; n'utilisez pas jquery pour ce genre de choses .... utilisez plutôt des attributs javascript pour les événements car c'est plus rapide.
HellBaby

$(event.target).attr('selector');a parfaitement fonctionné pour moi.
Souleste

85

Pour tous les événements, pas seulement jQuery, vous pouvez utiliser

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

En cas d' event.targetéchec, il retombe sur event.srcElementIE. Pour clarifier le code ci-dessus ne nécessite pas jQuery mais fonctionne également avec jQuery.


10
Ne pas utiliser jQuery signifie que moins de lignes de code sont exécutées tout en obtenant le même résultat exact, comme indiqué ci-dessus. jQuery résume js. Ceci est la réponse directe de js, et regardez la taille!
xrDDDD

N'est-il pas préférable d'utiliser simplement le mot-clé «this» qui vous donnera toujours accès aux propriétés de l'élément qui a invoqué l'événement?
Morfidon

7
Juste eu à fouiller dans toutes les conneries jQuery pour arriver à cette réponse. Merci. C'est plus pertinent que jamais: needsmorejquery.com
gromit190

génial, m'a vraiment aidé
Barbz_YHOOL

59

Vous pouvez utiliser (this)pour référencer l'objet qui a déclenché la fonction.

'this'est un élément DOM lorsque vous êtes à l'intérieur d'une fonction de rappel (dans le contexte de jQuery), par exemple, être appelé par les méthodes click, each, bind, etc.

Voici où vous pouvez en savoir plus: http://remysharp.com/2007/04/12/jquerys-this-demystified/


3
si vous avez une fonction comme $(html).click()(this) retournera l'objet html et non l'élément cliqué
TCHdvlp

28

Je génère une table dynamiquement sur une base de données, reçois les données en JSON et les mets dans une table. Chaque ligne de table a un unique ID, qui est nécessaire pour d'autres actions, donc, si le DOM est modifié, vous avez besoin d'une approche différente:

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

2
Oh ouais, c'est ce que je cherchais. Il fonctionne également de la même façon pour le plus récent "on" puisque "délégué" est désormais obsolète. J'avais des cases à cocher créées dynamiquement à partir des données de la base de données, et bien sûr, elles avaient toutes des ID différents que je devais utiliser pour faire quelque chose lorsque je cliquais. J'ai utilisé cette méthode ici pour obtenir l'ID sur lequel vous avez réellement cliqué. Dans JS old school, je viens de passer l'id de chaque case à cocher dans le HTML de la case à cocher, mais je ne peux pas le faire de cette façon avec le modèle de gestionnaire d'événements jQuery.
mikato

18

Élément qui a déclenché l'événement que nous avons dans la propriété de l' événement

event.currentTarget

Nous obtenons l' objet nœud DOM sur lequel était défini le gestionnaire d'événements.


Le nœud le plus imbriqué qui a commencé le processus de création de bulles que nous avons dans

event.target

L'objet événement est toujours le premier attribut du gestionnaire d'événements, par exemple:

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

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

});

En savoir plus sur la délégation d'événements Vous pouvez lire sur http://maciejsikora.com/standard-events-vs-event-delegation/


11

L'élément source en tant qu'objet jQuery doit être obtenu via

var $el = $(event.target);

Cela vous donne la source du clic, plutôt que l'élément auquel la fonction de clic a également été affectée. Peut être utile lorsque l'événement de clic se trouve sur un objet parent EG.un événement de clic sur une ligne du tableau et que vous avez besoin de la cellule sur laquelle vous avez cliqué

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

7

Vous pouvez essayer d'utiliser:

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

7

cela fonctionne avec la plupart des types d'éléments:

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

6

Dans le cas des gestionnaires d'événements délégués, où vous pourriez avoir quelque chose comme ceci:

<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>

et votre code JS comme ceci:

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

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

Vous constaterez très probablement que itemId l'est undefined, car le contenu du LI est enveloppé dans un <span>, ce qui signifie que ce <span>sera probablement la cible de l'événement. Vous pouvez contourner cela avec un petit chèque, comme ceci:

$(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
    });
});

Ou, si vous préférez maximiser la lisibilité (et éviter également la répétition inutile d'appels de jQuery wrapping):

$(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
    });
});

Lorsque vous utilisez la délégation d'événements, la .is()méthode est inestimable pour vérifier que votre cible d'événement (entre autres) est réellement ce dont vous avez besoin. Utilisez .closest(selector)pour rechercher dans l'arborescence DOM et utilisez .find(selector)(généralement couplé avec .first(), comme dans .find(selector).first()) pour le rechercher. Vous n'avez pas besoin de l'utiliser .first()lors de l'utilisation .closest(), car il ne renvoie que le premier élément ancêtre correspondant, tandis que .find()renvoie tous les descendants correspondants.


1
Utile! J'ai ajusté mon cas car je viens de recevoir un simple <li id ​​= "numberID"> et j'ai donc utilisé itemId = $ target.attr ('id').
Zappescu du

Faites juste attention à utiliser un attribut ID simple, car chaque ID doit être unique sur cette page. Donc, si pour une raison quelconque vous avez besoin d'avoir deux listes comme celle-ci sur cette page, vous vous retrouverez probablement avec des ID en double, ce qui est une mauvaise chose. C'est pourquoi j'ai tendance à toujours utiliser data-id uniquement pour la pérennité.
Isochronous

6

Utiliser peut utiliser l'événement .on

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

5

Cela fonctionne sur un z-indexparamètre supérieur au paramètre d'événement mentionné dans les réponses ci-dessus:

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

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

De cette façon, vous obtiendrez toujours l' élément de id(dans cet exemple li). Aussi, lorsque vous cliquez sur un élément enfant du parent ..


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);
}

Travailler JSFiddle ici .


Je pense que c'est un peu comme une option obsolète pour le faire fonctionner
Arnas Pečelis

2
@ ArnasPečelis obsolète? non, juste pas jQuery.
Kevin B

4

Utilisez simplement la thisréférence

$(this).attr("id")

ou

$(this).prop("id")

Cela récupère l'attribut idde l'élément sur lequel click()a été attribué. Si vous devez transférer plus de données vers cette méthode, vous en avez besoin data-some-id="<?php $someId; ?>"et vous pouvez alors $ (this) .data ("some-id") pour les récupérer.
Roland

3

this.element.attr("id") fonctionne bien dans IE8.


2

Ces deux travaux,

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

et

alert(this.id);

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

@ManuelMannhardt il n'y a pas de lien dans cette réponse, c'est une réponse uniquement en code, pas une réponse uniquement en lien
barbsan

1

Vous pouvez utiliser la fonction pour obtenir l'id et la valeur de l'élément modifié (dans mon exemple, j'ai utilisé une balise Select.

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

0

Je travaille avec

jQuery Autocomplete

J'ai essayé de chercher un eventcomme décrit ci-dessus, mais lorsque la fonction de demande se déclenche, elle ne semble pas être disponible. J'avais l'habitude this.element.attr("id")d'obtenir l'ID de l'élément à la place, et cela semble bien fonctionner.


0

Dans le cas d'Angular 7.x, vous pouvez obtenir l'élément natif et son ID ou ses propriétés.

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>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.