Angular2 otrzymuje identyfikator klikniętego elementu

85

Mam takie zdarzenie kliknięcia

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

Łapię zdarzenie w moim parametrze wejściowym funkcji i chcę dowiedzieć się, co dokładnie przycisk został kliknięty.

toggle(event) {

}

ale eventnie ma idwłaściwości.

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

Jak mogę znaleźć id?

AKTUALIZACJA: Plunkery są dobre, ale w moim przypadku mam lokalnie:

event.srcElement.attributes.id- undefined event.currentTarget.id- ma wartość

Używam Chrome w najnowszej wersji 49.0.2623.87 m

Czy to możliwe Material Design Lite? ponieważ go używam.

wprowadź opis obrazu tutaj

sreginogemoh
źródło
co chcesz zrobić ze id?
Pardeep Jain
Mam dwa przyciski uruchamiające tę samą funkcję kliknięcia. Muszę więc dowiedzieć się, który z nich został kliknięty
sreginogemoh
po prostu przekaż statyczny / dynamiczny idwraz z średnicami.
Pardeep Jain
dlaczego tak trudno jest dostać id?
sreginogemoh
1
właśnie znalazłem to wevent.currentTarget.id
sreginogemoh

Odpowiedzi:

139

Jeśli chcesz mieć dostęp do idatrybutu przycisku, możesz wykorzystać srcElementwłaściwość wydarzenia:

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

Zobacz ten plunkr: https://plnkr.co/edit/QGdou4?p=preview .

Zobacz to pytanie:

Thierry Templier
źródło
1
event.srcElement.attributes.idjest nieokreślona nie wiem dlaczego ... ale znalazłem idinevent.currentTarget.id
sreginogemoh
Naprawdę? Widziałeś mojego plunkra? To jest to, czego używam i nie jest nieokreślone ... W moim przypadku (Chrome) currentTargetjest niezdefiniowane :-( Z jakiej przeglądarki korzystasz?
Thierry Templier
W rzeczywistości jest to srcElement lub cel według przeglądarek. Zobacz to pytanie: stackoverflow.com/questions/5301643/…
Thierry Templier
4
Chrome:angular2.dev.js:23597 TypeError: Cannot read property 'nodeValue' of undefined
sreginogemoh
4
W końcu używam tegovar target = event.srcElement.attributes.id || event.currentTarget.id;
sreginogemoh
36

Dla użytkowników języka TypeScript:

    toggle(event: Event): void {
        let elementId: string = (event.target as Element).id;
        // do something with the id... 
    }
quidkid
źródło
5
Moim zdaniem powinna to być akceptowana odpowiedź, ale może być const elementId: string = (event.target as Element).id;
Harish
1
która zwraca dla mnie puste miejsce. Nie jest puste ani nieokreślone, ale puste
Darren Street
Dzięki. Byłem tak zdezorientowany, dlaczego nie mogłem bezpośrednio sprawdzić właściwości target lub srcTarget, kiedy mogłem je wszystkie zobaczyć w konsoli. Rzuć jako żywioł, prawda.
Jeremy L
To zdecydowanie powinna być najlepsza odpowiedź.
NobodySomewhere
19

Wreszcie znalazłem najprostszy sposób:

<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
źródło
To może być trudne: jeśli twój przycisk ma jakąś zawartość HTML, na przykład <button ...><i class="fa fa-check"></i></button>i faktycznie klikniesz ten ielement, który jest komponentem FontAwasome, wtedy event.target nie jest elementem, buttonale i.
Skorunka František
2
Aby uzyskać buttonelement, użyj event.target.closest('button').
Skorunka František
18

Możesz po prostu przekazać wartość statyczną (lub zmienną z *ngForlub cokolwiek)

<button (click)="toggle(1)" class="someclass">
<button (click)="toggle(2)" class="someclass">
Günter Zöchbauer
źródło
czy uważasz, że lepiej unikać używania idw takim przypadku?
sreginogemoh
1
Jeśli jedynym celem jest przekazanie go jako parametru zdarzenia, nie użyłbym identyfikatora.
Günter Zöchbauer
1
Zamiast używać idpo prostu wybierz indeks z tablicy lub czegoś podobnego. Często jest zaskakujące, że tak często pomijamy najprostsze rozwiązania.
Yuri
9

Nie ma potrzeby zaliczania całego wydarzenia (chyba, że ​​potrzebujesz innych aspektów wydarzenia niż podałeś). W rzeczywistości nie jest to zalecane. Możesz przekazać odniesienie do elementu po niewielkiej modyfikacji.

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

Technicznie nie musisz szukać przycisku, który został kliknięty, ponieważ minąłeś właściwy element.

Prowadzenie kątowe

Greg
źródło
To powinna być prawidłowa odpowiedź, o której mowa w linku @ Greg do wskazówek dotyczących kątów!
Chrizzldi
4

Kiedy twój HTMLElementnie ma id, namealbo classna wezwanie,

następnie użyj

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

selectedInput(event: MouseEvent) {
   log(event.srcElement) // HTMInputLElement
}
WasiF
źródło
2

zrób to po prostu: (jak powiedziano w komentarzu tutaj, na przykładzie z dwiema metodami)

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

Pardeep Jain
źródło
4
event.srcElement.attributes.idjest nieokreślona w moim przypadku nie wiem dlaczego ... ale znalazłem idinevent.currentTarget.id
sreginogemoh
po prostu eventsprawdź w Object of fired, gdzie możesz zobaczyćid
Pardeep Jain
1
@sreginogemoth możesz też sprawdzić: event.target.idmoże mieć również wartość id
Arthur
2

Możesz użyć jego interfejsu, HTMLButtonElement który dziedziczy po swoim rodzicu HTMLElement!

W ten sposób będziesz mógł mieć automatyczne uzupełnianie ...

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

Aby zobaczyć całą listę HTMLElement z dokumentacji World Wide Web Consortium (W3C)

Demo StackBlitz

A. Morel
źródło
0

Jeśli chcesz mieć dostęp do idatrybutu przycisku w kątowej 6, postępuj zgodnie z tym kodem

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

jesteś idw wartości,

wartość valuejest myId.

Ehsan
źródło