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

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

Я думаю примерно так:

$(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", если событие запускается из второй формы.

Ваш пример немного странный. Вы прикрепляете событие щелчка к 'a', но не имеете привязок. Если вы измените его на $ ('input.title'). Click (...), это будет немного понятнее для будущих читателей вашего вопроса.

Jason Moore 12.11.2008 23:43

Вы можете использовать event.target.id в обработчике событий, чтобы получить идентификатор элемента, вызвавшего событие.

Ilyas karim 05.10.2017 14:32

Вы можете взять event как аргумент в вашей функции обратного вызова, а затем использовать event.target.id

Supratim Samantray 04.09.2020 22:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1 016
3
1 363 096
23
Перейти к ответу Данный вопрос помечен как решенный

Ответы 23

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

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

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

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

TCHdvlp 28.06.2013 20:16
Ответ принят как подходящий

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

Ух ты! Спасибо. Не осознавал, что jQuery так хорошо абстрагирует это. Ты жжешь! Я бы подумал, что разница между (this) и (event.target) все равно будет - быть объектом, с которым вы связали событие, и объектом, получившим событие.

Hafthor 08.09.2008 21:12

К сожалению, event.target не разрешает доступ к своим настраиваемым атрибутам. Для этого нужно использовать $ (this) .attr ("organization: thingy") ;.

Zian Choy 08.09.2009 11:00

@ZianChoy - я не совсем понимаю, что вы имеете в виду под «настраиваемыми атрибутами», но вы можете использовать $(event.target), если вам нужен метод jQuery, например $(event.target).attr("organisation:thingy");.

nnnnnn 25.06.2012 15:05

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

Rooster 23.01.2013 23:08

Обратите внимание, что: event.target - это элемент настоящий, по которому щелкают. Если вы, например, привязываете событие щелчка к div, и внутри этого div есть элемент P и H2 - event.target вернет элемент H2 или P, если щелкнуть один из них. «this» действительно вернет div, на котором вы повесили событие, независимо от того, на какой дочерний элемент вы щелкнули.

Rob 30.05.2014 01:03

Я использую event.currentTarget.id, event.target.id также может быть дочерним элементом

radtek 18.10.2014 20:27

Иногда событие было инициировано неочевидным элементом, тогда вы можете попробовать использовать этот var target = e.originalEvent.explicitOriginalTarget || e.currentTarget[e.currentTarget.length - 1] || e.target;.

powtac 06.01.2016 20:04

Обратите внимание, как уже упоминалось @RobQuist выше, e.target на самом деле является элементом на котором, когда произошло событие, и не всегда может быть элементом, который запущен событие. Таким образом, автору может потребоваться изменить предложение В jQuery event.target всегда ссылается на элемент, который вызвал событие, где 'event', поскольку могут быть случаи, когда оно неверно. Кстати, во всех случаях e.currentTarget относится к элементу, к которому был прикреплен обработчик событий. Прочтите это: developer.mozilla.org/en-US/docs/Web/API/Event/currentTarget

kabirbaidhya 13.05.2016 14:12

Предупреждение для тех, кто использует ES6. Стрелочные функции не устанавливают this. Итак, в основном не используйте здесь стрелочную функцию.

thomas-peter 01.08.2016 06:16

@tomwrong: Ну, если вместо этого вы используете event.target или event.currentTarget, вы можете использовать this для чего-то еще. Тогда стрелочная функция имеет смысл.

T.J. Crowder 26.09.2016 11:13

После сумасшедших часов попыток я обнаружил, что если вы используете $(document).bind('click','myelement,function(event){...}'), то $(this) вернет document, а не myelement.

Ahmad Maleki 09.11.2016 09:32

По-видимому, это решение не работает для переключателей и раскрывающихся списков.

Chiwda 08.09.2017 19:00

Нет, this не всегда работает, иногда он не определен в зависимости от контекста; просто еще одна причина, по которой JavaScript сбился с пути.

Jonathan Neufeld 20.04.2020 20:10

Спасибо, это сработало для меня. По-видимому, «Когда вы выполняете запрос DOM через jQuery, например $ ('class-name'), он активно ищет этот элемент в DOM и возвращает этот элемент со всеми присоединенными методами прототипа jQuery. Когда вы находитесь в цепочке или событии jQuery вам не нужно повторно запускать запрос DOM, вы можете использовать контекст $ (this) ". Автор: stackoverflow.com/users/185672/phil

chobela 22.06.2020 11:18

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

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

@gemma Другое решение не сработало для меня, но это сработало. Спасибо, что опоздали.

HPWD 25.04.2012 21:56

@dlackey для меня то же самое, другое решение не сработало на моем firefox 12, но это сработало. Спасибо

linuxatico 24.05.2012 16:43

Верхний ответ, похоже, не работает для получения идентификатора элемента во встроенном SVG. $(this).attr("id"); делает.

Matt Fletcher 26.06.2014 13:21

Имейте в виду, что если ваше событие click находится на элементе с дочерними элементами, e.target предоставит вам точный элемент, который вызвал запуск события, даже если это был дочерний элемент, тогда как this предоставит вам элемент, к которому привязано событие.

samrap 13.07.2016 00:37

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

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

Ах да, это то, что я искал. Он также работает так же для более нового «on», поскольку «делегат» теперь устарел. У меня были флажки, созданные динамически из данных БД, и, конечно же, все они имели разные идентификаторы, которые мне нужно было использовать, чтобы что-то делать при нажатии. Я использовал этот метод здесь, чтобы узнать, какой идентификатор был фактически нажат. В старой школе JS я просто передавал идентификатор из каждого флажка в HTML-коде флажка, но не могу сделать это таким образом с помощью модели обработчика событий jQuery.

mikato 14.09.2016 18:32

хороший ответ здесь

Humphrey 11.12.2020 01:10

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

var $el = $(event.target);

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

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

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

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

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

Отказ от использования jQuery означает, что выполняется меньше строк кода при получении точно такого же результата, как показано выше. jQuery абстрагирует js. Это прямой ответ js, и посмотрите на размер!

xrDDDD 30.07.2013 22:13

не лучше ли просто использовать ключевое слово this, которое всегда дает вам доступ к свойствам элемента, вызвавшего событие?

Morfidon 29.04.2015 03:37

Просто нужно было покопаться во всей ерунде jQuery, чтобы добраться до этого ответа. Спасибо. Это актуально как никогда: needmorejquery.com

birgersp 17.06.2016 10:39

круто, действительно помогло мне

Barbz_YHOOL 28.11.2019 02:34

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

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

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

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

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

event.target.id также предоставляет атрибут id.

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

и

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

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

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

мне event.target.id ничего не дает!

artaxerxe 02.10.2013 10:43

@artaxerxe это означает, что у вашего элемента, по которому был сделан щелчок, нет идентификатора: P; также не используйте jquery для такого рода вещей .... используйте атрибуты javascript события вместо этого, чтобы он работал быстрее.

HellBaby 19.12.2014 11:04

$(event.target).attr('selector'); у меня отлично сработал.

Souleste 09.07.2019 19:14

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

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

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

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

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

Оба они работают,

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

и

alert(this.id);

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 22.10.2015 23:24

@ ArnasPečelis устарело? нет, только не jQuery.

Kevin B 26.04.2016 23:25

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

<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() возвращает всех соответствующих потомков.

Полезный! Я скорректировал свой случай, потому что у меня есть простой <li id ​​= "numberID">, поэтому я использовал itemId = $ target.attr ('id').

Zappescu 06.10.2015 19:25

Просто будьте осторожны при использовании простого атрибута идентификатора, поскольку каждый идентификатор на этой странице должен быть уникальным. Так что, если вам по какой-то причине нужно иметь два таких списка на этой странице, вы, скорее всего, получите повторяющиеся идентификаторы, а это плохо. Вот почему я всегда использую data-id только на всякий случай.

Isochronous 21.07.2017 17:54

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

$(this).attr("id")

или же

$(this).prop("id")

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

Roland 04.09.2017 19:23

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

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

Элемент, инициировавший событие, мы имеем в свойстве мероприятие

event.currentTarget

Получаем объект Узел DOM, на который был установлен обработчик события.


Самый вложенный узел, который начал процесс пузырьков, у нас есть в

event.target

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

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

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

});

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

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

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

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

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

