Bir etkinliği tetikleyen öğenin kimliğini alma


969

Bir etkinliği tetikleyen öğenin kimliğini almanın herhangi bir yolu var mı?

Şöyle bir şey düşünüyorum:

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

Tabii ki, değişken ilk formdan tetiklenirse ve olay ikinci formdan tetiklenirse test, kimliğin kimliğini içermesi dışında ."aaa""bbb"


25
Örneğin biraz tuhaf. "A" ya bir tıklama etkinliği ekliyorsunuz ancak sabitlemeniz yok. Bunu $ ('input.title') olarak değiştirmek.
Jason Moore

3
Bir event.target.idolayı başlatan öğenin kimliğini almak için olay işleyicide kullanabilirsiniz .
Ilyas karim

Yanıtlar:


1293

JQuery'de event.targether zaman olayı tetikleyen öğeye atıfta bulunulur , burada eventparametre işleve iletilir. http://api.jquery.com/category/events/event-object/

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

Şunu unutmayalım ki thisbunu bir jQuery işlevini kullanmak istiyorsanız olacak ayrıca çalışma, ama öyle bir jQuery nesnesi, yani o zaman o sonuca başvurmalıdır değil $(this)örneğin:

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

12
Vaov! Teşekkürler. JQuery'nin bu kadar iyi olduğunu fark etmedim. Harikasın! Ben hala (this) ve (event.target) arasındaki farkı olacağını düşünürdüm - olayı alan nesneye karşı olay bağlı nesne olmak.
Hafthor

18
Maalesef event.target, özel özelliklerine erişime izin vermiyor. Bunu yapmak için $ (this) .attr ("organisation: thingy"); kullanılmalıdır.
Zian Choy

16
@ZianChoy - "custom attributes" ile ne demek istediğinizi tam olarak bilmiyorum, ancak $(event.target)jQuery yöntemine ihtiyacınız varsa kullanabilirsiniz , örn $(event.target).attr("organisation:thingy");.
nnnnnn

3
Ben dom manipüle için olay hedefine erişim gerekiyorsa, böyle bir şey yapabilirsiniz unutmayın: $ (event.target) .eq (0). Daha sonra, örneğin $ (event.target) .eq (0) .find ('li') gibi bir dom öğesiyle normalde kullanacağınız herhangi bir yöntemi kullanabilirsiniz.
Horoz

31
Lütfen dikkat: event.target, tıklanan gerçek öğedir. Örneğin, bir tıklama olayını bir div öğesine bağlarsanız ve bu div içinde bir P ve bir H2 öğesidir - event.target, bunlardan birine tıklanırsa H2 öğesini veya P öğesini döndürür. "this", hangi alt öğeyi tıkladığınıza bakılmaksızın, etkinliği astığınız div'ı gerçekten döndürür.
Rob

169

Referans için şunu deneyin! İşe yarıyor!

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

16
@gemma Diğer çözüm benim için çalışmadı ama bu çözüm işe yaradı. Geç kaldığınız için teşekkürler.
HPWD

3
@dlackey benim için aynı, diğer çözüm benim firefox 12 üzerinde çalışmadı, ama bu işe yaradı. Teşekkürler
linuxatico

4
En iyi yanıt, gömülü bir SVG'deki bir öğenin kimliğini almak için işe yaramıyor gibi görünüyor. $(this).attr("id");yapar.
Matt Fletcher

2
Tıklama etkinliğiniz çocuklu bir e.targetöğedeyse, etkinliğin alt öğe olsa bile tetiklenmesine neden thisolan öğeyi size verirken etkinliğin eklendiği öğeyi size vereceğini unutmayın.
samrap

97

Diğer yazılarda bahsedilmesine rağmen, bunu açıklamak istedim:

$(event.target).id tanımsız

$(event.target)[0].id id niteliğini verir.

event.target.id id niteliğini de verir.

this.id id niteliğini verir.

ve

$(this).id tanımsız.

