รับ ID ขององค์ประกอบที่ยิงเหตุการณ์


969

มีวิธีการรับ ID ขององค์ประกอบที่ไฟเหตุการณ์?

ฉันกำลังคิดเช่น:

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

ยกเว้นหลักสูตรที่ var testควรมี id "aaa"หากเหตุการณ์ถูกไล่ออกจากฟอร์มแรกและ"bbb"หากเหตุการณ์ถูกไล่ออกจากฟอร์มที่สอง


25
ตัวอย่างของคุณแปลกไปเล็กน้อย คุณกำลังแนบกิจกรรมการคลิกเพื่อ 'a' แต่ไม่มีแองเคอร์ใด ๆ การเปลี่ยนเป็น $ ('input.title'). คลิก (... ) จะชัดเจนขึ้นเล็กน้อยสำหรับผู้อ่านคำถามของคุณในอนาคต
Jason Moore

3
คุณสามารถใช้event.target.idในตัวจัดการเหตุการณ์เพื่อรับรหัสองค์ประกอบที่ไล่เหตุการณ์
Ilyas karim

คำตอบ:


1293

ใน jQuery event.targetหมายถึงองค์ประกอบที่ก่อให้เกิดเหตุการณ์อยู่เสมอซึ่งeventเป็นพารามิเตอร์ที่ส่งผ่านไปยังฟังก์ชัน http://api.jquery.com/category/events/event-object/

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

โปรดทราบด้วยว่าthisจะใช้งานได้ แต่ไม่ใช่วัตถุ jQuery ดังนั้นหากคุณต้องการใช้ฟังก์ชัน jQuery ในนั้นคุณต้องอ้างถึงเป็น$(this)เช่น:

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

12
ว้าว! ขอบคุณ ไม่ทราบว่า jQuery แยกออกเป็นอย่างดี คุณร็อค! ฉันคิดว่ามันจะยังคงมีความแตกต่างระหว่าง (นี้) และ (event.target) - เป็นวัตถุที่คุณผูกเหตุการณ์กับวัตถุที่ได้รับเหตุการณ์
Hafthor

18
น่าเสียดายที่ event.target ไม่อนุญาตให้เข้าถึงแอตทริบิวต์ที่กำหนดเอง ในการทำเช่นนั้นเราจะต้องใช้ $ (this) .attr ("organization: thingy") ;.
Zian Choy

16
@ZianChoy - ฉันไม่แน่ใจว่าสิ่งที่คุณหมายถึงโดย "แอตทริบิวต์ที่กำหนดเอง" แต่คุณสามารถใช้$(event.target)หากคุณต้องการวิธีการ jQuery $(event.target).attr("organisation:thingy");เช่น
nnnnnn

3
ฉันคิดว่ามันทราบว่าหากคุณต้องการเข้าถึงเป้าหมายของเหตุการณ์สำหรับจัดการกับ dom คุณสามารถทำสิ่งนี้: $ (event.target) .eq (0) จากนั้นคุณสามารถใช้วิธีการใดก็ได้ที่คุณมักใช้กับองค์ประกอบ dom เช่น $ (event.target) .eq (0) .find ('li') เป็นต้น
ไก่

31
โปรดทราบว่า: event.target เป็นรายการจริงที่คลิก ตัวอย่างเช่นถ้าคุณผูกเหตุการณ์การคลิกกับ div และภายใน div นั้นคือองค์ประกอบ P และ H2 - event.target จะส่งคืนองค์ประกอบ H2 หรือ P หากคลิกหนึ่งรายการ "นี่" จะคืน div ที่คุณแขวนเหตุการณ์ไว้โดยไม่คำนึงถึงองค์ประกอบลูกที่คุณคลิก
Rob

169

สำหรับการอ้างอิงลองสิ่งนี้! มันได้ผล!

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

16
@gemma โซลูชันอื่นไม่ทำงานสำหรับฉัน แต่อันนี้ไม่ได้ ขอบคุณที่มาสาย
HPWD

