Uzyskiwanie identyfikatora elementu, który wywołał zdarzenie

969

Czy jest jakiś sposób na uzyskanie identyfikatora elementu, który uruchamia zdarzenie?

Myślę o czymś takim:

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

Z wyjątkiem oczywiście tego, że var testpowinien zawierać identyfikator "aaa", jeśli zdarzenie jest uruchamiane z pierwszej formy, i "bbb"jeśli zdarzenie jest uruchamiane z drugiej postaci.

Joda
źródło
25
Twój przykład jest nieco dziwny. Dołączasz zdarzenie kliknięcia do „a”, ale nie masz żadnych kotwic. Zmiana na $ („input.title”). Kliknięcie (...) byłaby nieco bardziej zrozumiała dla przyszłych czytelników twojego pytania.
Jason Moore,
3
W event.target.idmodule obsługi zdarzeń można użyć, aby uzyskać identyfikator elementu, który wywołał zdarzenie.
Ilyas karim

Odpowiedzi:

1292

W jQuery event.targetzawsze odnosi się do elementu, który wywołał zdarzenie, gdzie eventparametr jest przekazywany do funkcji. http://api.jquery.com/category/events/event-object/

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

Zauważ też, że thisto również zadziała, ale nie jest to obiekt jQuery, więc jeśli chcesz użyć na nim funkcji jQuery, musisz się do niego odwołać $(this)np .:

$(document).ready(function() {
    $("a").click(function(event) {
        // this.append wouldn't work
        $(this).append(" Clicked");
    });
});
samjudson
źródło
12
Łał! Dzięki. Nie zdawałem sobie sprawy, że jQuery tak dobrze ją streściło. Rządzisz! Wydaje mi się, że nadal będzie istniała różnica między (this) a (event.target) - będąc obiektem, do którego powiązałeś zdarzenie, z obiektem, który otrzymał zdarzenie.
Hafthor,
18
Niestety, event.target nie pozwala na dostęp do swoich niestandardowych atrybutów. Aby to zrobić, należy użyć $ (this) .attr ("organization: thingy") ;.
Zian Choy,
16
@ZianChoy - Nie jestem do końca pewien, co rozumiesz przez „niestandardowe atrybuty”, ale możesz użyć, $(event.target)jeśli potrzebujesz metody jQuery, np $(event.target).attr("organisation:thingy");.
nnnnnn
3
Myślę, że należy zauważyć, że jeśli potrzebujesz dostępu do celu zdarzenia w celu manipulowania domeną, możesz zrobić coś takiego: $ (event.target) .eq (0). Następnie możesz użyć dowolnej metody, której normalnie używasz z elementem dom, takiej jak na przykład $ (event.target) .eq (0) .find ('li').
Kogut
31
Pamiętaj, że: event.target to kliknięty prawdziwy przedmiot. Jeśli, na przykład, przypiszesz zdarzenie click do div, a wewnątrz div jest element P i H2 - event.target zwróci element H2 lub P, jeśli klikniesz jeden z nich. „this” naprawdę zwróci div, na którym zawiesiłeś zdarzenie, niezależnie od tego, który element potomny kliknąłeś.
Rob
169

W celach informacyjnych spróbuj tego! To działa!

jQuery("classNameofDiv").click(function() {
    var contentPanelId = jQuery(this).attr("id");
    alert(contentPanelId);
});
Pączek
źródło
16
@gemma Drugie rozwiązanie nie działało dla mnie, ale to zadziałało. Dzięki za spóźnienie.
HPWD,
3
@dlackey to dla mnie to samo, inne rozwiązanie nie działało na moim firefoxie 12, ale to zadziałało. Dzięki
linuxatico
4
Najlepsza odpowiedź wydaje się nie działać w celu uzyskania identyfikatora elementu w osadzonym pliku SVG. $(this).attr("id");robi.
Matt Fletcher
2
Pamiętaj, że jeśli zdarzenie kliknięcia dotyczy elementu z dziećmi, e.targetpoda dokładny element, który spowodował uruchomienie zdarzenia, nawet jeśli było to dziecko, a thiselement, do którego zdarzenie jest dołączone.
samrap
97

Chociaż jest to wspomniane w innych postach, chciałem to przeliterować:

$(event.target).id jest niezdefiniowany

$(event.target)[0].id daje atrybut id.

event.target.id daje również atrybut id.

this.id daje atrybut id.

i

$(this).id jest niezdefiniowany.

