Angular2 ottiene l'id elemento cliccato


88

Ho un tale evento di clic

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

Sto rilevando l'evento nel mio parametro di input della funzione e voglio scoprire quale pulsante esattamente è stato cliccato.

toggle(event) {

}

ma eventnon ha una idproprietà.

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

Come posso trovare un id?

AGGIORNAMENTO: I plunker sono tutti buoni ma nel mio caso ho localmente:

event.srcElement.attributes.id- undefined event.currentTarget.id- ha il valore

Sto usando Chrome ultima versione 49.0.2623.87 m

Potrebbe essere una Material Design Litecosa? perché lo sto usando.

inserisci qui la descrizione dell'immagine


con cosa vuoi fare id?
Pardeep Jain

Ho due pulsanti che attivano la stessa funzione di clic. Quindi devo scoprire quale è stato cliccato
sreginogemoh

passa semplicemente lo statico / dinamico idinsieme ai parametri.
Pardeep Jain

perché è così difficile ottenere un id?
sreginogemoh

1
appena scoperto che inevent.currentTarget.id
sreginogemoh

Risposte:


144

Se vuoi avere accesso idall'attributo del pulsante puoi sfruttare la srcElementproprietà dell'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;
  }
}

Vedi questo plunkr: https://plnkr.co/edit/QGdou4?p=preview .

Vedi questa domanda:


1
event.srcElement.attributes.idè indefinito non so perché ... ma ho trovato un idinevent.currentTarget.id
sreginogemoh

Veramente? Hai visto il mio plunkr? È quello che uso io e non è indefinito ... Nel mio caso (Chrome), currentTargetnon è definito :-( Quale browser usi?
Thierry Templier

In effetti, è srcElement o target in base ai browser. Vedi questa domanda: stackoverflow.com/questions/5301643/…
Thierry Templier

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

4
Finisco per usare questovar target = event.srcElement.attributes.id || event.currentTarget.id;
sreginogemoh

37

Per utenti TypeScript:

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

5
Questa dovrebbe essere la risposta accettata a mio parere, tuttavia può essere const elementId: string = (event.target as Element).id;
Harish

1
che ritorna vuoto per me. Non nullo o indefinito ma vuoto
Darren Street

Grazie. Ero così confuso sul motivo per cui non potevo controllare una proprietà di target, o srcTarget, direttamente quando potevo vederli tutti nella console. Lanciato come elemento, duh.
Jeremy L

Questa dovrebbe essere sicuramente la risposta migliore.
NobodySomewhere

19

Finalmente ho trovato il modo più semplice:

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

Questo potrebbe essere complicato: se il tuo pulsante ha del contenuto HTML, come <button ...><i class="fa fa-check"></i></button>e fai effettivamente clic su iquell'elemento, che è il componente FontAwasome, allora il event.target non è un buttonma l' ielemento.
Skorunka František

2
Per ottenere l' buttonuso dell'elemento event.target.closest('button').
Skorunka František

19

Potresti semplicemente passare un valore statico (o una variabile da *ngForo qualsiasi altra cosa)

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

secondo voi è meglio evitare di utilizzare un idin tal caso?
sreginogemoh

1
Se l'unico scopo è passarlo come parametro dell'evento, non userei un id.
Günter Zöchbauer

1
Invece di usare, idscegli un indice da un array o giù di lì. È spesso sorprendente che trascuriamo così spesso le soluzioni più dirette.
Yuri

9

Non è necessario superare l'intero evento (a meno che non siano necessari altri aspetti dell'evento rispetto a quanto dichiarato). In effetti, non è consigliato. Puoi passare il riferimento all'elemento con solo una piccola modifica.

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

}

Demo StackBlitz

Tecnicamente, non è necessario trovare il pulsante su cui è stato fatto clic, perché hai passato l'elemento effettivo.

Guida angolare


Questa dovrebbe essere la risposta corretta come indicato dal collegamento di @ Greg alla guida angolare!
Chrizzldi

4

Quando HTMLElementnon hai un id, nameo classda chiamare,

quindi utilizzare

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

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

2

fai semplicemente questo: (come detto nel commento qui è con un esempio con due metodi)

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

demo: http://plnkr.co/edit/5kJaj9D13srJxmod213r?p=preview


4
event.srcElement.attributes.idè indefinito nel mio caso non so perché ... ma ho trovato un idinevent.currentTarget.id
sreginogemoh

basta fare il checkout in Object of eventlicenziato dove puoi vedereid
Pardeep Jain

1
@sreginogemoth puoi anche controllare: event.target.idpuò anche avere il valore id
Arthur

2

Puoi usare la sua interfaccia HTMLButtonElement che eredita dal suo genitore HTMLElement!

In questo modo potrai avere il completamento automatico ...

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

toggle(event: MouseEvent) {
    const button = event.target as HTMLButtonElement;
    console.log(button.id);
    console.log(button.className);
 }

Per vedere tutto l'elenco di HTMLElement dalla documentazione del World Wide Web Consortium (W3C)

Demo StackBlitz


0

Se vuoi avere accesso idall'attributo del pulsante nell'angolo 6 segui questo codice

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

sei idnel valore,

il valore di valueè myId.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.