Lấy ID của phần tử đã tạo ra một sự kiện


969

Có cách nào để lấy ID của phần tử kích hoạt sự kiện không?

Tôi đang nghĩ một cái gì đó như:

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

Tất nhiên ngoại trừ var testnên chứa id "aaa", nếu sự kiện được kích hoạt từ hình thức đầu tiên và "bbb", nếu sự kiện được bắn từ hình thức thứ hai.


25
Ví dụ của bạn hơi kỳ quặc. Bạn đang đính kèm một sự kiện nhấp chuột vào 'a', nhưng không có bất kỳ neo nào. Thay đổi nó thành $ ('input.title'). Click (...) sẽ rõ ràng hơn một chút cho những người đọc câu hỏi trong tương lai của bạn.
Jason Moore

3
Bạn có thể sử dụng event.target.idtrong trình xử lý sự kiện để lấy id của phần tử đã tạo ra một sự kiện.
Ilyas karim

Câu trả lời:


1293

Trong jQuery event.targetluôn đề cập đến phần tử đã kích hoạt sự kiện, trong đó eventtham số được truyền cho hàm. http://api.jquery.com/carget/events/event-object/

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

Cũng lưu ý rằng thisnó cũng sẽ hoạt động, nhưng nó không phải là một đối tượng jQuery, vì vậy nếu bạn muốn sử dụng một hàm jQuery trên nó thì bạn phải tham khảo nó như $(this), ví dụ:

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

12
Ồ Cảm ơn. Không nhận ra rằng jQuery đã trừu tượng hóa điều đó rất tốt. Bạn đá! Tôi nghĩ rằng nó vẫn sẽ có sự khác biệt giữa (này) và (event.target) - là đối tượng bạn ràng buộc sự kiện so với đối tượng đã nhận sự kiện.
Hafthor

18
Thật không may, event.target không cho phép truy cập vào các thuộc tính tùy chỉnh của nó. Để làm điều đó, người ta phải sử dụng $ (this) .attr ("tổ chức: thingy");.
Zian Choy

16
@ZianChoy - Tôi không chắc ý của bạn về "thuộc tính tùy chỉnh", nhưng bạn có thể sử dụng $(event.target)nếu bạn cần một phương thức jQuery, ví dụ : $(event.target).attr("organisation:thingy");.
nnnnnn

3
Tôi nghĩ lưu ý rằng nếu bạn cần quyền truy cập vào mục tiêu sự kiện để thao túng dom, bạn có thể làm một cái gì đó như thế này: $ (event.target) .eq (0). Sau đó, bạn có thể sử dụng bất kỳ phương thức nào bạn thường sử dụng với phần tử dom như $ (event.target) .eq (0) .find ('li') chẳng hạn.
Dậu

31
Xin lưu ý rằng: event.target là mục thực sự đang được nhấp. Ví dụ: nếu bạn liên kết một sự kiện nhấp chuột với div và bên trong div đó là một phần tử P và H2 - event.target sẽ trả về phần tử H2 hoặc P, nếu nhấp vào một trong số đó. "Điều này" sẽ thực sự trả lại div mà bạn đã treo sự kiện, bất kể bạn đã nhấp vào yếu tố con nào.
Cướp

169

Để tham khảo, hãy thử điều này! Nó hoạt động!

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

16
@gemma Giải pháp khác không hiệu quả với tôi nhưng giải pháp này thì có. Cảm ơn vì đã đến muộn.
HPWD

3
@dlackey đối với tôi cũng vậy, giải pháp khác không hoạt động trên firefox 12 của tôi, nhưng giải pháp này thì có. Cảm ơn
linuxatico

4
Câu trả lời hàng đầu dường như không hoạt động để lấy ID của một phần tử trong một SVG được nhúng. $(this).attr("id");làm.
Matt Fletcher

2
Hãy nhớ rằng nếu sự kiện nhấp chuột của bạn là trên một yếu tố có trẻ em, e.targetsẽ cung cấp cho bạn yếu tố chính xác khiến sự kiện bị hủy ngay cả khi đó là trẻ em, trong khi đó thissẽ cung cấp cho bạn yếu tố mà sự kiện được đính kèm.
samrap

97

Mặc dù nó được đề cập trong các bài viết khác, tôi muốn đánh vần điều này:

$(event.target).id không định nghĩa được

$(event.target)[0].id đưa ra thuộc tính id.

event.target.id cũng đưa ra thuộc tính id.