3
@dlackey มันเหมือนกันสำหรับฉันโซลูชันอื่นไม่ทำงานกับ firefox 12 ของฉัน แต่อันนี้ทำ ขอบคุณ
linuxatico

4
คำตอบยอดนิยมดูเหมือนจะไม่ทำงานเพื่อรับ ID ขององค์ประกอบใน SVG แบบฝัง $(this).attr("id");ทำ.
Matt Fletcher

2
โปรดทราบว่าหากเหตุการณ์การคลิกของคุณอยู่ในองค์ประกอบที่มีลูก ๆe.targetจะให้องค์ประกอบที่แน่นอนซึ่งทำให้เหตุการณ์นั้นถูกไล่ออกแม้ว่าจะเป็นเด็กแต่ทว่าthisจะให้องค์ประกอบที่เหตุการณ์นั้นเชื่อมโยงกับคุณ
sam

97

แม้ว่าจะกล่าวถึงในโพสต์อื่น ๆ ฉันต้องการที่จะสะกดออกมานี้:

$(event.target).id ไม่ได้กำหนด

$(event.target)[0].id ให้แอตทริบิวต์ id

event.target.id ยังให้แอตทริบิวต์ id

this.id ให้แอตทริบิวต์ id

และ

$(this).id ไม่ได้กำหนด

ความแตกต่างแน่นอนอยู่ระหว่างวัตถุ jQuery และวัตถุ DOM "id" เป็นคุณสมบัติ DOM ดังนั้นคุณต้องอยู่บนวัตถุองค์ประกอบ DOM เพื่อใช้งาน

(มันทำให้ฉันสะดุดดังนั้นมันอาจทำให้คนอื่นสะดุด)


1
สำหรับฉันevent.target.idไม่ได้ให้อะไรเลย!
artaxerxe

3
@artaxerxe นี่หมายความว่าองค์ประกอบที่คุณคลิกไม่มี id: P; ยังไม่ได้ใช้ jquery สำหรับสิ่งต่าง ๆ เช่นนี้ ... ใช้แอตทริบิวต์เหตุการณ์จาวาสคริปต์แทนทำให้เร็วขึ้น
HellBaby

$(event.target).attr('selector');ทำงานอย่างสมบูรณ์แบบสำหรับฉัน
Souleste

85

สำหรับกิจกรรมทั้งหมดไม่ จำกัด เพียงแค่ jQuery ที่คุณสามารถใช้ได้

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

ที่event.targetล้มเหลวมันตรงกับevent.srcElementสำหรับ IE เพื่อชี้แจงรหัสข้างต้นไม่จำเป็นต้อง jQuery แต่ยังทำงานร่วมกับ jQuery


10
ไม่ใช้ jQuery หมายความว่ามีการรันโค้ดน้อยกว่าในขณะที่รับผลลัพธ์ที่เหมือนกันตามที่แสดงไว้ด้านบน jQuery เป็นนามธรรมออกไป js นี่คือคำตอบ js โดยตรงและดูขนาด!
xrDDDD

ไม่ดีกว่าหรือเพียงแค่ใช้คำหลัก 'นี้' ซึ่งจะให้สิทธิ์การเข้าถึงคุณสมบัติขององค์ประกอบที่เรียกใช้กิจกรรมเสมอ
Morfidon

7
เพิ่งต้องขุดอึ jQuery ทั้งหมดเพื่อให้ได้คำตอบนี้ ขอบคุณ สิ่งนี้มีความเกี่ยวข้องมากกว่าที่เคย: needsmorejquery.com
gromit190

ยอดเยี่ยมจริงๆช่วยฉันด้วย
Barbz_YHOOL

59

คุณสามารถใช้(this)เพื่ออ้างอิงวัตถุที่ใช้ฟังก์ชัน

'this'เป็นDOMองค์ประกอบเมื่อคุณอยู่ภายในฟังก์ชั่นการโทรกลับ (ในบริบทของ jQuery) ตัวอย่างเช่นวิธีการคลิกโดยวิธีการคลิกแต่ละรายการเชื่อมโยง ฯลฯ

ที่นี่คุณสามารถเรียนรู้เพิ่มเติมได้ที่: http://remysharp.com/2007/04/12/jquerys-this-demystified/


3
หากคุณมีฟังก์ชั่นเช่น$(html).click()นี้จะส่งคืนวัตถุ html และไม่ใช่องค์ประกอบที่คลิก
TCHdvlp

28

ฉันสร้างตารางออกจากฐานข้อมูลแบบไดนามิกรับข้อมูลใน JSON และนำไปไว้ในตาราง แถวของตารางทุกแถวมีลักษณะเฉพาะIDซึ่งจำเป็นสำหรับการดำเนินการเพิ่มเติมดังนั้นหาก DOM เปลี่ยนแปลงคุณต้องมีแนวทางที่แตกต่าง:

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

2
โอ้ใช่นี่คือสิ่งที่ฉันกำลังมองหา นอกจากนี้ยังใช้งานได้เหมือนเดิมสำหรับ "เปิด" เนื่องจาก "ผู้รับมอบสิทธิ์" ถูกเลิกใช้ในขณะนี้ ฉันมีช่องทำเครื่องหมายที่สร้างจากข้อมูลฐานข้อมูลแบบไดนามิกและแน่นอนว่าพวกเขาทุกคนมีรหัสที่แตกต่างกันซึ่งฉันต้องใช้เพื่อทำบางสิ่งเมื่อคลิก ฉันใช้วิธีนี้ที่นี่เพื่อรับรหัสที่คลิกจริง ในโรงเรียนเก่า JS ฉันเพิ่งส่งรหัสจากช่องทำเครื่องหมายแต่ละรายการใน HTML ของช่องทำเครื่องหมาย แต่ไม่สามารถทำได้ด้วยรูปแบบตัวจัดการเหตุการณ์ jQuery
mikato

18

องค์ประกอบที่เป็นเหตุการณ์ที่เรามีในคุณสมบัติเหตุการณ์

event.currentTarget

เรารับวัตถุโหนด DOMซึ่งตั้งค่าตัวจัดการเหตุการณ์


โหนดที่ซ้อนกันส่วนใหญ่ซึ่งเริ่มกระบวนการเดือดปุด ๆ ที่เรามี

event.target

วัตถุเหตุการณ์เป็นคุณลักษณะแรกของตัวจัดการเหตุการณ์เสมอ:

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

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

});

ข้อมูลเพิ่มเติมเกี่ยวกับการมอบหมายกิจกรรมคุณสามารถอ่านได้ในhttp://maciejsikora.com/standard-events-vs-event-delegation/


11

องค์ประกอบที่มาเป็นวัตถุ jQuery ควรได้รับผ่าน

var $el = $(event.target);

สิ่งนี้ทำให้คุณได้รับแหล่งที่มาของการคลิกมากกว่าองค์ประกอบที่กำหนดฟังก์ชั่นการคลิกด้วย จะมีประโยชน์เมื่อเหตุการณ์คลิกอยู่บนวัตถุแม่ EG.a เหตุการณ์คลิกในแถวตารางและคุณต้องการเซลล์ที่ถูกคลิก

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



6

ในกรณีของตัวจัดการเหตุการณ์ที่ได้รับมอบหมายซึ่งคุณอาจมีสิ่งนี้:

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

และรหัส JS ของคุณเป็นเช่นนั้น:

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

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

คุณจะพบว่า itemId เป็นundefinedมากกว่าเพราะเนื้อหาของ LI นั้นถูกห่อหุ้มด้วย<span>ซึ่งหมายความว่า<span>อาจจะเป็นเป้าหมายของเหตุการณ์ คุณสามารถแก้ไขปัญหานี้ได้ด้วยการตรวจสอบขนาดเล็กเช่น:

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

หรือหากคุณต้องการเพิ่มความสามารถในการอ่านสูงสุด (และหลีกเลี่ยงการเรียกซ้ำซ้อน 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
    });
});

