Mendapatkan ID elemen yang memecat suatu peristiwa

969

Apakah ada cara untuk mendapatkan ID elemen yang menyalakan suatu acara?

Saya sedang memikirkan sesuatu seperti:

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

Kecuali tentu saja bahwa var testharus berisi id "aaa", jika acara dipecat dari form pertama, dan "bbb", jika acara dipecat dari form kedua.

Joda
sumber
25
Contoh Anda agak aneh. Anda melampirkan acara klik ke 'a', tetapi tidak memiliki jangkar. Mengubahnya menjadi $ ('input.title'). Klik (...) akan sedikit lebih jelas bagi pembaca pertanyaan Anda di masa depan.
Jason Moore
3
Anda dapat menggunakan event.target.idpengatur acara untuk mendapatkan id elemen yang memecat suatu peristiwa.
Ilyas karim

Jawaban:

1293

Di jQuery event.targetselalu merujuk ke elemen yang memicu acara, di mana eventparameter dilewatkan ke fungsi. http://api.jquery.com/category/events/event-object/

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

Perhatikan juga bahwa thisitu juga akan berfungsi, tetapi itu bukan objek jQuery, jadi jika Anda ingin menggunakan fungsi jQuery di atasnya maka Anda harus merujuknya sebagai $(this), misalnya:

$(document).ready(function() {
    $("a").click(function(event) {
        // this.append wouldn't work
        $(this).append(" Clicked");
    });
});
samjudson
sumber
12
Wow! Terima kasih. Tidak menyadari bahwa jQuery melakukan abstraksi dengan sangat baik. Kamu keren! Saya akan berpikir itu masih akan memiliki perbedaan antara (ini) dan (event.target) - menjadi objek yang Anda ikatkan dengan vs objek yang menerima acara tersebut.
Hafthor
18
Sayangnya, event.target tidak mengizinkan akses ke atribut khususnya. Untuk melakukan itu, seseorang harus menggunakan $ (ini) .attr ("organisasi: thingy") ;.
Zian Choy
16
@ZianChoy - Saya tidak yakin apa yang Anda maksud dengan "atribut khusus", tetapi Anda dapat menggunakan $(event.target)jika Anda memerlukan metode jQuery, misalnya $(event.target).attr("organisation:thingy");,.
nnnnnn
3
Saya pikir ini catatan bahwa jika Anda memerlukan akses ke target acara untuk memanipulasi dom Anda dapat melakukan sesuatu seperti ini: $ (event.target) .eq (0). Anda kemudian dapat menggunakan metode apa pun yang biasanya Anda gunakan dengan elemen dom seperti $ (event.target) .eq (0) .find ('li') misalnya.
Ayam jantan
31
Harap dicatat, bahwa: event.target adalah nyata barang yang diklik. Jika Anda, misalnya, Anda mengikat acara klik ke div, dan, di dalam div itu adalah elemen P dan H2 - event.target akan mengembalikan elemen H2 atau P, jika mengklik salah satunya. "Ini" akan benar-benar mengembalikan div tempat Anda menggantung acara, terlepas dari elemen anak apa yang Anda klik.
Rob
169

Untuk referensi, coba ini! Berhasil!

jQuery("classNameofDiv").click(function() {
    var contentPanelId = jQuery(this).attr("id");
    alert(contentPanelId);
});
Gemma
sumber
16
@ gemma Solusi lain tidak bekerja untuk saya tetapi yang ini berhasil. Terima kasih sudah terlambat.
HPWD
3
@ Daveey itu sama bagi saya, solusi lain tidak bekerja pada firefox 12 saya, tapi yang ini berhasil. Terima kasih
linuxatico
4
Jawaban teratas tampaknya tidak berfungsi untuk mendapatkan ID suatu elemen dalam SVG yang disematkan. $(this).attr("id");tidak.
Matt Fletcher
2
Perlu diingat bahwa jika acara klik Anda ada pada elemen dengan anak-anak, e.targetakan memberi Anda elemen tepat yang menyebabkan acara tersebut dipecat meskipun itu adalah anak-anak, sedangkan thisakan memberi Anda elemen tempat acara tersebut dilampirkan.
samrap
97

Meskipun disebutkan dalam posting lain, saya ingin menjelaskan ini:

$(event.target).id tidak terdefinisi

