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

846

Есть ли способ получить идентификатор элемента, который запускает событие?

Я думаю, что-то вроде:

<html>
  <head>
    <script type="text/javascript" src="starterkit/jquery.js"></script>
    <script type="text/javascript">
      $(document).ready(function () {
        $("a").click(function () {
          var test = caller.id;
          alert(test.val());
        });
      });
    </script>
  </head>
  <body>
    <form class="item" id="aaa">
      <input class="title"></input>
    </form>
    <form class="item" id="bbb">
      <input class="title"></input>
    </form>
  </body>

</html>

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

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

17 ответов

1152
Лучший ответ

В 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 так хорошо это абстрагирует. Ты жжешь! Я думаю, что все равно будет разница между (this) и (event.target) - быть объектом, с которым вы связали событие, и объектом, который получил событие.
  • 16
    К сожалению, event.target не разрешает доступ к своим пользовательским атрибутам. Для этого нужно использовать $ (this) .attr ("organization: thingy") ;.
Показать ещё 11 комментариев
147

Для справки попробуйте это! Он работает!

jQuery("classNameofDiv").click(function() {
    var contentPanelId = jQuery(this).attr("id");
    alert(contentPanelId);
});
  • 16
    @gemma Другое решение не работает для меня, но это сработало. Спасибо за опоздание.
  • 3
    @dlackey это то же самое для меня, другое решение не работает на моем Firefox 12, но это сработало. Спасибо
Показать ещё 3 комментария
84

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

$(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 ничего не дает!
  • 3
    @artaxerxe это означает, что у выбранного вами элемента нет идентификатора: P; также не используйте jquery для такого рода вещей .... используйте атрибуты javascript для события, потому что это быстрее.
72

Для всех событий, не ограничиваясь только jQuery, вы можете использовать

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

Где event.target не работает, он возвращается на event.srcElement для IE. Для уточнения вышеуказанного кода не требуется jQuery, но также работает с jQuery.

  • 10
    Отказ от использования jQuery означает, что при получении точно такого же результата выполняется меньше строк кода, как показано выше. JQuery абстрагируется от JS. Это прямой ответ JS, и посмотрите на размер!
  • 0
    не лучше ли просто использовать ключевое слово this, которое всегда даст вам доступ к свойствам элемента, вызвавшего событие?
Показать ещё 1 комментарий
61

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

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

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

  • 2
    если у вас есть такая функция, как $(html).click() (this) вернет объект html, а не элемент, по $(html).click() щелкнули
25

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

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

Элемент, который активировал событие, которое мы имеем в событии.

event.currentTarget

Мы получаем объект DOM node, на который был установлен обработчик событий.


Наиболее вложенные node, которые начали процесс барботирования, который мы имеем в

event.target

Объект события всегда является первым атрибутом обработчика события, например:

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

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

});

Подробнее о делегировании событий Вы можете прочитать в http://maciejsikora.com/standard-events-vs-event-delegation/

10

Исходный элемент как объект jQuery должен быть получен через

var $el = $(event.target);

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

$("tr").click(function(event){
    var $td = $(event.target);
});
  • 1
    Остерегайтесь здесь - проверьте мой комментарий о принятом ответе ...
7

Вы можете попробовать:

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

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

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

В случае делегированных обработчиков событий, где у вас может быть что-то вроде этого:

<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').
  • 0
    Просто будьте осторожны при использовании простого атрибута идентификатора, так как каждый идентификатор должен быть уникальным на этой странице. Поэтому, если вам по какой-то причине нужно иметь два таких списка на этой странице, вы, скорее всего, получите дубликаты идентификаторов, что плохо. Вот почему я склонен всегда использовать data-id только для будущего.
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 здесь.

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

Это работает с более высоким z-index, чем параметр события, упомянутый в приведенных выше ответах:

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

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

Таким образом вы всегда получите id элемента (в этом примере li). Также при нажатии на дочерний элемент родителя.

3

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

2

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

$(this).attr("id")

или

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

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

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

и

alert(this.id);
0

Вы можете использовать эту функцию для получения идентификатора и значения для измененного элемента (в моем примере я использовал тег Select.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню