Angular2 get clicked element id

88

Eu tenho esse evento de clique

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

Estou capturando o evento em meu parâmetro de entrada de função e quero saber exatamente qual botão foi clicado.

toggle(event) {

}

mas eventnão tem uma idpropriedade.

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

Como posso encontrar um id?

ATUALIZAÇÃO: Plunkers são todos bons, mas no meu caso tenho localmente:

event.srcElement.attributes.id- undefined event.currentTarget.id- tem o valor

Estou usando a versão mais recente do Chrome 49.0.2623.87 m

Pode ser Material Design Litecoisa? porque estou usando.

insira a descrição da imagem aqui

sreginogemoh
fonte
com o que você quer fazer id?
Pardeep Jain
Tenho dois botões disparando a mesma função de clique. Então, eu preciso descobrir qual foi clicado
sreginogemoh
simplesmente passe o estático / dinâmico idjunto com os parâmetros.
Pardeep Jain
por que é tão difícil conseguir um id?
sreginogemoh
1
acabei de descobrir que emevent.currentTarget.id
sreginogemoh

Respostas:

144

Se você deseja ter acesso ao idatributo do botão, pode aproveitar a srcElementpropriedade do 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;
  }
}

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

Veja esta pergunta:

Thierry Templier
fonte
1
event.srcElement.attributes.idé indefinido não sei porque ... mas eu encontrei um idinevent.currentTarget.id
sreginogemoh
Mesmo? Você viu meu plunkr? É o que eu uso e não é indefinido ... No meu caso (Chrome), currentTargeté indefinido :-( Qual navegador você usa?
Thierry Templier
Na verdade, é srcElement ou destino de acordo com os navegadores. Veja esta pergunta: stackoverflow.com/questions/5301643/…
Thierry Templier
4
Chrome:angular2.dev.js:23597 TypeError: Cannot read property 'nodeValue' of undefined
sreginogemoh
4
Acabo de usar issovar target = event.srcElement.attributes.id || event.currentTarget.id;
sreginogemoh
37

Para usuários TypeScript:

    toggle(event: Event): void {
        let elementId: string = (event.target as Element).id;
        // do something with the id... 
    }
quidkid
fonte
5
Esta deve ser a resposta aceita em minha opinião. No entanto, pode ser const elementId: string = (event.target as Element).id;
Harish
1
que retorna em branco para mim. Não nulo ou indefinido, mas em branco
Darren Street
Obrigado. Eu estava tão confuso por que não pude verificar uma propriedade de destino, ou srcTarget, diretamente quando podia ver todos eles no console. Elenco como elemento, dã.
Jeremy L
Esta deve ser definitivamente a melhor resposta.
NobodySomewhere
19

Finalmente encontrei a maneira mais simples:

<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); 
}
micronyks
fonte
Isso pode ser complicado: se o botão tiver algum conteúdo HTML, como <button ...><i class="fa fa-check"></i></button>e você realmente clicar nesse ielemento, que é o componente FontAwasome, então o event.target não é um, buttonmas o ielemento.
Skorunka František
2
Para obter o buttonuso do elemento event.target.closest('button').
Skorunka František
19

Você poderia simplesmente passar um valor estático (ou uma variável de *ngForou qualquer outro)

<button (click)="toggle(1)" class="someclass">
<button (click)="toggle(2)" class="someclass">
Günter Zöchbauer
fonte
você acha que é melhor evitar o uso de um id nesse caso?
sreginogemoh
1
Se o único objetivo é passá-lo como parâmetro de evento, não usaria um id.
Günter Zöchbauer
1
Em vez de usar, idbasta escolher um índice de uma matriz ou algo assim. Muitas vezes é surpreendente que negligenciemos as soluções mais simples com tanta frequência.
Yuri
9

Não há necessidade de ser aprovado em todo o evento (a menos que você precise de outros aspectos do evento que não os declarados). Na verdade, não é recomendado. Você pode passar a referência do elemento com apenas uma pequena modificação.

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

}

Demonstração StackBlitz

Tecnicamente, você não precisa encontrar o botão que foi clicado, porque você passou o elemento real.

Orientação angular

Greg
fonte
Esta deve ser a resposta correta, conforme referido por @ Greg's Link para a orientação angular!
Chrizzldi
4

Quando você HTMLElementnão tem um id, nameou classpara ligar,

então use

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

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

faça assim simplesmente: (como dito no comentário aqui é um exemplo com dois 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);
  }
}

demonstração: http://plnkr.co/edit/5kJaj9D13srJxmod213r?p=preview

Pardeep Jain
fonte
4
event.srcElement.attributes.idé indefinido no meu caso não sei porque ... mas eu encontrei um idinevent.currentTarget.id
sreginogemoh
basta verificar no objeto de eventfogo onde você pode verid
Pardeep Jain
1
@sreginogemoth você também pode verificar: event.target.idele também pode ter o valor id
Arthur
2

Você pode usar sua interface HTMLButtonElement que herda de seu pai HTMLElement!

Desta forma, você poderá ter o preenchimento automático ...

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

Para ver toda a lista de HTMLElement da documentação do World Wide Web Consortium (W3C)

Demonstração StackBlitz

A. Morel
fonte
0

Se você deseja ter acesso ao idatributo do botão no 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;
  }
}`

você está idno valor,

o valor de valueé myId.

Ehsan
fonte