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


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:


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

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

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

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


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
}

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


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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.