Получение идентификатора элемента, который вызвал событие

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>

За исключением, конечно, что переменная testдолжна содержать идентификатор "aaa", если событие вызывается из первой формы, и "bbb"если событие вызывается из второй формы.

Joda
источник
25
Ваш пример немного странный. Вы прикрепляете событие щелчка к «а», но у вас нет привязок. Измените его на $ ('input.title'). Click (...) будет немного понятнее для будущих читателей вашего вопроса.
Джейсон Мур
3
Вы можете использовать event.target.idв обработчике событий, чтобы получить идентификатор элемента, который вызвал событие.
Ильяс

Ответы:

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");
    });
});
samjudson
источник
12
Вот Это Да! Спасибо. Не понимал, что jQuery так хорошо это абстрагирует. Ты жжешь! Я бы подумал, что все равно будет разница между (this) и (event.target) - быть объектом, с которым вы связали событие, и объектом, который получил событие.
Hafthor
18
К сожалению, event.target не разрешает доступ к своим пользовательским атрибутам. Для этого нужно использовать $ (this) .attr ("organization: thingy") ;.
Зиан Чой
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 - это реальный элемент, по которому щелкают. Если вы, например, связываете событие click с div, и внутри этого div есть элемент P и элемент H2 - event.target вернет элемент H2 или P, если щелкнуть один из них. «this» действительно вернет div, на котором вы повесили событие, независимо от того, какой дочерний элемент вы щелкнули.
Роб
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
Имейте в виду, что если ваше событие click находится на элементе с e.targetдочерними элементами, вы получите точный элемент, вызвавший событие, даже если оно было дочерним, тогда как thisвам будет предоставлен элемент, к которому прикреплено событие.
Самрап
97

Хотя это упоминается в других постах, я хотел бы изложить это:

$(event.target).id не определено

$(event.target)[0].id дает атрибут id.

event.target.id также дает атрибут id.

this.id дает атрибут id.

а также

$(this).id не определено

Различия, конечно, между объектами jQuery и объектами DOM. «id» - это свойство DOM, поэтому вы должны быть в объекте элемента DOM, чтобы использовать его.

(Это споткнуло меня, так что, вероятно, споткнуло кого-то еще)

DSCH
источник
1
мне event.target.idничего не дает!
Артаксеркс
3
@artaxerxe это означает, что у выбранного вами элемента нет идентификатора: P; также не используйте jquery для такого рода вещей .... используйте атрибуты 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
не лучше ли просто использовать ключевое слово this, которое всегда даст вам доступ к свойствам элемента, вызвавшего событие?
Морфидон
7
Просто нужно было копаться во всем дерьме jQuery, чтобы получить этот ответ. Спасибо. Это более актуально, чем когда-либо: needsmorejquery.com
gromit190
здорово, очень помогло мне
Barbz_YHOOL
59

Вы можете использовать (this)для ссылки на объект, который вызвал функцию.

'this'является элементом DOM, когда вы находитесь внутри функции обратного вызова (в контексте jQuery), например, вызывается методами click, each, bind и т. д.

Здесь вы можете узнать больше: http://remysharp.com/2007/04/12/jquerys-this-demysified/

Эспоо
источник
3
если у вас есть функция, подобная $(html).click()(this), вернет объект html, а не элемент, по
которому
28

Я динамически генерирую таблицу из базы данных, получаю данные в формате JSON и помещаю их в таблицу. Каждая строка таблицы имеет уникальный ID, который необходим для дальнейших действий, поэтому, если DOM изменяется, вам нужен другой подход:

$("table").delegate("tr", "click", function() {
   var id=$(this).attr('id');
   alert("ID:"+id);  
});
головня
источник
2
Ах да, это то, что я искал. Это также работает для более новых «вкл», так как «делегат» теперь устарел. У меня были флажки, созданные динамически из данных БД, и, конечно, все они имели разные идентификаторы, которые мне нужно было использовать, чтобы что-то делать при нажатии. Я использовал этот метод здесь, чтобы узнать, какой идентификатор был фактически нажат. В JS старой школы я просто передавал идентификатор из каждого флажка в HTML-коде флажка, но не могу сделать это таким образом с моделью обработчика событий jQuery.
Микато
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);

Это дает вам источник щелчка, а не элемент, которому была назначена функция щелчка. Может быть полезно, когда событие click находится в родительском объекте EG.a событие click в строке таблицы, и вам нужна ячейка, по которой щелкнули

$("tr").click(function(event){
    var $td = $(event.target);
});
Morvael
источник
7

Вы можете попробовать использовать:

$('*').live('click', function() {
 console.log(this.id);
 return false;
});
Darius
источник
7

это работает с большинством типов элементов:

$('selector').on('click',function(e){
    log(e.currentTarget.id);
    });
Cris
источник
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 обернуто в a <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').
Заппеску
Просто будьте осторожны при использовании простого атрибута идентификатора, так как каждый идентификатор должен быть уникальным на этой странице. Поэтому, если вам по какой-то причине необходимо иметь два таких списка на этой странице, вы, скорее всего, получите дубликаты идентификаторов, что плохо. Вот почему я склонен всегда использовать data-id только для будущего.
Изохронный
6

Использовать можно Использовать .on событие

  $("table").on("tr", "click", function() {
                    var id=$(this).attr('id');
                    alert("ID:"+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 здесь .

shmuli
источник
Я думаю, что это немного устаревший вариант, чтобы заставить его работать
Арнас Печелис
2
@ ArnasPečelis устарел? нет, только не jQuery.
Кевин Б.
4

Просто используйте thisссылку

$(this).attr("id")

или

$(this).prop("id")
Ошибка 404
источник
Это выбирает атрибут idиз элемента, на click()который был назначен. Если вам нужно передать больше данных этому методу, вам нужно, data-some-id="<?php $someId; ?>"а затем вы можете `$ (this) .data (" some-id ") получить его.
Роланд
3

this.element.attr("id") отлично работает в IE8.

vml19
источник
2

Обе эти работы,

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

а также

alert(this.id);
Moji
источник
2
$(".classobj").click(function(e){
    console.log(e.currentTarget.id);
})
chings228
источник
@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));
                   }
               );
Xeon
источник
0

Я работаю с

JQuery Автозаполнение

Я пытался найти, eventкак описано выше, но когда срабатывает функция запроса, она кажется недоступной. Я использовал this.element.attr("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>
Дэвид Дехган
источник