Farklılıklar, elbette, jQuery nesneleri ile DOM nesneleri arasındadır. "id" bir DOM özelliğidir, bu nedenle onu kullanmak için DOM öğesi nesnesinde olmanız gerekir.

(Beni harekete geçirdi, bu yüzden muhtemelen başka birini açtı)


1
bana event.target.idhiçbir şey vermiyor!
artaxerxe

3
@artaxerxe, tıklanan öğenizin bir kimliği olmadığı anlamına gelir: P; Ayrıca bu tür şeyler için jquery kullanmayın .... olay javascript özniteliklerini kullanın, bunun yerine daha hızlı neden olur.
Cehennem

$(event.target).attr('selector');benim için mükemmel çalıştı.
Souleste

85

Sadece jQuery ile sınırlı olmayan tüm etkinlikler için kullanabilirsiniz

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

Nerede event.targetbaşarısız olursa event.srcElementIE için geri düşer . Yukarıdaki kodu netleştirmek için jQuery gerektirmez, aynı zamanda jQuery ile çalışır.


10
JQuery kullanılmaması, yukarıda gösterildiği gibi aynı sonucu alırken daha az kod satırı çalıştırıldığı anlamına gelir. jQuery js'i özetler. Bu doğrudan js cevabı ve boyutuna bakın!
xrDDDD

her zaman etkinliği başlatan öğenin özelliklerine erişmenizi sağlayacak 'bu' anahtar kelimeyi kullanmak daha iyi değil mi?
Morfidon

7
Bu cevaba ulaşmak için tüm jQuery saçmalıklarını kazmak zorunda kaldım. Teşekkürler. Bu her zamankinden daha alakalı: needsmorejquery.com
gromit190

harika, gerçekten bana yardım etti
Barbz_YHOOL

59

(this)İşlevi başlatan nesneye başvurmak için kullanabilirsiniz .

'this'bir DOM(jQuery bağlamında), örneğin click, each, bind, vb. yöntemlerle çağrıldığında bir geri çağırma işlevinin içindeyken öğesidir.

Daha fazla bilgi için: http://remysharp.com/2007/04/12/jquerys-this-demystified/


3
$(html).click()(this) gibi bir işleviniz varsa , tıklanan öğeyi değil html nesnesini döndürür
TCHdvlp 28:13

28

Dinamik olarak bir veritabanı dışarı bir tablo oluşturmak, JSON veri almak ve bir tabloya koymak. Her tablo satırı benzersizdir ID, bu da daha fazla eylem için gereklidir, bu nedenle DOM değiştirilirse farklı bir yaklaşıma ihtiyacınız vardır:

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

2
Oh evet, aradığım şey buydu. "Delege" artık kullanımdan kaldırıldığı için yeni "on" için de aynı şekilde çalışır. DB verilerinden dinamik olarak oluşturulmuş onay kutuları vardı ve elbette hepsinin tıklandığında bir şey yapmak için kullanmam gereken farklı kimlikleri vardı. Bu yöntemi, hangi kimliğin gerçekten tıklandığını almak için burada kullandım. Eski okul JS'de, onay kutusunun HTML'sindeki her onay kutusundan kimliği geçtim, ancak jQuery olay işleyici modeliyle bu şekilde yapamam.
mikato

18

Etkinlik mülkiyetine sahip olduğumuz etkinliğin tetiklendiği öğe

event.currentTarget

Olay işleyicisi ayarlanmış olan DOM düğümü nesnesini alıyoruz .


İçinde köpürme sürecine başlayan en iç içe düğüm

event.target

Olay nesnesi her zaman olay işleyicisinin ilk özelliğidir, örnek:

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

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

});

Etkinlik yetkilendirmesi hakkında daha fazla bilgi http://maciejsikora.com/standard-events-vs-event-delegation/


11

Bir jQuery nesnesi olarak kaynak eleman,

var $el = $(event.target);

Bu, tıklama işlevinin de atandığı öğe yerine tıklamanın kaynağını alır. Click olayı, bir EG.a click olayı tablo satırında olduğunda ve tıklanan hücreye ihtiyacınız olduğunda yararlı olabilir

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