เมื่อใช้การมอบหมายเหตุการณ์.is()วิธีการนั้นมีค่ายิ่งสำหรับการตรวจสอบว่าเป้าหมายกิจกรรมของคุณ (เหนือสิ่งอื่นใด) เป็นสิ่งที่คุณต้องการ ใช้.closest(selector)เพื่อค้นหาแผนผัง DOM และใช้.find(selector)(โดยทั่วไปเชื่อมโยงกับ.first()ใน.find(selector).first()) เพื่อค้นหา คุณไม่จำเป็นต้องใช้.first()เมื่อใช้.closest()เนื่องจากจะส่งคืนองค์ประกอบบรรพบุรุษที่ตรงกันแรกเท่านั้นในขณะที่.find()ส่งคืนการสืบทอดที่ตรงกันทั้งหมด


1
ที่เป็นประโยชน์! ฉันปรับในกรณีของฉันเพราะฉันเพิ่งได้ <li id ​​= "numberID"> ดังนั้นฉันจึงใช้ itemId = $ target.attr ('id')
Zappescu

เพียงระมัดระวังเกี่ยวกับการใช้แอตทริบิวต์ ID แบบง่ายเนื่องจากทุก ID ต้องไม่ซ้ำกันในหน้านั้น ดังนั้นหากคุณจำเป็นต้องมีสองรายการเช่นนั้นในหน้านั้นด้วยเหตุผลบางอย่างคุณอาจจบลงด้วยรหัสซ้ำซึ่งเป็นสิ่งที่ไม่ดี นั่นเป็นเหตุผลที่ฉันมักจะใช้ data-id เพียงเพื่อพิสูจน์ในอนาคต
Isochronous


5

สิ่งนี้ใช้ได้กับz-indexพารามิเตอร์เหตุการณ์ที่สูงกว่าที่ระบุไว้ในคำตอบข้างต้น:

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

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

วิธีนี้คุณจะได้รับidองค์ประกอบ (ในตัวอย่างนี้li) เสมอ นอกจากนี้เมื่อคลิกที่องค์ประกอบลูกของผู้ปกครอง ..


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 ที่นี่


ฉันคิดว่านี่เป็นตัวเลือกที่ล้าสมัยนิดหน่อยที่จะทำให้มันใช้งานได้
Arnas Pečelis

2
@ ArnasPečelisล้าสมัยหรือไม่ ไม่ใช่แค่ไม่ใช่ jQuery
Kevin B

4

เพียงแค่ใช้การthisอ้างอิง

$(this).attr("id")

หรือ

$(this).prop("id")

ที่ดึงคุณลักษณะidจากองค์ประกอบที่click()ได้รับมอบหมาย หากคุณต้องการถ่ายโอนข้อมูลเพิ่มเติมไปยังวิธีการนั้นคุณต้องdata-some-id="<?php $someId; ?>"และจากนั้นคุณสามารถ `$ (นี่) .data (" some-id ") เพื่อดึงข้อมูล
Roland



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

@ManuelMannhardt ไม่มีลิงก์ในคำตอบนี้เป็นคำตอบแบบรหัสเท่านั้นไม่ใช่คำตอบแบบเชื่อมโยงเท่านั้น
27823

1

คุณสามารถใช้ฟังก์ชั่นเพื่อรับ ID และค่าสำหรับรายการที่เปลี่ยนแปลง (ในตัวอย่างของฉันฉันใช้แท็กเลือก

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

0

ฉันทำงานกับ

การเติมข้อความอัตโนมัติ jQuery

ฉันพยายามค้นหาeventตามที่อธิบายไว้ข้างต้น แต่เมื่อฟังก์ชั่นการร้องขอเริ่มทำงานดูเหมือนว่าจะไม่สามารถใช้งานได้ ฉันเคยthis.element.attr("id")ได้รับ ID ขององค์ประกอบแทนและดูเหมือนว่าจะทำงานได้ดี


0

ในกรณีของ Angular 7.x คุณจะได้รับองค์ประกอบพื้นฐานและรหัสหรือคุณสมบัติ

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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.