Obtendo o ID do elemento que disparou um evento

969

Existe alguma maneira de obter o ID do elemento que dispara um evento?

Estou pensando em algo como:

$(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>

Exceto, é claro, que o var testdeve conter o ID "aaa", se o evento for disparado a partir do primeiro formulário e "bbb", se o evento for acionado a partir do segundo formulário.

Joda
fonte
25
Seu exemplo é um pouco estranho. Você está anexando um evento de clique a 'a', mas não tem âncoras. Mudá-lo para $ ('input.title'). Click (...) seria um pouco mais claro para os futuros leitores da sua pergunta.
12137 Jason Moore
3
Você pode usar event.target.idno manipulador de eventos para obter a identificação do elemento que disparou um evento.
Ilyas karim

Respostas:

1293

No jQuery event.targetsempre se refere ao elemento que acionou o evento, onde eventé o parâmetro passado para a função. http://api.jquery.com/category/events/event-object/

$(document).ready(function() {
    $("a").click(function(event) {
        alert(event.target.id);
    });
});

Observe também que thisisso também funcionará, mas que não é um objeto jQuery, portanto, se você deseja usar uma função jQuery, deve se referir a ela como $(this), por exemplo:

$(document).ready(function() {
    $("a").click(function(event) {
        // this.append wouldn't work
        $(this).append(" Clicked");
    });
});
samjudson
fonte
12
Uau! Obrigado. Não sabia que o jQuery abstraía isso tão bem. Você é demais! Eu acho que ainda teria a diferença entre (this) e (event.target) - sendo objeto ao qual você vinculou o evento versus o objeto que recebeu o evento.
Hafthor 8/09/08
18
Infelizmente, event.target não permite acesso a seus atributos personalizados. Para fazer isso, é preciso usar $ (this) .attr ("organização: coisa") ;.
Zian Choy 08/09/09
16
@ZianChoy - Não sei bem o que você quer dizer com "atributos personalizados", mas você pode usar $(event.target)se precisar de um método jQuery, por exemplo $(event.target).attr("organisation:thingy");,.
Nnnnnn
3
Eu acho que é importante notar que, se você precisar acessar o destino do evento para manipular o dom, poderá fazer algo assim: $ (event.target) .eq (0). Você pode usar qualquer método que normalmente usaria com um elemento dom como $ (event.target) .eq (0) .find ('li') por exemplo.
Galo
31
Observe que: event.target é o item real que está sendo clicado. Se você, por exemplo, vincular um evento click a uma div e, dentro dessa div, houver um elemento P e um elemento H2 - event.target retornará o elemento H2 ou o P, se clicar em um deles. "this" realmente retornará a div na qual você pendurou o evento, independentemente de qual elemento filho você clicou.
Rob
169

Para referência, tente isso! Funciona!

jQuery("classNameofDiv").click(function() {
    var contentPanelId = jQuery(this).attr("id");
    alert(contentPanelId);
});
Gemma
fonte
16
@gemma A outra solução não funcionou para mim, mas esta funcionou. Obrigado por estar atrasado.
HPWD
3
@ Delackey é o mesmo para mim, a outra solução não funcionou no meu Firefox 12, mas este fez. Obrigado
linuxatico
4
A resposta principal parece não funcionar para obter o ID de um elemento em um SVG incorporado. $(this).attr("id");faz.
Matt Fletcher
2
Lembre-se de que, se o evento de clique estiver em um elemento com filhos, e.targetvocê fornecerá o elemento exato que causou o disparo do evento, mesmo que fosse filho, enquanto thiso elemento ao qual o evento está anexado.
samrap 12/07/16
97

Embora seja mencionado em outros posts, eu queria explicar isso:

$(event.target).id é indefinido

$(event.target)[0].id fornece o atributo id.

event.target.id também fornece o atributo id.

this.id fornece o atributo id.

e

$(this).id está indefinido.

As diferenças, é claro, são entre objetos jQuery e objetos DOM. "id" é uma propriedade DOM, portanto você precisa estar no objeto de elemento DOM para usá-lo.

(Isso me tropeçou, então provavelmente tropeçou em outra pessoa)

dsch
fonte
1
para mim, event.target.idnão dá nada!
Artaxerxe #
3
@artaxerxe significa que seu elemento clicado não tem um ID: P; também não use jquery para esse tipo de coisa ... use atributos de javascript de evento, pois isso é mais rápido.
HellBaby
$(event.target).attr('selector');funcionou perfeitamente para mim.
Souleste 9/07/19
85

Para todos os eventos, não se limitando apenas ao jQuery, você pode usar

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

Onde event.targetfalha, recai no event.srcElementIE. Para esclarecer o código acima, não é necessário o jQuery, mas também funciona com o jQuery.

Aliado
fonte
10
Não usar o jQuery significa que menos linhas de código são executadas, obtendo exatamente o mesmo resultado, como mostrado acima. O jQuery abstrai o js. Esta é a resposta js direta e veja o tamanho!
XrDDDD
não é melhor usar apenas a palavra-chave 'this', que sempre dará acesso às propriedades do elemento que chamou o evento?
Morfidon
7
Só tive que vasculhar toda a porcaria do jQuery para chegar a essa resposta. Obrigado. Isso é mais relevante do que nunca: needsmorejquery.com
gromit190
incrível, realmente me ajudou
Barbz_YHOOL
59

Você pode usar (this)para fazer referência ao objeto que disparou a função.

'this'é um elemento DOM quando você está dentro de uma função de retorno de chamada (no contexto do jQuery), por exemplo, sendo chamado pelos métodos click, each, bind, etc.

Aqui é onde você pode aprender mais: http://remysharp.com/2007/04/12/jquerys-this-demystified/

Espo
fonte
3
se você tiver uma função como $(html).click()(este) irá retornar o objeto html e não o elemento clicado
TCHdvlp
28

Gero uma tabela dinamicamente a partir de um banco de dados, recebo os dados em JSON e os coloco em uma tabela. Cada linha da tabela IDpossui uma única , necessária para ações adicionais; portanto, se o DOM for alterado, você precisará de uma abordagem diferente:

$("table").delegate("tr", "click", function() {
   var id=$(this).attr('id');
   alert("ID:"+id);  
});
SMut
fonte
2
Ah, sim, era isso que eu estava procurando. Ele também funciona da mesma forma para o mais recente "on", pois "delegate" agora está obsoleto. Eu tinha caixas de seleção criadas dinamicamente a partir de dados do banco de dados e, é claro, todas elas tinham IDs diferentes que eu precisava usar para fazer alguma coisa quando clicada. Eu usei esse método aqui para obter qual ID foi realmente clicado. No JS da velha escola, acabei de passar o ID de cada caixa de seleção no HTML da caixa de seleção, mas não posso fazê-lo dessa maneira com o modelo de manipulador de eventos jQuery.
mikato 14/09/16
18

Elemento que disparou o evento que temos na propriedade event

event.currentTarget

Recebemos DOM nó de objeto no qual era manipulador de eventos set.


O nó mais aninhado que iniciou o processo de bolhas que temos

event.target

O objeto de evento é sempre o primeiro atributo do manipulador de eventos, exemplo:

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

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

});

