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.


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

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

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)


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.


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/


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

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/


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

7

Puedes intentar usar:

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

7

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

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

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.


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

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


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


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

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.


2

Ambos de estos trabajos,

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

y

alert(this.id);

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

@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));
                   }
               );

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.


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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.