7

Kullanmayı deneyebilirsiniz:

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

7

bu, çoğu öğe türüyle çalışır:

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

6

Böyle bir şeye sahip olabileceğiniz yetki verilmiş olay işleyicileri durumunda:

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

ve JS kodunuz şöyle:

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

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

undefinedLI içeriğinin a'ya sarıldığı için itemId'in büyük olasılıkla daha fazla olduğunu görürsünüz, <span>bu <span>da muhtemelen etkinlik hedefi olacaktır. Bunun gibi küçük bir çekle dolaşabilirsiniz:

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

Veya, okunabilirliği en üst düzeye çıkarmayı (ve ayrıca jQuery sarma çağrılarının gereksiz tekrarını önlemek) tercih ediyorsanız:

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

Etkinlik yetkilendirmesi kullanılırken .is(), etkinlik hedefinizin (diğer şeylerin yanı sıra) aslında olması gereken şey olduğunu doğrulamak için yöntem paha biçilmezdir. .closest(selector)DOM ağacını aramak için kullanın ve aşağı doğru aramak için .find(selector)(genellikle .first()olduğu gibi .find(selector).first()). Sen kullanımına gerek yoktur .first()kullanırken .closest()yalnızca iken ilk eşleşen atası elemanını döndürür olarak, .find()getiri tüm eşleşen kökenini.


1
Kullanışlı! Ben sadece basit bir <li id ​​= "numberID"> var ve bu yüzden itemId = $ target.attr ('id') kullanmıştı çünkü benim durumda ayarlanmış.
Zappescu

Basit bir kimlik özelliği kullanma konusunda dikkatli olun, çünkü her kimliğin o sayfada benzersiz olması gerekir. Bu nedenle, herhangi bir nedenden ötürü bu sayfada böyle iki listeye sahip olmanız gerekiyorsa, muhtemelen yinelenen kimliklerle dolacaksınız, bu kötü bir şeydir. Bu yüzden her zaman sadece veri sağlama için veri kimliği kullanma eğilimindeyim.
Eşzamanlı

6

Use can .on olayını kullan

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

5

Bu z-index, yukarıdaki yanıtlarda belirtilen olay parametresinden daha yüksekte çalışır :

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

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

Bu şekilde her zaman id(bu örnekte li) elemanını alacaksınız . Ayrıca üst öğenin alt öğesine tıklandığında ..


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 burada çalışıyor .


Bence bu işe yaraması için modası geçmiş bir seçenek gibi
Arnas Pečelis

2
@ ArnasPečelis modası geçmiş mi? hayır, sadece jQuery değil.
Kevin B

4

Sadece thisreferans kullanın

$(this).attr("id")

veya

$(this).prop("id")

Bu, niteliği atandığı idöğeden click()alır. Bu yönteme daha fazla veri aktarmanız gerekiyorsa, buna ihtiyacınız var data-some-id="<?php $someId; ?>"ve ardından almak için `$ (this) .data (" some-id ") yapabilirsiniz.
Roland

3

this.element.attr("id") IE8'de iyi çalışıyor.


2

Bu çalışmaların ikisi de,

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

ve

alert(this.id);

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

@ManuelMannhardt Bu cevapta bağlantı yok, sadece kod yanıtı, sadece bağlantı yanıtı değil
barbsan

1

Değiştirilen öğenin kimliğini ve değerini almak için işlevi kullanabilirsiniz (örneğimde bir Select etiketi kullandım.

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

0

İle çalışıyorum

jQuery Otomatik Tamamlama

eventYukarıda açıklandığı gibi aramaya çalıştım , ancak istek işlevi tetiklendiğinde kullanılabilir görünmüyor. Bunun this.element.attr("id")yerine öğenin kimliğini alırdım ve iyi çalışıyor gibi görünüyor.


0

Açısal 7.x durumunda, yerel öğeyi ve kimliğini veya özelliklerini alabilirsiniz.

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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.