Я работаю с

jQuery Autocomplete

Я попытался найти event, как описано выше, но когда срабатывает функция запроса, кажется, что он недоступен. Вместо этого я использовал this.element.attr("id") для получения идентификатора элемента, и, похоже, он работает нормально.

В случае Angular 7.x вы можете получить собственный элемент и его идентификатор или свойства.

myClickHandler($event) {
    this.selectedElement = <Element>$event.target;
    console.info(this.selectedElement.id)
    this.selectedElement.classList.remove('some-class');
}

html:

<div class = "list-item" (click) = "myClickHandler($event)">...</div>

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

@ManuelMannhardt в этом ответе нет ссылки, это ответ только для кода, а не только для ссылки

barbsan 21.08.2019 12:07

Чистый JS проще

aaa.onclick = handler;
bbb.onclick = handler;

function handler() { 
  var test = this.id; 
  console.info(test) 
}

aaa.onclick = handler;
bbb.onclick = handler;

function handler() { 
  var test = this.id; 
  console.info(test) 
}
<form class = "item" id = "aaa">
  <input class = "title"/>
</form>
<form class = "item" id = "bbb">
  <input class = "title"/>
</form>

Есть много способов сделать это и примеров, но если вам нужно сделать еще один шаг и нужно предотвратить ввод ключа в формы, но все же он все еще нужен в многострочном текстовом поле, это становится более сложным. Следующее поможет решить проблему.

<script>
    $(document).ready(function() {
      $(window).keydown(function(event){
        if (event.keyCode == 13) {
           //There are 2 textarea forms that need the enter key to work.
            if ((event.target.id = "CommentsForOnAir") || (event.target.id = "CommentsForOnline"))
            {
                // Prevent the form from triggering, but allowing multi-line to still work.
            }
            else
            {
                event.preventDefault();
                return false;
            }         
        }
      });
    });
</script>

<textarea class = "form-control" rows = "10" cols = "50" id = "CommentsForOnline" name = "CommentsForOnline" type = "text" size = "60" maxlength = "2000"></textarea>

Возможно, его можно было бы еще упростить, но вы поняли концепцию.

Другие вопросы по теме