Angular2 obtener la identificación del elemento cliqueado


85

Tengo tal evento de clic

 <button (click)="toggle($event)" class="someclass" id="btn1"></button>
 <button (click)="toggle($event)" class="someclass" id="btn2"></button>

Estoy capturando el evento en mi parámetro de entrada de función y quiero saber exactamente en qué botón se hizo clic.

toggle(event) {

}

pero eventno tiene idpropiedad.

altKey: false
bubbles: true
button: 0
buttons: 0
cancelBubble: false
cancelable: true
clientX: 1198
clientY: 29
ctrlKey: false
currentTarget: button#hdrbtn_notificaton.mdl-button.mdl-js-button.mdl-js-ripple-effect.mdl-button--icon
defaultPrevented: false
detail: 1
eventPhase: 3
fromElement: null
isTrusted: true
isTrusted: true
layerX: -566
layerY: 5
metaKey: false
movementX: 0
movementY: 0
offsetX: 22
offsetY: 13
pageX: 1198
pageY: 29
path: Array[13]
relatedTarget: null
returnValue: true
screenX: 1797
screenY: 148
shiftKey: false
sourceCapabilities: InputDeviceCapabilities
srcElement: span.mdl-button__ripple-container
target: span.mdl-button__ripple-container
timeStamp: 1458032708743
toElement: span.mdl-button__ripple-container
type: "click"
view: Window
webkitMovementX: 0
webkitMovementY: 0
which: 1
x: 1198
y: 29

¿Cómo puedo encontrar un id?

ACTUALIZACIÓN: Plunkers son todos buenos, pero en mi caso tengo localmente:

event.srcElement.attributes.id- indefinido event.currentTarget.id- tiene el valor

Estoy usando Chrome última versión 49.0.2623.87 m

¿Podría ser una Material Design Litecosa? porque lo estoy usando.

ingrese la descripción de la imagen aquí


lo que quiere hacer con id?
Pardeep Jain

Tengo dos botones que activan la misma función de clic. Así que necesito averiguar en cuál se hizo clic
sreginogemoh

simplemente pase lo estático / dinámico idjunto con los parámetros.
Pardeep Jain

¿Por qué es tan difícil conseguir una id?
sreginogemoh

1
Acabo de encontrar eso enevent.currentTarget.id
sreginogemoh

Respuestas:


139

Si desea tener acceso al idatributo del botón, puede aprovechar la srcElementpropiedad del evento:

import {Component} from 'angular2/core';

@Component({
  selector: 'my-app',
  template: `
    <button (click)="onClick($event)" id="test">Click</button>
  `
})
export class AppComponent {
  onClick(event) {
    var target = event.target || event.srcElement || event.currentTarget;
    var idAttr = target.attributes.id;
    var value = idAttr.nodeValue;
  }
}

Vea este plunkr: https://plnkr.co/edit/QGdou4?p=preview .

Vea esta pregunta:


1
event.srcElement.attributes.idno está definido no sé por qué ... pero encontré un idinevent.currentTarget.id
sreginogemoh

