Отримання ідентифікатора елемента, який викликав подію


969

Чи є спосіб отримати ідентифікатор елемента, що викликає подію?

Я думаю про щось на кшталт:

$(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повинен містити ідентифікатор "aaa", якщо подія запускається з першої форми, і "bbb"якщо подія запускається з другої форми.


25
Ваш приклад трохи дивний. Ви пов'язуєте подію натискання на "a", але не маєте якірних якорів. Змінення його на $ ('input.title'). Натисніть (...) буде трохи зрозумілішим для майбутніх читачів вашого питання.
Джейсон Мур

3
Ви можете використовувати event.target.idв обробці подій, щоб отримати ідентифікатор елемента, який запустив подію.
Ілляс карим

Відповіді:


1292

У 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) - будучи об'єктом, ви пов'язуєте подію з об'єктом, який отримав подію.
Хафтор

18
На жаль, event.target не дозволяє отримати доступ до своїх спеціальних атрибутів. Для цього потрібно використовувати $ (this) .attr ("організація: речі") ;.
Zian Choy

16
@ZianChoy - Я не зовсім впевнений , що ви маєте в виду під «призначеними для користувача атрибутами», але ви можете використовувати , $(event.target)якщо вам потрібен метод JQuery, наприклад, $(event.target).attr("organisation:thingy");.
nnnnnn

3
Я думаю, що слід зазначити, що якщо вам потрібен доступ до цілі події для маніпулювання домом, ви можете зробити щось подібне: $ (event.target) .eq (0). Потім ви можете використовувати будь-який метод, який ви зазвичай використовуєте з елементом dom, наприклад $ (event.target) .eq (0) .find ('li').
Півень

31
Зауважте, що: event.target - це реальний елемент, який натискається. Наприклад, якщо ви пов'язуєте подію клацання з дівом, і всередині цього діва є P та H2-елемент - event.target поверне елемент H2 або P, якщо натиснув один із них. "this" дійсно поверне діва, на яку ви повісили подію, незалежно від того, який дочірній елемент ви натиснули.
Роб

169

Для довідки спробуйте це! Це працює!

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

16
@gemma Інше рішення не працювало для мене, але це було. Дякуємо, що запізнилися.
HPWD

3
@dlackey для мене це те саме, інше рішення не працювало на моєму Firefox 12, але це було. Спасибі
linuxatico

4
Верхня відповідь, здається, не працює для отримання ідентифікатора елемента у вбудованому SVG. $(this).attr("id");робить.
Метт Флетчер

2
Майте на увазі, що якщо ваша подія клацання знаходиться на елементі з дітьми, e.targetви отримаєте точний елемент, який спричинив звільнення події, навіть якщо це була дитина, тоді як thisдасть вам елемент, до якого подія додається.
samrap

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, це означає, що у вибраного вами елемента немає ідентифікатора: P; також не використовуйте jquery для подібних речей .... використовуйте атрибути JavaScript JavaScript натомість, тому що це швидше.
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

хіба не краще просто використати ключове слово "це", яке завжди надасть вам доступ до властивостей елемента, який викликав подію?
Морфідон

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
О так, це я шукав. Це також працює для нових "on", оскільки "делегат" тепер застарілий. У мене були створені динамічні прапорці з даних БД, і, звичайно, всі вони мали різні ідентифікатори, які мені потрібно було використати, щоб зробити щось при натисканні. Тут я використовував цей метод, щоб отримати, на який ідентифікатор насправді було натиснуто. У старій школі 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.а подія клацання в рядку таблиці, і вам потрібна клітинка, на яку було натиснуто

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

7

Ви можете спробувати використовувати:

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

7

це працює з більшістю типів елементів:

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

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').
Заппеску

Будьте обережні, використовуючи простий атрибут ідентифікатора, оскільки кожен ідентифікатор повинен бути унікальним на цій сторінці. Тож якщо вам з якоїсь причини потрібні два такі списки на цій сторінці, ви, ймовірно, закінчите дублікати ідентифікаторів, що погано. Ось чому я схильний завжди використовувати ідентифікатор даних лише для забезпечення майбутнього.
Ізохронний


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 тут .


Я думаю, це дещо схоже на застарілий варіант, щоб змусити його працювати
Арнас Печеліс

2
@ ArnasPečelis застарів? ні, тільки не jQuery.
Кевін Б

4

Просто використовуйте thisпосилання

$(this).attr("id")

або

$(this).prop("id")

Це отримує атрибут idз елемента, якому click()було призначено. Якщо вам потрібно перенести більше даних до цього методу, вам потрібно, data-some-id="<?php $someId; ?>"і тоді ви можете `$ (this) .data (" some-id ") отримати його.
Роланд



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

@ManuelMannhardt у цій відповіді немає посилання, це відповідь лише для коду, а не відповідь лише на посилання
barbsan

1

Ви можете використовувати функцію, щоб отримати ідентифікатор та значення для зміненого елемента (у моєму прикладі я використав тег Select.

              $('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")замість цього ідентифікатор елемента, і він, здається, працює добре.


0

У випадку з кутом 7.x ви можете отримати власний елемент та його id чи властивості.

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.