Angular2 tıklanan öğe kimliği al


88

Böyle bir tıklama olayım var

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

Olayı işlev girdi parametremde yakalıyorum ve tam olarak hangi düğmenin tıklandığını öğrenmek istiyorum.

toggle(event) {

}

ama eventbir idmülkü yok.

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

Nasıl bulabilirim id?

GÜNCELLEME: Plunkers hepsi iyi ama benim durumumda yerel olarak:

event.srcElement.attributes.id- tanımsız event.currentTarget.id- değere sahiptir

Chrome'un en son Sürüm 49.0.2623.87 m'yi kullanıyorum

Bir Material Design Liteşey olabilir mi? çünkü ben kullanıyorum.

görüntü açıklamasını buraya girin


Ne yapmak istiyorum id?
Pardeep Jain

Aynı tıklama işlevini çalıştıran iki düğmem var. Bu yüzden hangisinin tıklandığını bulmam gerekiyor
sreginogemoh

basitçe statik / dinamik idperametreler ile birlikte geçirin.
Pardeep Jain

neden bir almak bu kadar zor id?
sreginogemoh

1
az önceevent.currentTarget.id
sreginogemoh

Yanıtlar:


144

idDüğmenin özniteliğine erişmek istiyorsanız srcElement, olayın özelliğinden yararlanabilirsiniz :

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

Bu plunkr'a bakın: https://plnkr.co/edit/QGdou4?p=preview .

Şu soruya bakın:


1
event.srcElement.attributes.idtanımsız nedenini bilmiyorum ... ama bir idinevent.currentTarget.id
sreginogemoh buldum

Gerçekten mi? Plunkr'ımı gördün mü? Kullandığım şey bu ve tanımlanmamış ... Benim durumumda (Chrome) currentTargettanımsız :-( Hangi tarayıcıyı kullanıyorsunuz?
Thierry Templier

Aslında, ya srcElement ya da tarayıcılara göre hedefleniyor. Bu soruya bakın: stackoverflow.com/questions/5301643/…
Thierry Templier

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

4
Bunu kullanmayı var target = event.srcElement.attributes.id || event.currentTarget.id;
bitirdim

37

TypeScript kullanıcıları için:

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

5
Bence kabul edilen cevap bu olmalı, ancak olabilir const elementId: string = (event.target as Element).id;
Harish

1
bu benim için boş dönüyor. Boş veya tanımlanmamış değil ama boş
Darren Street

Teşekkürler. Konsolda hepsini görebildiğim halde hedefin veya srcTarget'ın bir özelliğini neden kontrol edemediğim için kafam karışmıştı. Element olarak yayınla, ha.
Jeremy L

Bu kesinlikle en iyi cevap olmalı.
NobodySomewhere

19

Sonunda en basit yolu buldu:

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

Bu biraz yanıltıcı olabilir: eğer düğmenizde olduğu gibi bazı HTML içeriği <button ...><i class="fa fa-check"></i></button>varsa ve aslında iFontAwasome bileşeni olan bu öğeyi tıklarsanız, event.target bir öğe buttondeğil, iöğedir.
Skorunka František

2
buttonEleman kullanımı elde etmek için event.target.closest('button').
Skorunka František

19

Sadece statik bir değer (veya bir değişken *ngForveya her neyse) iletebilirsiniz

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

idBöyle bir durumda kullanmaktan kaçınmanın daha iyi olacağını düşünüyor musunuz?
sreginogemoh

1
Tek amaç onu olay parametresi olarak geçirmekse, o zaman bir id kullanmam.
Günter Zöchbauer

1
Kullanmak yerine, idbir diziden bir dizin seçin. En basit çözümleri bu kadar sık ​​gözden kaçırmamız genellikle şaşırtıcıdır.
Yuri

9

Tüm etkinliği geçmenize gerek yoktur (olayın belirttiğinizden başka yönlerine ihtiyacınız olmadığı sürece). Aslında tavsiye edilmez. Eleman referansını sadece küçük bir değişiklikle geçebilirsiniz.

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

}

StackBlitz demosu

Teknik olarak, asıl öğeyi geçtiğiniz için tıklanan düğmeyi bulmanız gerekmez.

Açısal kılavuzluk


Bu, @ Greg'in Açısal kılavuzluğa Bağlantısı tarafından atıfta bulunulan doğru cevap olmalıdır!
Chrizzldi

4

When HTMLElementbir yok id, nameya classçağrısına,

sonra kullan

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

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

2

bunu basitçe yapın: (burada yorumda söylendiği gibi iki yöntemle örnek)

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.idbenim durumumda tanımsız nedenini bilmiyorum ... ama bir idinevent.currentTarget.id
sreginogemoh buldum


1
@sreginogemoth ayrıca kontrol edebilirsiniz: event.target.idaynı zamanda kimlik değerine de sahip olabilir
Arthur


0

idAçısal 6'daki düğmenin özelliğine erişmek istiyorsanız bu kodu izleyin

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

senin iddeğerin,

değeri valueIS myId.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.