$(event.target)[0].id memberikan atribut id.

event.target.id juga memberikan atribut id.

this.id memberikan atribut id.

dan

$(this).id tidak terdefinisi.

Perbedaannya, tentu saja, adalah antara objek jQuery dan objek DOM. "id" adalah properti DOM sehingga Anda harus berada di objek elemen DOM untuk menggunakannya.

(Ini membuatku tersandung, jadi mungkin tersandung orang lain)

dsch
sumber
1
bagi saya, event.target.idtidak memberi apa-apa!
artaxerxe
3
@artaxerxe ini berarti elemen yang diklik tidak memiliki id: P; juga tidak menggunakan jquery untuk hal-hal semacam ini .... gunakan atribut event javascript karena itu lebih cepat.
HellBaby
$(event.target).attr('selector');bekerja dengan baik untuk saya.
Souleste
85

Untuk semua acara, tidak terbatas hanya jQuery yang dapat Anda gunakan

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

Dimana event.targetgagal jatuh kembali event.srcElementke IE. Untuk memperjelas kode di atas tidak memerlukan jQuery tetapi juga berfungsi dengan jQuery.

Sekutu
sumber
10
Tidak menggunakan jQuery berarti lebih sedikit baris kode dijalankan sambil mendapatkan hasil yang sama persis, seperti yang ditunjukkan di atas. jQuery abstrak jauh js. Ini adalah jawaban langsung, dan lihat ukurannya!
xrDDDD
bukankah lebih baik hanya menggunakan kata kunci 'ini' yang akan selalu memberi Anda akses ke properti dari elemen yang memanggil acara?
Morfidon
7
Hanya harus menggali semua omong kosong jQuery untuk mendapatkan jawaban ini. Terima kasih. Ini lebih relevan dari sebelumnya: needsmorejquery.com
gromit190
luar biasa, sangat membantu saya
Barbz_YHOOL
59

Anda dapat menggunakan (this)untuk referensi objek yang memecat fungsi.

'this'adalah elemen DOM ketika Anda berada di dalam fungsi panggilan balik (dalam konteks jQuery), misalnya, dipanggil oleh metode klik, masing-masing, mengikat, dll.

Di sinilah Anda dapat mempelajari lebih lanjut: http://remysharp.com/2007/04/12/jquerys-this-demystified/

Espo
sumber
3
jika Anda memiliki fungsi seperti $(html).click()(ini) akan mengembalikan objek html dan bukan elemen yang diklik
TCHdvlp
28

Saya menghasilkan tabel secara dinamis dari database, menerima data dalam JSON dan memasukkannya ke dalam tabel. Setiap baris tabel mendapat unik ID, yang diperlukan untuk tindakan lebih lanjut, jadi, jika DOM diubah, Anda memerlukan pendekatan yang berbeda:

$("table").delegate("tr", "click", function() {
   var id=$(this).attr('id');
   alert("ID:"+id);  
});
Jelaga
sumber
2
Oh ya, inilah yang saya cari. Ini juga berfungsi sama untuk "on" yang lebih baru karena "delegate" sekarang sudah tidak digunakan lagi. Saya memiliki kotak centang yang dibuat secara dinamis dari data DB, dan tentu saja mereka semua memiliki ID berbeda yang perlu saya gunakan untuk melakukan sesuatu ketika diklik. Saya menggunakan metode ini di sini untuk mendapatkan ID mana yang benar-benar diklik. Di sekolah JS lama saya baru saja melewati id dari setiap kotak centang di HTML kotak centang itu, tetapi tidak bisa melakukannya dengan model event handler jQuery.
mikato
18

Elemen yang dipecat acara kita miliki di properti acara

event.currentTarget

Kami mendapatkan objek simpul DOM yang mengatur event handler.


Sebagian besar simpul bersarang yang memulai proses bubbling yang kita miliki di

event.target

Objek acara selalu atribut pertama dari pengendali acara, contoh:

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

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

});

Lebih lanjut tentang delegasi acara Anda dapat membaca di http://maciejsikora.com/standard-events-vs-event-delegation/

Maciej Sikora
sumber
11

Elemen sumber sebagai objek jQuery harus diperoleh melalui

var $el = $(event.target);

