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


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:


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

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

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

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


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
}

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


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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.