De Verdad? ¿Viste mi plunkr? Es lo que uso y no está indefinido ... En mi caso (Chrome), currentTargetno está definido :-( ¿Qué navegador usas?
Thierry Templier

De hecho, es srcElement o target según los navegadores. Vea esta pregunta: stackoverflow.com/questions/5301643/…
Thierry Templier

4
Chrome:angular2.dev.js:23597 TypeError: Cannot read property 'nodeValue' of undefined
sreginogemoh

4
Termino de usar estovar target = event.srcElement.attributes.id || event.currentTarget.id;
sreginogemoh

36

Para usuarios de TypeScript:

    toggle(event: Event): void {
        let elementId: string = (event.target as Element).id;
        // do something with the id... 
    }

5
Esta debería ser la respuesta aceptada en mi opinión, pero puede ser const elementId: string = (event.target as Element).id;
Harish

1
que vuelve en blanco para mí. No nulo ni indefinido, pero en blanco
Darren Street

Gracias. Estaba tan confundido por qué no podía verificar una propiedad de target, o srcTarget, directamente cuando podía verlos todos en la consola. Emitir como elemento, duh.
Jeremy L

Esta debería ser definitivamente la mejor respuesta.
NobodySomewhere

19

Finalmente encontré la forma más sencilla:

<button (click)="toggle($event)" class="someclass" id="btn1"></button>
<button (click)="toggle($event)" class="someclass" id="btn2"></button>

toggle(event) {
   console.log(event.target.id); 
}

Esto podría ser complicado: si su botón tiene algo de contenido HTML, como <button ...><i class="fa fa-check"></i></button>y realmente hace clic en ese ielemento, que es el componente FontAwasome, entonces event.target no es un buttonsino el ielemento.
Skorunka František

2
Para obtener el buttonuso del elemento event.target.closest('button').
Skorunka František

18

Podría simplemente pasar un valor estático (o una variable de *ngForo lo que sea)

<button (click)="toggle(1)" class="someclass">
<button (click)="toggle(2)" class="someclass">

¿Crees que es mejor evitar el uso de un iden tal caso?
sreginogemoh

1
Si el único propósito es pasarlo como parámetro de evento, entonces no usaría una identificación.
Günter Zöchbauer

1
En lugar de usar, idsimplemente elija un índice de una matriz más o menos. A menudo es sorprendente que pasemos por alto las soluciones más sencillas con tanta frecuencia.
Yuri

9

No es necesario aprobar todo el evento (a menos que necesite otros aspectos del evento de los que ha indicado). De hecho, no se recomienda. Puede pasar la referencia del elemento con solo una pequeña modificación.

import {Component} from 'angular2/core';

@Component({
  selector: 'my-app',
  template: `
    <button #btn1 (click)="toggle(btn1)" class="someclass" id="btn1">Button 1</button>
    <button #btn2 (click)="toggle(btn2)" class="someclass" id="btn2">Button 2</button>
  `
})
export class AppComponent {
  buttonValue: string;

  toggle(button) {
    this.buttonValue = button.id;
  }

}

Demostración de StackBlitz

Técnicamente, no necesita encontrar el botón en el que se hizo clic, porque ha pasado el elemento real.

Guiado angular


¡Esta debería ser la respuesta correcta según lo indicado por el enlace de @ Greg a la guía angular!
Chrizzldi

4

Cuando tu HTMLElementno tienes un id, nameo classpara llamar

luego usa

<input type="text" (click)="selectedInput($event)">

selectedInput(event: MouseEvent) {
   log(event.srcElement) // HTMInputLElement
}

2

hazlo así simplemente: (como se dice en el comentario, aquí está con un ejemplo con dos métodos)

import {Component} from 'angular2/core';

@Component({
    selector: 'my-app', 
    template: `
      <button (click)="checkEvent($event,'a')" id="abc" class="def">Display Toastr</button>
      <button (click)="checkEvent($event,'b')" id="abc1" class="def1">Display Toastr1</button>
    `
})
export class AppComponent {
  checkEvent(event, id){
    console.log(event, id, event.srcElement.attributes.id);
  }
}

demostración: http://plnkr.co/edit/5kJaj9D13srJxmod213r?p=preview


4
event.srcElement.attributes.idno está definido en mi caso no sé por qué ... pero encontré un idinevent.currentTarget.id
sreginogemoh

solo verifique en el Objeto de eventdespedido donde puede verid
Pardeep Jain

1
@sreginogemoth también puede verificar: event.target.idtambién puede tener el valor de identificación
Arthur


0

Si desea tener acceso al idatributo del botón en angular 6 siga este código

`@Component({
  selector: 'my-app',
  template: `
    <button (click)="clicked($event)" id="myId">Click Me</button>
  `
})
export class AppComponent {
  clicked(event) {
    const target = event.target || event.srcElement || event.currentTarget;
    const idAttr = target.attributes.id;
    const value = idAttr.nodeValue;
  }
}`

tu iden el valor,

el valor de valuees myId.

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.