Obtener la identificación del elemento que disparó un evento

969

¿Hay alguna forma de obtener la ID del elemento que dispara un evento?

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

Excepto, por supuesto, que la var testdebe contener la identificación "aaa", si el evento se dispara desde el primer formulario y "bbb", si el evento se dispara desde el segundo formulario.

Joda
fuente
25
Tu ejemplo es un poco extraño. Adjunta un evento de clic a 'a', pero no tiene ningún ancla. Cambiarlo a $ ('input.title'). Click (...) sería un poco más claro para futuros lectores de su pregunta.
Jason Moore
3
Puede usar el event.target.idcontrolador de eventos para obtener la identificación del elemento que activó un evento.
Ilyas karim

Respuestas:

1293

En jQuery event.targetsiempre se refiere al elemento que activó el evento, donde se eventpasa el parámetro a la función. http://api.jquery.com/category/events/event-object/

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

Tenga en cuenta también que thistambién funcionará, pero que no es un objeto jQuery, por lo que si desea utilizar una función jQuery, debe referirse a él como $(this), por ejemplo:

$(document).ready(function() {
    $("a").click(function(event) {
        // this.append wouldn't work
        $(this).append(" Clicked");
    });
});
samjudson
fuente
12
¡Guauu! Gracias. No me di cuenta de que jQuery lo abstraía tan bien. ¡Tú Molas! Creo que todavía tendría la diferencia entre (esto) y (event.target): ser un objeto al que se vincula el evento frente al objeto que recibió el evento.
Hafthor
18
Desafortunadamente, event.target no permite el acceso a sus atributos personalizados. Para hacer eso, uno debe usar $ (this) .attr ("organization: thingy") ;.
Zian Choy
16
@ZianChoy - No estoy muy seguro de lo que quiere decir con "atributos personalizados", pero se puede utilizar $(event.target)si necesita un método jQuery, por ejemplo, $(event.target).attr("organisation:thingy");.
nnnnnn
3
Creo que es de notar que si necesita acceso al objetivo del evento para manipular el dom, puede hacer algo como esto: $ (event.target) .eq (0). Luego puede usar cualquier método que normalmente usaría con un elemento dom como $ (event.target) .eq (0) .find ('li') por ejemplo.
Gallo
31
Tenga en cuenta que: event.target es el elemento real en el que se hace clic. Si, por ejemplo, vincula un evento de clic a un div y, dentro de ese div, hay un elemento P y un elemento H2: event.target devolverá el elemento H2 o el P, si hace clic en uno de ellos. "esto" realmente devolverá el div en el que colgó el evento, independientemente del elemento secundario en el que hizo clic.
Rob
169

Como referencia, prueba esto! ¡Funciona!

jQuery("classNameofDiv").click(function() {
    var contentPanelId = jQuery(this).attr("id");
    alert(contentPanelId);
});
Gema
fuente
16
@gemma La otra solución no funcionó para mí, pero esta sí. Gracias por llegar tarde.
HPWD
3
@dlackey es lo mismo para mí, la otra solución no funcionó en mi Firefox 12, pero esta sí. Gracias
linuxatico
44
La respuesta principal no parece funcionar para obtener la ID de un elemento en un SVG incrustado. $(this).attr("id");hace.
Matt Fletcher
2
Tenga en cuenta que si su evento de clic está en un elemento con elementos e.targetsecundarios, thisle dará el elemento exacto que provocó la activación del evento incluso si era un elemento secundario, mientras que le dará el elemento al que está asociado el evento.
samrap
97

Aunque se menciona en otras publicaciones, quería explicar esto:

$(event.target).id es indefinido

$(event.target)[0].id da el atributo id.

event.target.id también le da el atributo id.

this.id da el atributo id.

y

$(this).id es indefinido.

Las diferencias, por supuesto, están entre los objetos jQuery y los objetos DOM. "id" es una propiedad DOM, por lo que debe estar en el objeto elemento DOM para usarlo.

(Me hizo tropezar, así que probablemente tropezó con alguien más)

dsch
fuente
1
a mi event.target.idno da nada!
artaxerxe
3
@artaxerxe, esto significa que su elemento seleccionado no tiene una identificación: P; tampoco use jquery para este tipo de cosas ... use atributos de javascript de eventos en su lugar porque es más rápido.
HellBaby
$(event.target).attr('selector');Funcionó perfectamente para mí.
Souleste
85

Para todos los eventos, no solo se limita a jQuery que puede usar

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

Donde event.targetfalla, vuelve a funcionar event.srcElementpara IE. Para aclarar el código anterior no requiere jQuery pero también funciona con jQuery.

Aliado
fuente
10
No usar jQuery significa que se ejecutan menos líneas de código mientras se obtiene exactamente el mismo resultado, como se muestra arriba. jQuery abstrae js. Esta es la respuesta directa js, ¡y mira el tamaño!
xrDDDD
¿No es mejor simplemente usar 'esta' palabra clave que siempre te dará acceso a las propiedades del elemento que invocó el evento?
Morfidon
77
Solo tuve que investigar toda la basura de jQuery para llegar a esta respuesta. Gracias. Esto es más relevante que nunca: needsmorejquery.com
gromit190
increíble, realmente me ayudó
Barbz_YHOOL
59

Puede usar (this)para hacer referencia al objeto que activó la función.

'this'es un DOM elemento cuando se encuentra dentro de una función de devolución de llamada (en el contexto de jQuery), por ejemplo, al ser llamado por los métodos click, each, bind, etc.

