Abrufen der ID des Elements, das ein Ereignis ausgelöst hat

969

Gibt es eine Möglichkeit, die ID des Elements abzurufen, das ein Ereignis auslöst?

Ich denke so etwas wie:

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

Außer natürlich, dass die Variable testdie ID enthalten sollte "aaa", wenn das Ereignis aus dem ersten Formular ausgelöst wird und "bbb"wenn das Ereignis aus dem zweiten Formular ausgelöst wird.

Joda
quelle
25
Ihr Beispiel ist etwas seltsam. Sie hängen ein Klickereignis an 'a' an, haben aber keine Anker. Das Ändern in $ ('input.title'). Click (...) wäre für zukünftige Leser Ihrer Frage etwas klarer.
Jason Moore
3
Sie können event.target.idim Ereignishandler die ID des Elements abrufen, das ein Ereignis ausgelöst hat.
Ilyas Karim

Antworten:

1293

In jQuery event.target bezieht sich immer auf das Element, das das Ereignis ausgelöst hat, wobei eventder Parameter an die Funktion übergeben wird. http://api.jquery.com/category/events/event-object/

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

Beachten Sie auch, dass dies thisebenfalls funktioniert, es sich jedoch nicht um ein jQuery-Objekt handelt. Wenn Sie also eine jQuery-Funktion verwenden möchten, müssen Sie darauf verweisen $(this), z.

$(document).ready(function() {
    $("a").click(function(event) {
        // this.append wouldn't work
        $(this).append(" Clicked");
    });
});
Samjudson
quelle
12
Beeindruckend! Vielen Dank. Ich wusste nicht, dass jQuery das so gut abstrahiert hat. Du rockst! Ich würde denken, dass es immer noch den Unterschied zwischen (this) und (event.target) gibt - ein Objekt, an das Sie das Ereignis gebunden haben, und dem Objekt, das das Ereignis erhalten hat.
Hafthor
18
Leider erlaubt event.target keinen Zugriff auf seine benutzerdefinierten Attribute. Dazu muss man $ (this) .attr ("organisation: thingy"); verwenden.
Zian Choy
16
@ZianChoy - Ich bin nicht ganz sicher, was Sie unter "benutzerdefinierten Attributen" verstehen, aber Sie können diese verwenden, $(event.target)wenn Sie eine jQuery-Methode benötigen, z $(event.target).attr("organisation:thingy");.
nnnnnn
3
Ich denke, es ist zu beachten, dass Sie, wenn Sie Zugriff auf das Ereignisziel benötigen, um den Dom zu manipulieren, Folgendes tun können: $ (event.target) .eq (0). Sie können dann jede Methode verwenden, die Sie normalerweise mit einem dom-Element wie $ (event.target) .eq (0) .find ('li') verwenden würden.
Hahn
31
Bitte beachten Sie, dass: event.target das eigentliche Element ist, auf das geklickt wird. Wenn Sie beispielsweise ein Klickereignis an ein Div binden und sich in diesem Div ein P- und ein H2-Element befindet, gibt event.target das H2-Element oder das P zurück, wenn Sie auf eines dieser Elemente klicken. "this" gibt wirklich den Div zurück, an den Sie das Ereignis gehängt haben, unabhängig davon, auf welches untergeordnete Element Sie geklickt haben.
Rob
169

Versuchen Sie dies als Referenz! Es klappt!

jQuery("classNameofDiv").click(function() {
    var contentPanelId = jQuery(this).attr("id");
    alert(contentPanelId);
});
Gemma
quelle
16
@gemma Die andere Lösung hat bei mir nicht funktioniert, aber diese hat funktioniert. Danke, dass du zu spät kommst.
HPWD
3
@dlackey es ist das gleiche für mich, die andere Lösung funktionierte nicht auf meinem Firefox 12, aber diese tat es. Danke
linuxatico
4
Die beste Antwort scheint nicht zu funktionieren, um die ID eines Elements in einer eingebetteten SVG zu erhalten. $(this).attr("id");tut.
Matt Fletcher
2
Beachten Sie, dass Sie, wenn sich Ihr Klickereignis auf einem Element mit e.targetuntergeordneten Elementen befindet, genau das Element angeben, durch das das Ereignis ausgelöst wurde, auch wenn es ein untergeordnetes thisElement war, während Sie das Element erhalten, an das das Ereignis angehängt ist.
Samrap
97

Obwohl es in anderen Beiträgen erwähnt wird, wollte ich dies formulieren:

$(event.target).id ist nicht definiert

$(event.target)[0].id gibt das id-Attribut an.

event.target.id gibt auch das id-Attribut an.