this.id đưa ra thuộc tính id.

$(this).id không định nghĩa được.

Tất nhiên, sự khác biệt là giữa các đối tượng jQuery và các đối tượng DOM. "id" là thuộc tính DOM, do đó bạn phải ở trên đối tượng phần tử DOM để sử dụng nó.

(Nó làm tôi vấp ngã, vì vậy nó có thể vấp phải người khác)


1
với tôi, event.target.idkhông cho gì cả!
artaxerxe

3
@artaxerxe điều này có nghĩa là phần tử được nhấp của bạn không có id: P; cũng không sử dụng jquery cho loại điều này .... sử dụng các thuộc tính javascript sự kiện thay vì nó nhanh hơn.
HellBaby

$(event.target).attr('selector');làm việc hoàn hảo cho tôi
Souleste

85

Đối với tất cả các sự kiện, không giới hạn chỉ với jQuery, bạn có thể sử dụng

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

Trường hợp event.targetkhông thành công, nó rơi trở lại event.srcElementcho IE. Để làm rõ đoạn mã trên không yêu cầu jQuery mà còn hoạt động với jQuery.


10
Không sử dụng jQuery có nghĩa là ít dòng mã hơn được chạy trong khi nhận được cùng một kết quả, như được hiển thị ở trên. jQuery tóm tắt đi js. Đây là câu trả lời js trực tiếp, và nhìn vào kích thước!
xrDĐD

không phải tốt hơn là chỉ sử dụng từ khóa 'này' mà sẽ luôn cung cấp cho bạn quyền truy cập vào các thuộc tính của phần tử đã gọi sự kiện đó sao?
Morfidon

7
Chỉ cần đào qua tất cả các crap jQuery để có được câu trả lời này. Cảm ơn. Điều này có liên quan hơn bao giờ hết: Needmorejquery.com
gromit190

tuyệt vời, thực sự đã giúp tôi
Barbz_YHOOL

59

Bạn có thể dùng (this) để tham chiếu đối tượng đã kích hoạt hàm.

'this'là một DOM phần tử khi bạn ở trong hàm gọi lại (trong ngữ cảnh của jQuery), ví dụ, được gọi bằng các phương thức nhấp, mỗi, liên kết, v.v.

Đây là nơi bạn có thể tìm hiểu thêm: http://remysharp.com/2007/04/12/jquerys-this-demystified/


3
nếu bạn có một hàm như $(html).click()(cái này) sẽ trả về đối tượng html chứ không phải phần tử được nhấp
TCHdvlp

28

Tôi tự động tạo một bảng ra khỏi cơ sở dữ liệu, nhận dữ liệu trong JSON và đặt nó vào một bảng. Mỗi hàng trong bảng có một duy nhất ID, cần thiết cho các hành động tiếp theo, vì vậy, nếu DOM bị thay đổi, bạn cần một cách tiếp cận khác:

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

2
Ồ vâng, đây là những gì tôi đang tìm kiếm. Nó cũng hoạt động tương tự cho "bật" mới hơn vì "đại biểu" hiện không được dùng nữa. Tôi đã có các hộp kiểm được tạo động từ dữ liệu DB và tất nhiên tất cả chúng đều có các ID khác nhau mà tôi cần sử dụng để làm gì đó khi nhấp vào. Tôi đã sử dụng phương pháp này ở đây để lấy ID nào thực sự được nhấp. Ở trường học cũ, tôi chỉ chuyển id từ mỗi hộp kiểm trong HTML của hộp kiểm, nhưng không thể làm như vậy với mô hình xử lý sự kiện jQuery.
mikato

18

Yếu tố mà sự kiện chúng ta có trong tài sản sự kiện

event.currentTarget

Chúng tôi nhận được đối tượng nút DOM trên đó đã được thiết lập xử lý sự kiện.


Hầu hết các nút lồng nhau bắt đầu quá trình sủi bọt chúng ta có

event.target

Đối tượng sự kiện luôn là thuộc tính đầu tiên của trình xử lý sự kiện, ví dụ:

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

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

});

Tìm hiểu thêm về sự kiện ủy nhiệm Bạn có thể đọc trong http://maciejsikora.com/st Chuẩn- event-vs-event- devegation /


11

Phần tử nguồn dưới dạng đối tượng jQuery nên được lấy thông qua

var $el = $(event.target);