Aquí es donde puede obtener más información: http://remysharp.com/2007/04/12/jquerys-this-demystified/

Espo
fuente
3
si tiene una función como $(html).click()(esto) devolverá el objeto html y no el elemento
cliqueado
28

Genero una tabla dinámicamente en una base de datos, recibo los datos en JSON y los pongo en una tabla. Cada fila de la tabla tiene un carácter único ID, que es necesario para otras acciones, por lo tanto, si se modifica el DOM, necesita un enfoque diferente:

$("table").delegate("tr", "click", function() {
   var id=$(this).attr('id');
   alert("ID:"+id);  
});
Tizón
fuente
2
Oh sí, esto es lo que estaba buscando. También funciona igual para el nuevo "encendido" ya que "delegar" ahora está en desuso. Tenía casillas de verificación creadas dinámicamente a partir de datos de base de datos y, por supuesto, todas tenían diferentes ID que necesitaba usar para hacer algo al hacer clic. Usé este método aquí para obtener en qué ID se hizo clic realmente. En la vieja escuela JS, acabo de pasar la identificación de cada casilla de verificación en el HTML de la casilla de verificación, pero no puedo hacerlo de esa manera con el modelo de controlador de eventos jQuery.
mikato
18

Elemento que disparó el evento que tenemos en la propiedad del evento

event.currentTarget

Obtenemos el objeto del nodo DOM en el que se configuró el controlador de eventos.


El nodo más anidado que comenzó el proceso de burbujeo que tenemos en

event.target

El objeto de evento siempre es el primer atributo del controlador de eventos, por ejemplo:

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

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

});

Más información sobre la delegación de eventos Puede leer en http://maciejsikora.com/standard-events-vs-event-delegation/

Maciej Sikora
fuente
11

El elemento fuente como un objeto jQuery debe obtenerse a través de

var $el = $(event.target);

Esto le proporciona la fuente del clic, en lugar del elemento al que también se le asignó la función de clic. Puede ser útil cuando el evento de clic está en un objeto primario, por ejemplo, un evento de clic en una fila de la tabla, y necesita la celda en la que se hizo clic

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

Puedes intentar usar:

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

esto funciona con la mayoría de los tipos de elementos:

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

En el caso de los controladores de eventos delegados, donde podría tener algo como esto:

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

y tu código JS así:

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

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

Lo más probable es que encuentre ese itemId undefined, ya que el contenido del LI está envuelto en un <span>, lo que significa <span>que probablemente será el objetivo del evento. Puede solucionar esto con un pequeño cheque, así:

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

O, si prefiere maximizar la legibilidad (y también evitar la repetición innecesaria de llamadas de ajuste 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
    });
});

Cuando se utiliza la delegación de eventos, el .is()método es invaluable para verificar que el objetivo de su evento (entre otras cosas) sea realmente lo que necesita. Use .closest(selector)para buscar el árbol DOM y use .find(selector)(generalmente junto con .first(), como en .find(selector).first()) para buscarlo. No es necesario usar .first()cuando se utiliza .closest(), ya que sólo devuelve el primer elemento antecesor juego, mientras que .find()los retornos todos los descendientes coincidentes.

Isócrono
fuente
1
¡Útil! Ajusté en mi caso porque acabo de obtener un simple <li id ​​= "numberID"> y, por lo tanto, usé itemId = $ target.attr ('id').
Zappescu
Solo tenga cuidado al usar un atributo de ID simple, ya que cada ID debe ser única en esa página. Entonces, si por alguna razón necesita tener dos listas como esa en esa página, es probable que termine con ID duplicados, lo cual es algo malo. Es por eso que tiendo a usar siempre la identificación de datos solo para el futuro.
Isochronous
6

Use can Use .on event

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

Esto funciona en un z-indexparámetro superior al evento mencionado en las respuestas anteriores:

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

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

De esta manera, siempre obtendrá idel elemento (en este ejemplo li). También cuando se hace clic en un elemento hijo del padre ...

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

Trabajando JSFiddle aquí .

shmuli
fuente
Creo que esta es una opción un poco anticuada para que funcione
Arnas Pečelis
2
@ ArnasPečelis está desactualizado? no, simplemente no jQuery.
Kevin B
4

Solo usa la thisreferencia

$(this).attr("id")

o

$(this).prop("id")
Error 404
fuente
Eso recupera el atributo iddel elemento donde click()se ha asignado. Si necesita transferir más datos a ese método, necesita data-some-id="<?php $someId; ?>"y luego puede `$ (this) .data (" some-id ") para recuperarlo.
Roland
3

this.element.attr("id") funciona bien en IE8.

vml19
fuente
2

Ambos de estos trabajos,

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

y

alert(this.id);
Moji
fuente
2
$(".classobj").click(function(e){
    console.log(e.currentTarget.id);
})
chings228
fuente
@ManuelMannhardt no hay enlace en esta respuesta, es una respuesta de solo código, no una respuesta de solo enlace
barbsan
1

Puede usar la función para obtener la identificación y el valor del elemento modificado (en mi ejemplo, he usado una etiqueta Seleccionar).

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

Estoy trabajando con

jQuery Autocompletar

Intenté buscar uno eventcomo se describió anteriormente, pero cuando se activa la función de solicitud, no parece estar disponible. Solía this.element.attr("id")obtener la identificación del elemento, y parece funcionar bien.

LENGUADO
fuente
0

En el caso de Angular 7.x puede obtener el elemento nativo y su id o propiedades.

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
fuente