this.id gibt das id-Attribut an.

und

$(this).id ist nicht definiert.

Die Unterschiede bestehen natürlich zwischen jQuery-Objekten und DOM-Objekten. "id" ist eine DOM-Eigenschaft, daher müssen Sie sich im DOM-Elementobjekt befinden, um sie verwenden zu können.

(Es hat mich gestolpert, also hat es wahrscheinlich jemand anderen gestolpert)

dsch
quelle
1
mir event.target.idgibt nichts!
Artaxerxe
3
@artaxerxe Dies bedeutet, dass Ihr angeklicktes Element keine ID hat: P; Verwenden Sie jquery auch nicht für diese Art von Dingen. Verwenden Sie stattdessen Ereignis-Javascript-Attribute, da es schneller ist.
HellBaby
$(event.target).attr('selector');hat perfekt für mich funktioniert.
Souleste
85

Für alle Ereignisse, nicht nur für jQuery, die Sie verwenden können

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

Wo dies event.targetfehlschlägt, wird auf event.srcElementIE zurückgegriffen. Zur Verdeutlichung des obigen Codes ist jQuery nicht erforderlich, funktioniert aber auch mit jQuery.

Verbündete
quelle
10
Wenn Sie jQuery nicht verwenden, werden weniger Codezeilen ausgeführt, während Sie genau das gleiche Ergebnis erzielen, wie oben gezeigt. jQuery abstrahiert js. Dies ist die direkte Antwort von js, und schauen Sie sich die Größe an!
xrDDDD
Ist es nicht besser, nur das Schlüsselwort 'this' zu verwenden, mit dem Sie immer auf die Eigenschaften des Elements zugreifen können, das das Ereignis ausgelöst hat?
Morfidon
7
Ich musste nur den ganzen jQuery-Mist durchforsten, um zu dieser Antwort zu gelangen. Vielen Dank. Dies ist relevanter als je zuvor: needmorejquery.com
gromit190
Super, hat mir wirklich geholfen
Barbz_YHOOL
59

Sie können verwenden, (this)um auf das Objekt zu verweisen, das die Funktion ausgelöst hat.

'this'ist ein DOM Element, wenn Sie sich innerhalb einer Rückruffunktion befinden (im Kontext von jQuery) und beispielsweise von den Methoden click, each, bind usw. aufgerufen werden.

Hier können Sie mehr erfahren: http://remysharp.com/2007/04/12/jquerys-this-demystified/

Espo
quelle
3
Wenn Sie eine Funktion wie $(html).click()diese haben, wird das HTML-Objekt und nicht das angeklickte Element zurückgegeben
TCHdvlp
28

Ich generiere eine Tabelle dynamisch aus einer Datenbank, empfange die Daten in JSON und füge sie in eine Tabelle ein. Jede Tabellenzeile hat ein eindeutiges Element ID, das für weitere Aktionen benötigt wird. Wenn also das DOM geändert wird, benötigen Sie einen anderen Ansatz:

$("table").delegate("tr", "click", function() {
   var id=$(this).attr('id');
   alert("ID:"+id);  
});
Schmutz
quelle
2
Oh ja, das habe ich gesucht. Dies funktioniert auch für das neuere "Ein", da "Delegieren" jetzt veraltet ist. Ich hatte Kontrollkästchen, die dynamisch aus DB-Daten erstellt wurden, und natürlich hatten sie alle unterschiedliche IDs, die ich verwenden musste, um beim Klicken etwas zu tun. Ich habe diese Methode hier verwendet, um zu ermitteln, auf welche ID tatsächlich geklickt wurde. In JS der alten Schule habe ich gerade die ID von jedem Kontrollkästchen im HTML-Code des Kontrollkästchens übergeben, kann dies aber mit dem jQuery-Ereignishandlermodell nicht auf diese Weise tun.
Mikato
18

Element , das Ereignis ausgelöst haben wir in Event Immobilien

event.currentTarget

Wir erhalten ein DOM-Knotenobjekt , für das der Ereignishandler festgelegt wurde.


Der am meisten verschachtelte Knoten, der den Bubbling-Prozess gestartet hat

event.target

Das Ereignisobjekt ist immer das erste Attribut des Ereignishandlers. Beispiel:

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

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

});

Weitere Informationen zur Delegation von Veranstaltungen finden Sie unter http://maciejsikora.com/standard-events-vs-event-delegation/.

Maciej Sikora
quelle
11

Das Quellelement als jQuery-Objekt sollte über abgerufen werden

var $el = $(event.target);