Mais sobre delegação de eventos Você pode ler em http://maciejsikora.com/standard-events-vs-event-delegation/

Maciej Sikora
fonte
11

O elemento de origem como um objeto jQuery deve ser obtido via

var $el = $(event.target);

Isso fornece a fonte do clique, em vez do elemento ao qual a função de clique também foi atribuída. Pode ser útil quando o evento click está em um objeto pai EG.a evento de clique em uma linha da tabela e você precisa da célula que foi clicada

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

Você pode tentar usar:

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

isso funciona com a maioria dos tipos de elementos:

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

No caso de manipuladores de eventos delegados, onde você pode ter algo parecido com isto:

<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>

e seu código JS assim:

$(document).ready(function() {
    $('ul').on('click li', function(event) {
        var $target = $(event.target),
            itemId = $target.data('id');

        //do something with itemId
    });
});

É mais provável que você encontre esse itemId undefined, pois o conteúdo do LI está envolvido em um <span>, o que significa <span>que provavelmente será o destino do evento. Você pode contornar isso com uma pequena verificação, assim:

$(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
    });
});

Ou, se você preferir maximizar a legibilidade (e também evitar a repetição desnecessária de chamadas de quebra automática de 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
    });
});

Ao usar a delegação de eventos, o .is()método é inestimável para verificar se o destino do seu evento (entre outras coisas) é realmente o que você precisa. Use .closest(selector)para pesquisar na árvore do DOM e use .find(selector)(geralmente associado a .first(), como em .find(selector).first()) para pesquisá-la. Você não precisa usá-lo .first()ao usá- .closest()lo, pois ele retorna apenas o primeiro elemento ancestral correspondente, enquanto .find()retorna todos os descendentes correspondentes.

Isócrono
fonte
1
Útil! Eu ajustei no meu caso porque recebi um simples <li id ​​= "numberID"> e, portanto, usei itemId = $ target.attr ('id').
Zappescu
Apenas tome cuidado ao usar um atributo de ID simples, pois cada ID precisa ser exclusivo nessa página. Portanto, se você, por algum motivo, precisar de duas listas como essa nessa página, provavelmente terminará com IDs duplicados, o que é uma coisa ruim. É por isso que eu sempre uso o id de dados apenas para provas futuras.
Isócrono
6

Use can Use. No evento

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

Isso funciona em um z-indexparâmetro maior que o evento mencionado nas respostas acima:

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

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

Dessa forma, você sempre obterá o elemento id(neste exemplo li). Além disso, quando clicado em um elemento filho do pai.

Marcel Verwey
fonte
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);
}

Trabalhando JSFiddle aqui .

shmuli
fonte
Eu acho que isso é um pouco como opção ultrapassada para torná-lo trabalho
Arnas Pečelis
2
@ ArnasPečelis desatualizado? não, apenas não jQuery.
Kevin B
4

Basta usar a thisreferência

$(this).attr("id")

ou

$(this).prop("id")
Erro 404
fonte
Que busca o atributo iddo elemento em click()que foi atribuído. Se você precisar transferir mais dados para esse método, precisará data-some-id="<?php $someId; ?>"`$ (this) .data (" some-id ") para recuperá-los.
Roland
3

this.element.attr("id") funciona bem no IE8.

vml19
fonte
2

Ambos trabalham,

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

e

alert(this.id);
Moji
fonte
2
$(".classobj").click(function(e){
    console.log(e.currentTarget.id);
})
chings228
fonte
@ManuelMannhardt não há nenhum elo dessa resposta, de resposta só código, não só-link resposta
barbsan
1

Você pode usar a função para obter o ID e o valor do item alterado (no meu exemplo, usei uma tag Select.

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

Estou trabalhando com

Preenchimento automático do jQuery

Eu tentei procurar um event como descrito acima, mas quando a função de solicitação é acionada, ela não parece estar disponível. Eu costumava this.element.attr("id")obter o ID do elemento e ele parece funcionar bem.

DAB
fonte
0

No caso do Angular 7.x, você pode obter o elemento nativo e seu ID ou propriedades.

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>
David Dehghan
fonte