Różnice dotyczą oczywiście obiektów jQuery i obiektów DOM. „id” jest właściwością DOM, więc aby go użyć, musisz być w obiekcie elementu DOM.

(Potknęło mnie to, więc prawdopodobnie potknęło się o kogoś innego)

dsch
źródło
1
dla mnie event.target.idnic nie daje!
artaxerxe
3
@artaxerxe oznacza to, że kliknięty element nie ma identyfikatora: P; także nie używaj jquery do tego typu rzeczy .... zamiast tego używaj atrybutów javascript zdarzeń, ponieważ jest to szybsze.
HellBaby,
$(event.target).attr('selector');działało dla mnie idealnie.
Souleste,
84

Dla wszystkich zdarzeń, nie ograniczając się tylko do jQuery, którego możesz użyć

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

W przypadku event.targetniepowodzenia wraca event.srcElementdo IE. Wyjaśnienie powyższego kodu nie wymaga jQuery, ale działa również z jQuery.

Sprzymierzyć
źródło
10
Nieużywanie jQuery oznacza, że ​​uruchamianych jest mniej wierszy kodu, uzyskując dokładnie ten sam wynik, jak pokazano powyżej. jQuery streszcza js. To jest bezpośrednia odpowiedź js i spójrz na rozmiar!
xrDDDD
czy nie lepiej jest po prostu użyć słowa kluczowego „to”, które zawsze zapewnia dostęp do właściwości elementu, który wywołał zdarzenie?
Morfidon
6
Musiałem przekopać się przez całą bzdurę jQuery, żeby dostać się do tej odpowiedzi. Dzięki. Jest to bardziej aktualne niż kiedykolwiek: needmorejquery.com
gromit190
niesamowite, naprawdę pomogło mi
Barbz_YHOOL
59

Można użyć (this)do odwołania do obiektu, który uruchomił funkcję.

'this'jest elementem DOM, gdy znajdujesz się w funkcji wywołania zwrotnego (w kontekście jQuery), na przykład wywoływana metodami click, each, bind itp.

Tutaj możesz dowiedzieć się więcej: http://remysharp.com/2007/04/12/jquerys-this-demystified/

Espo
źródło
3
jeśli masz funkcję typu $(html).click()(this), zwróci obiekt HTML, a nie kliknięty element
TCHdvlp
28

Dynamicznie generuję tabelę z bazy danych, odbieram dane w JSON i umieszczam je w tabeli. Każdy wiersz tabeli ma unikalny element ID, który jest potrzebny do dalszych działań, więc jeśli DOM zostanie zmieniony, potrzebujesz innego podejścia:

$("table").delegate("tr", "click", function() {
   var id=$(this).attr('id');
   alert("ID:"+id);  
});
Świństwa
źródło
2
O tak, tego właśnie szukałem. Działa również tak samo dla nowszych „on”, ponieważ „delegate” jest teraz przestarzałe. Miałem pola wyboru tworzone dynamicznie z danych DB i oczywiście wszystkie miały różne identyfikatory, których musiałem użyć, aby coś zrobić po kliknięciu. Użyłem tej metody tutaj, aby dowiedzieć się, który identyfikator został kliknięty. W starej szkole JS właśnie przekazałem identyfikator z każdego pola wyboru w kodzie HTML pola wyboru, ale nie mogę tego zrobić w modelu obsługi zdarzeń jQuery.
mikato
18

Element, który wywołał zdarzenie, które mamy we właściwości zdarzenia

event.currentTarget

Otrzymujemy obiekt węzła DOM, dla którego ustawiono obsługę zdarzeń.


Najczęściej zagnieżdżony węzeł, w którym rozpoczęliśmy proces propagacji

event.target

Obiekt zdarzenia jest zawsze pierwszym atrybutem modułu obsługi zdarzeń, przykład:

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

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

});

Więcej informacji na temat delegowania wydarzeń można znaleźć na stronie http://maciejsikora.com/standard-events-vs-event-delegation/

Maciej Sikora
źródło
11

Element źródłowy jako obiekt jQuery powinien być uzyskany poprzez

var $el = $(event.target);

Otrzymasz źródło kliknięcia, a nie element, do którego przypisano funkcję kliknięcia. Może być przydatny, gdy zdarzenie click znajduje się na obiekcie nadrzędnym EG. Zdarzenie click w wierszu tabeli i potrzebujesz klikniętej komórki

$("tr").click(function(event){
    var $td = $(event.target);
});
Morvael
źródło
7

Możesz spróbować użyć:

$('*').live('click', function() {
 console.log(this.id);
 return false;
});
Dariusz
źródło
7

działa to z większością typów elementów:

$('selector').on('click',function(e){
    log(e.currentTarget.id);
    });
Cris
źródło
6

W przypadku obsługi zdarzeń delegowanych, gdzie możesz mieć coś takiego:

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

i twój kod JS tak:

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

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

Prawdopodobnie zauważysz, że itemId jest undefined, ponieważ zawartość LI jest owinięta w <span>, co oznacza, że <span>prawdopodobnie będzie to cel zdarzenia. Możesz obejść ten problem za pomocą małego czeku, takiego jak:

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

Lub, jeśli wolisz zmaksymalizować czytelność (a także uniknąć niepotrzebnego powtarzania wywołań zawijania 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
    });
});

Podczas korzystania z delegowania zdarzeń .is()metoda ta jest nieoceniona w celu sprawdzenia, czy cel zdarzenia (między innymi) jest faktycznie tym, czego potrzebujesz. Użyj, .closest(selector)aby wyszukać drzewo DOM i użyj .find(selector)(zwykle w połączeniu z .first(), jak w .find(selector).first()), aby przeszukać to drzewo . Nie musisz używać .first()podczas używania .closest(), ponieważ zwraca tylko pierwszy pasujący element przodka, podczas gdy .find()zwraca wszystkich pasujących potomków.

Izochroniczny
źródło
1
Przydatny! Dostosowałem się w moim przypadku, ponieważ właśnie dostałem prosty <li id ​​= "numberID">, więc użyłem itemId = $ target.attr ('id').
Zappescu,
Uważaj tylko na prosty atrybut identyfikatora, ponieważ każdy identyfikator musi być unikalny na tej stronie. Więc jeśli z jakiegoś powodu potrzebujesz dwóch takich list na tej stronie, prawdopodobnie skończysz z duplikatami identyfikatorów, co jest złą rzeczą. Dlatego zwykle używam identyfikatora danych tylko do zabezpieczenia na przyszłość.
Izochroniczny
6

Use może użyć. Na zdarzenie

  $("table").on("tr", "click", function() {
                    var id=$(this).attr('id');
                    alert("ID:"+id);  
                });
Podstawowe zasady
źródło
5

Działa to z-indexw przypadku parametru zdarzenia wyższego niż wspomniany w powyższych odpowiedziach:

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

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

W ten sposób zawsze otrzymasz idelement (w tym przykładzie li). Również po kliknięciu elementu potomnego elementu nadrzędnego ..

Marcel Verwey
źródło
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 robocza tutaj .

shmuli
źródło
Myślę, że jest to trochę przestarzała opcja, aby to działało
Arnas Pečelis,
2
@ ArnasPečelis jest nieaktualny? nie, po prostu nie jQuery.
Kevin B
4

Po prostu skorzystaj z thisreferencji

$(this).attr("id")

lub

$(this).prop("id")
Błąd 404
źródło
Pobiera atrybut idz elementu, do którego click()został przypisany. Jeśli potrzebujesz przenieść więcej danych do tej metody, potrzebujesz, data-some-id="<?php $someId; ?>"a następnie możesz `$ (this) .data (" some-id "), aby je odzyskać.
Roland
3

this.element.attr("id") działa dobrze w IE8.

vml19
źródło
2

Obie te prace

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

i

alert(this.id);
Moji
źródło
2
$(".classobj").click(function(e){
    console.log(e.currentTarget.id);
})
chings228
źródło
@ManuelMannhardt nie ma linku w tej odpowiedzi, jest to odpowiedź tylko kodowa, nie odpowiedź tylko
linkowa
1

Możesz użyć tej funkcji, aby uzyskać identyfikator i wartość zmienionego elementu (w moim przykładzie użyłem tagu Select.

              $('select').change(
                   function() {
                        var val = this.value;
                        var id = jQuery(this).attr("id");
                        console.log("value changed" + String(val)+String(id));
                   }
               );
Xeon
źródło
0

Pracuję z

jQuery Autouzupełnianie

Próbowałem znaleźć eventopisany powyżej sposób, ale kiedy uruchamia się funkcja żądania, wydaje się, że nie jest dostępna. Kiedyś this.element.attr("id"), aby uzyskać identyfikator elementu zamiast, i wydaje się działać prawidłowo.

ZIMNICA
źródło
0

W przypadku Angulara 7.x można uzyskać element macierzysty oraz jego identyfikator lub właściwości.

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
źródło