Dadurch erhalten Sie die Quelle des Klicks und nicht das Element, dem auch die Klickfunktion zugewiesen wurde. Kann nützlich sein, wenn sich das Klickereignis auf einem übergeordneten Objekt befindet. Ein Klickereignis in einer Tabellenzeile, und Sie benötigen die Zelle, auf die geklickt wurde

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

Sie können versuchen, Folgendes zu verwenden:

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

Dies funktioniert mit den meisten Arten von Elementen:

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

Im Fall von delegierten Ereignishandlern, bei denen Sie möglicherweise Folgendes haben:

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

und Ihr JS-Code wie folgt:

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

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

Sie werden höchstwahrscheinlich feststellen, dass itemId ist undefined, da der Inhalt des LI in a eingeschlossen ist <span>, was bedeutet, dass das <span>wahrscheinlich das Ereignisziel ist. Sie können dies mit einem kleinen Scheck umgehen, wie folgt:

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

Oder wenn Sie die Lesbarkeit maximieren möchten (und unnötige Wiederholungen von jQuery-Wrapping-Aufrufen vermeiden möchten):

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

Bei Verwendung der Ereignisdelegierung ist die .is()Methode von unschätzbarem Wert, um zu überprüfen, ob Ihr Ereignisziel (unter anderem) tatsächlich das ist, was Sie benötigen. Verwenden Sie .closest(selector)diese Option, um den DOM-Baum zu durchsuchen, und verwenden Sie ihn .find(selector)(im Allgemeinen gekoppelt mit .first(), wie in .find(selector).first()), um ihn zu durchsuchen. Sie müssen es nicht .first()verwenden .closest(), da es nur das erste übereinstimmende Vorfahrenelement .find()zurückgibt , während alle übereinstimmenden Nachkommen zurückgegeben werden.

Isochron
quelle
1
Nützlich! Ich habe mich in meinem Fall angepasst, weil ich gerade eine einfache <li id ​​= "numberID"> erhalten habe und daher itemId = $ target.attr ('id') verwendet habe.
Zappescu
Seien Sie vorsichtig bei der Verwendung eines einfachen ID-Attributs, da jede ID auf dieser Seite eindeutig sein muss. Wenn Sie also aus irgendeinem Grund zwei solcher Listen auf dieser Seite benötigen, werden Sie wahrscheinlich doppelte IDs haben, was eine schlechte Sache ist. Aus diesem Grund verwende ich die Daten-ID immer nur zur Zukunftssicherung.
Isochronous
6

Use can Use .on event

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

Dies funktioniert bei einem höheren z-indexals dem in den obigen Antworten genannten Ereignisparameter:

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

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

Auf diese Weise erhalten Sie immer das Element id(in diesem Beispiel li). Auch wenn auf ein untergeordnetes Element des übergeordneten Elements geklickt wird.

Marcel Verwey
quelle
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 hier arbeiten .

shmuli
quelle
Ich denke, dies ist ein bisschen wie eine veraltete Option, damit es funktioniert
Arnas Pečelis
2
@ ArnasPečelis veraltet? nein, nur nicht jQuery.
Kevin B
4

Verwenden Sie einfach die thisReferenz

$(this).attr("id")

oder

$(this).prop("id")
Fehler 404
quelle
Dadurch wird das Attribut idvon dem Element click()abgerufen, für das es zugewiesen wurde. Wenn Sie mehr Daten auf diese Methode übertragen müssen, benötigen Sie data-some-id="<?php $someId; ?>"und können dann $ (this) .data ("some-id") abrufen.
Roland
3

this.element.attr("id") funktioniert gut in IE8.

vml19
quelle
2

Beide Arbeiten,

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

und

alert(this.id);
Moji
quelle
2
$(".classobj").click(function(e){
    console.log(e.currentTarget.id);
})
chings228
quelle
@ ManuelMannhardt Es gibt keinen Link in dieser Antwort, es ist nur Code-Antwort, nicht nur Link-Antwort
Barbansan
1

Mit der Funktion können Sie die ID und den Wert für das geänderte Element abrufen (in meinem Beispiel habe ich ein Select-Tag verwendet.

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

Ich arbeite mit

jQuery Autocomplete

Ich habe versucht, nach einem eventwie oben beschrieben zu suchen , aber wenn die Anforderungsfunktion ausgelöst wird, scheint sie nicht verfügbar zu sein. Ich habe this.element.attr("id")stattdessen die ID des Elements erhalten, und es scheint gut zu funktionieren.

TUPFEN
quelle
0

Im Fall von Angular 7.x können Sie das native Element und seine ID oder Eigenschaften abrufen.

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>
David Dehghan
quelle