Điều này giúp bạn có được nguồn nhấp chuột, chứ không phải là yếu tố mà chức năng nhấp được gán. Có thể hữu ích khi sự kiện nhấp vào đối tượng cha mẹ EG.a sự kiện nhấp chuột trên một hàng của bảng và bạn cần ô được nhấp

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

7

Bạn có thể thử sử dụng:

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

7

điều này hoạt động với hầu hết các loại yếu tố:

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

6

Trong trường hợp xử lý sự kiện được ủy quyền, nơi bạn có thể có một cái gì đó như thế này:

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

và mã JS của bạn như vậy:

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

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

Nhiều khả năng bạn sẽ thấy rằng itemId là undefined, vì nội dung của LI được gói trong một <span>, có nghĩa là <span>có thể sẽ là mục tiêu sự kiện. Bạn có thể khắc phục điều này bằng một tấm séc nhỏ, như vậy:

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

Hoặc, nếu bạn muốn tối đa hóa khả năng đọc (và cũng tránh lặp lại các cuộc gọi gói jQuery không cần thiết):

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

Khi sử dụng phân quyền sự kiện, .is()phương thức này là vô giá để xác minh rằng mục tiêu sự kiện của bạn (trong số những thứ khác) thực sự là những gì bạn cần. Sử dụng .closest(selector)để tìm kiếm cây DOM và sử dụng .find(selector)(thường được kết hợp với .first(), như trong .find(selector).first()) để tìm kiếm nó. Bạn không cần sử dụng .first()khi sử dụng .closest(), vì nó chỉ trả về phần tử tổ tiên phù hợp đầu tiên, trong khi .find()trả về tất cả các hậu duệ phù hợp.


1
Hữu ích! Tôi đã điều chỉnh trong trường hợp của mình vì tôi chỉ có một <li id ​​= "numberID"> đơn giản và vì vậy tôi đã sử dụng itemId = $ target.attr ('id').
Zappescu

Chỉ cần cẩn thận về việc sử dụng một thuộc tính ID đơn giản, vì mỗi ID cần phải là duy nhất trên trang đó. Vì vậy, nếu bạn vì một số lý do cần phải có hai danh sách như vậy trên trang đó, bạn có thể sẽ gặp phải các ID trùng lặp, đó là một điều tồi tệ. Đó là lý do tại sao tôi có xu hướng luôn sử dụng id dữ liệu chỉ để chứng minh trong tương lai.
bộ

6

Sử dụng có thể Sử dụng sự kiện .on

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

5

Điều này hoạt động trên mức cao z-indexhơn tham số sự kiện được đề cập trong các câu trả lời ở trên:

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

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

Bằng cách này, bạn sẽ luôn có được phần idtử (trong ví dụ này li). Ngoài ra khi nhấp vào một yếu tố con của cha mẹ ..


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

Làm việc với JSFiddle tại đây .


Tôi nghĩ rằng đây là một chút giống như tùy chọn lỗi thời để làm cho nó hoạt động
Arnas Pečelis

2
@ ArnasPečelis đã lỗi thời? không, không phải jQuery.
Kevin B

4

Chỉ cần sử dụng thistài liệu tham khảo

$(this).attr("id")

hoặc là

$(this).prop("id")

Điều đó tìm nạp thuộc tính idtừ phần tử click()đã được gán. Nếu bạn cần chuyển thêm dữ liệu sang phương thức đó, bạn cần data-some-id="<?php $someId; ?>"và sau đó bạn có thể `$ (this) .data (" some-id ") để truy xuất nó.
Roland

3

this.element.attr("id") hoạt động tốt trong IE8.


2

Cả hai công việc này,

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

alert(this.id);

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

@ManuelMannhardt không có liên kết nào trong câu trả lời này, đó là câu trả lời chỉ có mã, không phải câu trả lời chỉ liên kết
barbsan

1

Bạn có thể sử dụng hàm để lấy id và giá trị cho mục đã thay đổi (trong ví dụ của tôi, tôi đã sử dụng thẻ Chọn.

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

0

Tôi đang làm việc với

Tự động hoàn thành jQuery

Tôi đã cố gắng tìm kiếm eventnhư mô tả ở trên, nhưng khi chức năng yêu cầu kích hoạt thì dường như không có sẵn. Tôi đã sử dụng this.element.attr("id")để lấy ID của phần tử thay vào đó và nó có vẻ hoạt động tốt.


0

Trong trường hợp Angular 7.x, bạn có thể lấy phần tử gốc và id hoặc thuộc tính của nó.

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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.