Ottenere l'ID dell'elemento che ha generato un evento


969

Esiste un modo per ottenere l'ID dell'elemento che genera un evento?

Sto pensando a qualcosa del tipo:

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

Tranne ovviamente che var testdovrebbe contenere l'id "aaa", se l'evento viene generato dal primo modulo e "bbb", se l'evento viene generato dal secondo modulo.


25
Il tuo esempio è un po 'strano. Stai collegando un evento clic a "a", ma non hai ancore. Cambiarlo in $ ('input.title'). Fare clic su (...) sarebbe un po 'più chiaro per i futuri lettori della tua domanda.
Jason Moore,

3
È possibile utilizzare event.target.idnel gestore eventi per ottenere l'id dell'elemento che ha generato un evento.
Ilyas karim,

Risposte:


1293

In jQuery event.targetsi riferisce sempre all'elemento che ha attivato l'evento, dove si eventtrova il parametro passato alla funzione. http://api.jquery.com/category/events/event-object/

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

Si noti inoltre che thisfunzionerà anche, ma che non è un oggetto jQuery, quindi se si desidera utilizzare una funzione jQuery su di esso, è necessario fare riferimento ad esso come $(this), ad esempio:

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

12
Wow! Grazie. Non avevo capito che jQuery lo ha estratto così bene. Sei forte! Penserei che avrebbe comunque la differenza tra (this) e (event.target) - essendo l'oggetto a cui hai associato l'evento rispetto all'oggetto che ha ricevuto l'evento.
Hafthor,

18
Sfortunatamente, event.target non consente l'accesso ai suoi attributi personalizzati. Per fare ciò, si deve usare $ (this) .attr ("organisation: thingy") ;.
Zian Choy,

16
@ZianChoy - Non sono sicuro di cosa intendi per "attributi personalizzati", ma puoi usarlo $(event.target)se hai bisogno di un metodo jQuery, ad es $(event.target).attr("organisation:thingy");.
nnnnnn,

3
Penso che sia da notare che se hai bisogno di accedere al target dell'evento per manipolare il dom puoi fare qualcosa del genere: $ (event.target) .eq (0). È quindi possibile utilizzare qualsiasi metodo normalmente utilizzato con un elemento dom come $ (event.target) .eq (0) .find ('li'), ad esempio.
Gallo,

31
Si noti che: event.target è l' elemento reale su cui si fa clic. Se, ad esempio, associ un evento click a un div, e all'interno di quel div vi sono un elemento P e un elemento H2 - event.target restituirà l'elemento H2 o P, se si fa clic su uno di questi. "this" restituirà davvero il div su cui hai appeso l'evento, indipendentemente dall'elemento figlio su cui hai fatto clic.
Rob,

169

Per riferimento, prova questo! Funziona!

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

16
@gemma L'altra soluzione non ha funzionato per me, ma questa ha funzionato. Grazie per il ritardo.
HPWD,

3
@dlackey è lo stesso per me, l'altra soluzione non ha funzionato sul mio firefox 12, ma questo ha funzionato. Grazie
linuxatico

4
La risposta principale non sembra funzionare per ottenere l'ID di un elemento in un SVG incorporato. $(this).attr("id");lo fa.
Matt Fletcher,

2
Tieni presente che se l'evento click si trova su un elemento con elementi secondari, e.targetti fornirà l'elemento esatto che ha generato l'evento anche se si trattava di un figlio, mentre thisti darà l'elemento a cui è associato l'evento.
Samrap,

97

Sebbene sia menzionato in altri post, volevo precisarlo:

$(event.target).id non è definito

$(event.target)[0].id dà l'attributo id.

event.target.id fornisce anche l'attributo id.

this.id dà l'attributo id.

e

$(this).id non è definito.

Le differenze, ovviamente, sono tra oggetti jQuery e oggetti DOM. "id" è una proprietà DOM, quindi devi essere sull'oggetto elemento DOM per usarlo.

(Mi ha fatto inciampare, quindi probabilmente è inciampato in qualcun altro)


1
a me event.target.idnon dà niente!
Artaserse

3
@artaxerxe significa che l'elemento cliccato non ha un id: P; inoltre non usare jquery per questo tipo di cose .... usa gli attributi event javascript invece perché è più veloce.
HellBaby,

$(event.target).attr('selector');ha funzionato perfettamente per me.
Souleste,

85

Per tutti gli eventi, non limitato a solo jQuery che puoi usare

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

Dove event.targetfallisce ricade su event.srcElementIE. Per chiarire il codice sopra riportato non è necessario jQuery ma funziona anche con jQuery.


10
Non usare jQuery significa che vengono eseguite meno righe di codice mentre si ottiene lo stesso risultato esatto, come mostrato sopra. jQuery estrae js. Questa è la risposta diretta js, e guarda le dimensioni!
xrDDDD

non è meglio usare semplicemente questa "parola chiave" che ti darà sempre accesso alle proprietà dell'elemento che ha invocato l'evento?
Morfidon,

7
Ho dovuto scavare tra tutte le stronzate di jQuery per arrivare a questa risposta. Grazie. Questo è più rilevante che mai: needsmorejquery.com
gromit190,

fantastico, mi ha davvero aiutato
Barbz_YHOOL il

59

È possibile utilizzare (this)per fare riferimento all'oggetto che ha attivato la funzione.

'this'è un DOM elemento quando ci si trova all'interno di una funzione di callback (nel contesto di jQuery), ad esempio, essendo chiamato dai metodi click, each, bind, etc.

