Obtener el ID del elemento que disparó un evento

¿Hay alguna forma de obtener el ID del elemento que desencadena un evento?

Estoy pensando en 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 test debe 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.

preguntado el 07 de septiembre de 08 a las 06:09

Tu ejemplo es un poco extraño. Está adjuntando un evento de clic a 'a', pero no tiene anclajes. Cambiarlo a $ ('input.title'). Click (...) sería un poco más claro para los futuros lectores de su pregunta. -

Puedes usar event.target.id en el controlador de eventos para obtener la identificación del elemento que disparó un evento. -

Usted puede tomar event como una argumento en la función de devolución de llamada de clic Y luego usar event.target.id -

23 Respuestas

En jQuery event.target siempre se refiere al elemento que desencadenó el evento, donde event es el parámetro pasado 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 this también funcionará, pero que no es un objeto jQuery, por lo que si desea usar una función jQuery en él, debe referirse a él como $(this), p.ej:

$(document).ready(function() {
    $("a").click(function(event) {
        // this.append wouldn't work
        $(this).append(" Clicked");
    });
});

contestado el 15 de mayo de 19 a las 06:05

¡Guau! Gracias. No me di cuenta de que jQuery lo resumió tan bien. ¡Tú Molas! Creo que todavía tendría la diferencia entre (this) y (event.target), siendo el objeto al que enlaza el evento frente al objeto que recibió el evento. - Hafthor

Desafortunadamente, event.target no permite el acceso a sus atributos personalizados. Para hacer eso, uno debe usar $ (this) .attr ("organization: thingy") ;. - zian choy

@ZianChoy: no estoy muy seguro de lo que quiere decir con "atributos personalizados", pero puede usar $(event.target) si necesita un método jQuery, por ejemplo, $(event.target).attr("organisation:thingy");. - nnnnnn

Creo que debe tenerse en cuenta 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

Tenga en cuenta que: event.target es el real elemento 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 la P, si se hace clic en uno de ellos. "this" realmente devolverá el div en el que colgó el evento, independientemente del elemento secundario en el que haya hecho clic. - Robar

Como referencia, ¡intente esto! ¡Funciona!

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

Respondido 02 Jul 12, 04:07

@gemma La otra solución no me funcionó, pero esta sí. Gracias por llegar tarde. - HPWD

@dlackey es lo mismo para mí, la otra solución no funcionó en mi firefox 12, pero esta sí. Gracias - linuxatico

La respuesta principal no parece funcionar para obtener el ID de un elemento en un SVG incrustado. $(this).attr("id"); lo hace. - Matt Fletcher

Tenga en cuenta que si su evento de clic está en un elemento con niños, e.target le dará el elemento exacto que causó que se disparara el evento incluso si era un niño, mientras que this le dará el elemento al que se adjunta el evento. - samrap

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 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 del elemento DOM para usarlo.

(Me hizo tropezar, por lo que probablemente tropezó con alguien más)

contestado el 09 de mayo de 18 a las 16:05

a mi, event.target.id no da nada! - artajerjes

@artaxerxe esto significa que su elemento seleccionado no tiene un id: P; Tampoco use jquery para este tipo de cosas .... use atributos de evento javascript en su lugar porque es más rápido. - Bebe del infierno

$(event.target).attr('selector'); funcionó perfectamente para mí. - Souleste

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

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

Dónde event.target falla, vuelve a caer event.srcElement para IE. Para aclarar el código anterior no se requiere jQuery pero también funciona con jQuery.

Respondido 08 Feb 16, 15:02

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 de js, ¡y mira el tamaño! - xrDDDD

¿No es mejor usar la palabra clave 'this' que siempre te dará acceso a las propiedades del elemento que invocó el evento? - Morfidón

Solo tuve que buscar en toda la basura de jQuery para llegar a esta respuesta. Gracias. Esto es más relevante que nunca: needmorejquery.com - birgersp

increíble, realmente me ayudó - Barbz_YHOOL

Puedes usar (this) para hacer referencia al objeto que disparó la función.

'this' es un DOM elemento cuando está dentro de una función de devolución de llamada (en el contexto de jQuery), por ejemplo, siendo 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/

Respondido 30 ago 13, 09:08

