Есть ли способ получить идентификатор элемента, запускающего событие?
Я думаю примерно так:
$(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", если событие запускается из второй формы.
Вы можете использовать event.target.id в обработчике событий, чтобы получить идентификатор элемента, вызвавшего событие.
Вы можете взять event как аргумент в вашей функции обратного вызова, а затем использовать event.target.id



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать (this) для ссылки на объект, который запустил функцию.
'this' является элементом ДОМ, когда вы находитесь внутри функции обратного вызова (в контексте jQuery), например, вызываемой методами click, each, bind и т. д.
Здесь вы можете узнать больше: http://remysharp.com/2007/04/12/jquerys-this-demystified/
если у вас есть такая функция, как $(html).click() (this), вернет объект html, а не выбранный элемент
В 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) все равно будет - быть объектом, с которым вы связали событие, и объектом, получившим событие.
К сожалению, event.target не разрешает доступ к своим настраиваемым атрибутам. Для этого нужно использовать $ (this) .attr ("organization: thingy") ;.
@ZianChoy - я не совсем понимаю, что вы имеете в виду под «настраиваемыми атрибутами», но вы можете использовать $(event.target), если вам нужен метод jQuery, например $(event.target).attr("organisation:thingy");.
Я думаю, следует отметить, что если вам нужен доступ к цели события для управления dom, вы можете сделать что-то вроде этого: $ (event.target) .eq (0). Затем вы можете использовать любой метод, который вы обычно используете с элементом dom, например, $ (event.target) .eq (0) .find ('li').
Обратите внимание, что: event.target - это элемент настоящий, по которому щелкают. Если вы, например, привязываете событие щелчка к div, и внутри этого div есть элемент P и H2 - event.target вернет элемент H2 или P, если щелкнуть один из них. «this» действительно вернет div, на котором вы повесили событие, независимо от того, на какой дочерний элемент вы щелкнули.
Я использую event.currentTarget.id, event.target.id также может быть дочерним элементом
Иногда событие было инициировано неочевидным элементом, тогда вы можете попробовать использовать этот var target = e.originalEvent.explicitOriginalTarget || e.currentTarget[e.currentTarget.length - 1] || e.target;.
Обратите внимание, как уже упоминалось @RobQuist выше, e.target на самом деле является элементом на котором, когда произошло событие, и не всегда может быть элементом, который запущен событие. Таким образом, автору может потребоваться изменить предложение В jQuery event.target всегда ссылается на элемент, который вызвал событие, где 'event', поскольку могут быть случаи, когда оно неверно. Кстати, во всех случаях e.currentTarget относится к элементу, к которому был прикреплен обработчик событий. Прочтите это: developer.mozilla.org/en-US/docs/Web/API/Event/currentTarget
Предупреждение для тех, кто использует ES6. Стрелочные функции не устанавливают this. Итак, в основном не используйте здесь стрелочную функцию.
@tomwrong: Ну, если вместо этого вы используете event.target или event.currentTarget, вы можете использовать this для чего-то еще. Тогда стрелочная функция имеет смысл.
После сумасшедших часов попыток я обнаружил, что если вы используете $(document).bind('click','myelement,function(event){...}'), то $(this) вернет document, а не myelement.
По-видимому, это решение не работает для переключателей и раскрывающихся списков.
Нет, this не всегда работает, иногда он не определен в зависимости от контекста; просто еще одна причина, по которой JavaScript сбился с пути.
Спасибо, это сработало для меня. По-видимому, «Когда вы выполняете запрос DOM через jQuery, например $ ('class-name'), он активно ищет этот элемент в DOM и возвращает этот элемент со всеми присоединенными методами прототипа jQuery. Когда вы находитесь в цепочке или событии jQuery вам не нужно повторно запускать запрос DOM, вы можете использовать контекст $ (this) ". Автор: stackoverflow.com/users/185672/phil
Для справки попробуйте это! Оно работает!
jQuery("classNameofDiv").click(function() {
var contentPanelId = jQuery(this).attr("id");
alert(contentPanelId);
});
@gemma Другое решение не сработало для меня, но это сработало. Спасибо, что опоздали.
@dlackey для меня то же самое, другое решение не сработало на моем firefox 12, но это сработало. Спасибо
Верхний ответ, похоже, не работает для получения идентификатора элемента во встроенном SVG. $(this).attr("id"); делает.
Имейте в виду, что если ваше событие click находится на элементе с дочерними элементами, e.target предоставит вам точный элемент, который вызвал запуск события, даже если это был дочерний элемент, тогда как this предоставит вам элемент, к которому привязано событие.
Я динамически генерирую таблицу из базы данных, получаю данные в формате JSON и помещаю их в таблицу. Каждая строка таблицы имеет уникальный ID, который необходим для дальнейших действий, поэтому при изменении DOM вам потребуется другой подход:
$("table").delegate("tr", "click", function() {
var id=$(this).attr('id');
alert("ID:"+id);
});
Ах да, это то, что я искал. Он также работает так же для более нового «on», поскольку «делегат» теперь устарел. У меня были флажки, созданные динамически из данных БД, и, конечно же, все они имели разные идентификаторы, которые мне нужно было использовать, чтобы что-то делать при нажатии. Я использовал этот метод здесь, чтобы узнать, какой идентификатор был фактически нажат. В старой школе JS я просто передавал идентификатор из каждого флажка в HTML-коде флажка, но не могу сделать это таким образом с помощью модели обработчика событий jQuery.
хороший ответ здесь
Исходный элемент как объект 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, и посмотрите на размер!
не лучше ли просто использовать ключевое слово this, которое всегда дает вам доступ к свойствам элемента, вызвавшего событие?
Просто нужно было покопаться во всей ерунде jQuery, чтобы добраться до этого ответа. Спасибо. Это актуально как никогда: needmorejquery.com
круто, действительно помогло мне
Вы можете попробовать использовать:
$('*').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 это означает, что у вашего элемента, по которому был сделан щелчок, нет идентификатора: P; также не используйте jquery для такого рода вещей .... используйте атрибуты javascript события вместо этого, чтобы он работал быстрее.
$(event.target).attr('selector'); у меня отлично сработал.
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 здесь.
Я думаю, что это немного похоже на устаревший вариант, чтобы заставить его работать
@ ArnasPečelis устарело? нет, только не jQuery.
В случае делегированных обработчиков событий, у вас может быть что-то вроде этого:
<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').
Просто будьте осторожны при использовании простого атрибута идентификатора, поскольку каждый идентификатор на этой странице должен быть уникальным. Так что, если вам по какой-то причине нужно иметь два таких списка на этой странице, вы, скорее всего, получите повторяющиеся идентификаторы, а это плохо. Вот почему я всегда использую data-id только на всякий случай.
Просто используйте ссылку this
$(this).attr("id")
или же
$(this).prop("id")
Это извлекает атрибут id из элемента, которому назначен click(). Если вам нужно передать больше данных в этот метод, вам понадобится data-some-id = "<?php $someId; ?>", а затем вы можете получить его `$ (this) .data (" some-id ").
Использование 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 в этом ответе нет ссылки, это ответ только для кода, а не только для ссылки
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>
Возможно, его можно было бы еще упростить, но вы поняли концепцию.
Ваш пример немного странный. Вы прикрепляете событие щелчка к 'a', но не имеете привязок. Если вы измените его на $ ('input.title'). Click (...), это будет немного понятнее для будущих читателей вашего вопроса.