Ini memberi Anda sumber klik, bukan elemen yang ditetapkan fungsi klik juga. Dapat berguna ketika acara klik pada objek induk EG. Acara klik pada baris tabel, dan Anda membutuhkan sel yang diklik

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

Anda dapat mencoba menggunakan:

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

ini bekerja dengan sebagian besar jenis elemen:

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

Dalam hal penangan acara yang didelegasikan, di mana Anda mungkin memiliki sesuatu seperti ini:

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

dan kode JS Anda seperti itu:

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

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

Anda kemungkinan besar akan menemukan itemId itu undefined, karena konten LI dibungkus dengan a <span>, yang berarti <span>mungkin akan menjadi target acara. Anda dapat menyiasatinya dengan cek kecil, seperti:

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

Atau, jika Anda lebih suka memaksimalkan keterbacaan (dan juga menghindari pengulangan panggilan pembungkus jQuery yang tidak perlu):

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

Saat menggunakan delegasi acara, .is()metode ini sangat berharga untuk memverifikasi bahwa target acara Anda (antara lain) sebenarnya adalah apa yang Anda inginkan. Gunakan .closest(selector)untuk mencari pohon DOM, dan gunakan .find(selector)(umumnya ditambah dengan .first(), seperti pada .find(selector).first()) untuk mencari ke bawah. Anda tidak perlu menggunakan .first()saat menggunakan .closest(), karena hanya mengembalikan elemen leluhur yang cocok pertama, sementara .find()mengembalikan semua keturunan yang cocok.

Isoron
sumber
1
Berguna! Saya menyesuaikan dalam kasus saya karena saya baru saja mendapatkan <li id ​​= "numberID"> dan saya menggunakan itemId = $ target.attr ('id').
Zappescu
Berhati-hatilah dalam menggunakan atribut ID sederhana, karena setiap ID harus unik pada halaman itu. Jadi jika Anda karena suatu alasan perlu memiliki dua daftar seperti itu di halaman itu, Anda mungkin akan berakhir dengan duplikat ID, yang merupakan hal yang buruk. Itu sebabnya saya cenderung selalu menggunakan data-id hanya untuk pemeriksaan masa depan.
Isochronous
6

Gunakan bisa Gunakan .pada acara

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

Ini berfungsi pada z-indexparameter acara yang lebih tinggi daripada yang disebutkan dalam jawaban di atas:

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

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

Dengan cara ini Anda akan selalu mendapatkan idelemen (dalam contoh ini li). Juga ketika diklik pada elemen anak dari induk ..

Marcel Verwey
sumber
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);
}

Bekerja JSFiddle di sini .

shmuli
sumber
Saya pikir ini adalah opsi yang agak ketinggalan jaman untuk membuatnya bekerja
Arnas Pečelis
2
@ ArnasPečelis kedaluwarsa? tidak, hanya tidak jQuery.
Kevin B
4

Cukup gunakan thisreferensi

$(this).attr("id")

atau

$(this).prop("id")
Kesalahan 404
sumber
Itu mengambil atribut iddari elemen tempat click()ditugaskan. Jika Anda perlu mentransfer lebih banyak data ke metode itu, Anda perlu data-some-id="<?php $someId; ?>"dan kemudian Anda dapat `$ (ini). Data (" some-id ") untuk mengambilnya.
Roland
3

this.element.attr("id") berfungsi dengan baik di IE8.

vml19
sumber
2

Kedua pekerjaan ini,

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

dan

alert(this.id);
Moji
sumber
2
$(".classobj").click(function(e){
    console.log(e.currentTarget.id);
})
chings228
sumber
@ManuelMannhardt tidak ada tautan dalam jawaban ini, ini hanya jawaban kode, bukan jawaban hanya tautan
barbsan
1

Anda dapat menggunakan fungsi untuk mendapatkan id dan nilai untuk item yang diubah (dalam contoh saya, saya telah menggunakan tag Pilih.

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

Saya bekerja dengan

jQuery Autocomplete

Saya mencoba mencari event seperti yang dijelaskan di atas, tetapi ketika fungsi permintaan menyala sepertinya tidak tersedia. Saya digunakan this.element.attr("id")untuk mendapatkan ID elemen sebagai gantinya, dan tampaknya berfungsi dengan baik.

COLEK
sumber
0

Dalam kasus Angular 7.x Anda bisa mendapatkan elemen asli dan id atau propertinya.

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
sumber