si tienes una función como $(html).click() (esto) devolverá el objeto html y no el elemento en el que se hizo clic - TCHdvlp

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 una ID, que es necesario para acciones posteriores, por lo que, si se modifica el DOM, necesita un enfoque diferente:

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

Respondido 08 Feb 16, 15:02

Oh sí, esto es lo que estaba buscando. También funciona de la misma manera para el "on" más nuevo, ya que "delegar" ahora está obsoleto. 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 cuando hacía clic. Utilicé este método aquí para obtener en qué ID se hizo clic. En JS de la vieja escuela, 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

buena respuesta aquí - Humphrey

Elemento que disparó el evento que tenemos en evento perfecta

event.currentTarget

Obtenemos Nodo DOM objeto en el que se estableció el controlador de eventos.


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

event.target

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

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

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

});

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

Respondido 14 Oct 16, 14:10

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

var $el = $(event.target);

Esto le da la fuente del clic, en lugar del elemento que también se asignó a la función de clic. Puede ser útil cuando el evento de clic está en un objeto principal, 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);
});

Respondido el 15 de diciembre de 14 a las 13:12

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

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

Respondido el 13 de Septiembre de 19 a las 23:09

Puedes intentar usar:

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

respondido 03 nov., 12:17

En el caso de los controladores de eventos delegados, es posible que tenga 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 su 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
    });
});

Es muy probable que encuentre que itemId es undefined, ya que el contenido de la LI está envuelto en un <span>, lo que significa el <span> 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 envoltura 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
    });
});

Al usar la delegación de eventos, el .is() El método es invaluable para verificar que el objetivo de su evento (entre otras cosas) es realmente lo que necesita. Usar .closest(selector) para buscar en el árbol DOM y usar .find(selector) (generalmente junto con .first(), como en .find(selector).first()) para buscarlo. No necesitas usar .first() cuando se utiliza .closest(), ya que solo devuelve el primer elemento ancestro coincidente, mientras que .find() devuelve todos los descendientes coincidentes.

Respondido el 18 de junio de 15 a las 21:06

¡Útil! Me ajusté en mi caso porque acabo de obtener un simple y entonces usé itemId = $ target.attr ('id'). - Zappescu

Solo tenga cuidado con el uso de un atributo de ID simple, ya que cada ID debe ser único 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 malo. Es por eso que tiendo a usar siempre ID de datos solo para pruebas futuras. - Isócrono

Usar puede Usar .on evento

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

Respondido el 24 de Septiembre de 16 a las 07:09

Esto funciona en una mayor z-index que el parámetro de evento mencionado en las respuestas anteriores:

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

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

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

Respondido 08 Feb 16, 15:02

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

Respondido el 26 de enero de 16 a las 20:01

Creo que esta es una opción un poco desactualizada para que funcione. Arnas Pečelis

@ ArnasPečelis desactualizado? no, simplemente no jQuery. - Kevin B

Solo usa el this referencia

$(this).attr("id")

or

$(this).prop("id")

Respondido 04 ago 16, 09:08

Que recupera el atributo id desde el elemento donde click() ha sido asignado el. 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

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

Respondido el 13 de junio de 16 a las 12:06

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

Respondido 21 ago 19, 10:08

@ManuelMannhardt no hay un enlace en esta respuesta, es una respuesta de solo código, no una respuesta de solo enlace - barbasan

Ambos funcionan,

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

y

alert(this.id);

contestado el 23 de mayo de 14 a las 12:05

Pure JS es más simple

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

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

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

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

Respondido el 26 de junio de 20 a las 21:06

Puede usar la función para obtener la identificación y el valor del elemento cambiado (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));
                   }
               );

Respondido 05 Feb 18, 11:02

Estoy trabajando con

Autocompletar jQuery

Intenté buscar un event como se describió anteriormente, pero cuando la función de solicitud se activa, no parece estar disponible. solía this.element.attr("id") para obtener la ID del elemento en su lugar, y parece funcionar bien.

respondido 11 nov., 18:17

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>

Respondido 26 Feb 19, 21:02

Ya hay muchas formas de hacer esto y ejemplos, pero si necesita dar un paso más y necesita evitar la tecla Intro en formularios, y aún así la necesita en un área de texto de varias líneas, se vuelve más complicado. Lo siguiente solucionará el problema.

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

Probablemente podría simplificarse más, pero entiendes el concepto.

respondido 16 nov., 20:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.