Qui puoi saperne di più: http://remysharp.com/2007/04/12/jquerys-this-demystified/


3
se hai una funzione come $(html).click()(this) restituirà l'oggetto html e non l'elemento cliccato
TCHdvlp

28

Genero una tabella in modo dinamico da un database, ricevo i dati in JSON e li inserisco in una tabella. Ogni riga della tabella ha un unico ID, necessario per ulteriori azioni, quindi se il DOM viene modificato è necessario un approccio diverso:

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

2
Oh sì, questo è quello che stavo cercando. Funziona allo stesso modo anche per il più recente "on" poiché "delegate" è ora obsoleto. Avevo le caselle di controllo create dinamicamente dai dati DB e ovviamente avevano tutti ID diversi che dovevo usare per fare qualcosa quando facevo clic. Ho usato questo metodo qui per ottenere quale ID è stato effettivamente cliccato. Nella vecchia scuola JS ho appena passato l'ID da ciascuna casella di controllo nel codice HTML della casella di controllo, ma non posso farlo in questo modo con il modello di gestore eventi jQuery.
Mikato,

18

Elemento che ha generato l'evento che abbiamo nella proprietà dell'evento

event.currentTarget

Otteniamo l' oggetto nodo DOM su cui è stato impostato il gestore eventi.


Nodo più nidificato che ha avviato il processo di gorgogliamento in cui ci troviamo

event.target

L'oggetto evento è sempre il primo attributo del gestore eventi, ad esempio:

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

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

});

Ulteriori informazioni sulla delega di eventi È possibile leggere in http://maciejsikora.com/standard-events-vs-event-delegation/


11

L'elemento sorgente come oggetto jQuery dovrebbe essere ottenuto tramite

var $el = $(event.target);

Questo ti dà la fonte del clic, piuttosto che l'elemento a cui è stata assegnata anche la funzione clic. Può essere utile quando l'evento click è su un oggetto genitore EG.un evento click su una riga della tabella e hai bisogno della cella su cui è stato fatto clic

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

7

Puoi provare a usare:

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

7

funziona con la maggior parte dei tipi di elementi:

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

6

Nel caso dei gestori di eventi delegati, dove potresti avere qualcosa del genere:

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

e il tuo codice JS in questo modo:

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

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

Molto probabilmente scoprirai che itemId è undefined, poiché il contenuto di LI è racchiuso in a <span>, il che significa <span>che probabilmente sarà il target dell'evento. Puoi aggirare questo problema con un piccolo segno di spunta, in questo modo:

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

Oppure, se si preferisce massimizzare la leggibilità (ed anche evitare inutili ripetizioni delle chiamate di wrapping 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
    });
});

Quando si utilizza la delega di eventi, il .is()metodo è prezioso per verificare che il target dell'evento (tra le altre cose) sia effettivamente ciò che è necessario. Usare .closest(selector)per cercare l'albero del DOM e usare .find(selector)(generalmente accoppiato con .first(), come in .find(selector).first()) per cercarlo. Non è necessario utilizzarlo .first()durante l'utilizzo .closest(), poiché restituisce solo il primo elemento antenato corrispondente, mentre .find()restituisce tutti i discendenti corrispondenti.


1
Utile! Ho modificato il mio caso perché ho appena ricevuto un semplice <li id ​​= "numberID"> e quindi avevo usato itemId = $ target.attr ('id').
Zappescu,

Fai solo attenzione a utilizzare un attributo ID semplice, poiché ogni ID deve essere univoco in quella pagina. Quindi, se per qualche motivo hai bisogno di avere due elenchi come quello su quella pagina, probabilmente finirai con ID duplicati, il che è una cosa negativa. Questo è il motivo per cui tendo sempre a utilizzare id-dati solo per il futuro.
Isochronous,

6

Use can Use .on event

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

5

Funziona con un z-indexparametro di evento superiore a quello indicato nelle risposte sopra:

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

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

In questo modo otterrai sempre l' elemento id(in questo esempio li). Anche quando si fa clic su un elemento figlio del genitore ..


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

Lavora JSFiddle qui .


Penso che sia un po 'come un'opzione obsoleta per farlo funzionare
Arnas Pečelis,

2
@ ArnasPečelis non è aggiornato? no, non solo jQuery.
Kevin B,

4

Usa solo il thisriferimento

$(this).attr("id")

o

$(this).prop("id")

Ciò recupera l'attributo iddall'elemento a cui click()è stato assegnato. Se hai bisogno di trasferire più dati a quel metodo, hai bisogno data-some-id="<?php $someId; ?>"e quindi puoi `$ (this) .data (" some-id ") per recuperarli.
Roland,

3

this.element.attr("id") funziona bene in IE8.


2

Entrambi questi lavori,

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

e

alert(this.id);

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

@ManuelMannhardt non c'è nessun link in questa risposta, è solo una risposta in codice, non solo una risposta
barbsan

1

È possibile utilizzare la funzione per ottenere l'id e il valore per l'elemento modificato (nel mio esempio, ho usato un tag Select.

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

0

Sto lavorando con

Completamento automatico jQuery

Ho provato a cercarne uno eventcome descritto sopra, ma quando viene attivata la funzione di richiesta non sembra essere disponibile. this.element.attr("id")Invece, ho usato per ottenere l'ID dell'elemento e sembra funzionare bene.


0

Nel caso di Angular 7.x è possibile ottenere l'elemento nativo e il suo id o proprietà.

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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.