Angular2 nhận id phần tử được nhấp


85

Tôi có một sự kiện nhấp chuột như vậy

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

Tôi đang nắm bắt sự kiện trong tham số đầu vào hàm của mình và muốn tìm hiểu chính xác nút nào đã được nhấp.

toggle(event) {

}

nhưng eventkhông có idtài sản.

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

Làm thế nào tôi có thể tìm thấy một id?

CẬP NHẬT: Tất cả các hố cát đều tốt nhưng trong trường hợp của tôi, tôi có cục bộ:

event.srcElement.attributes.id- không xác định event.currentTarget.id- có giá trị

Tôi đang sử dụng chrome Phiên bản mới nhất 49.0.2623.87 m

Nó có thể là Material Design Liteđiều? bởi vì tôi đang sử dụng nó.

nhập mô tả hình ảnh ở đây


những gì bạn muốn làm gì với id?
Pardeep Jain

Tôi có hai nút kích hoạt cùng một chức năng nhấp chuột. Vì vậy, tôi cần tìm xem cái nào đã được nhấp vào
sreginogemoh

chỉ cần chuyển static / dynamic idcùng với perameters.
Pardeep Jain

tại sao rất khó để có được một id?
sreginogemoh

1
vừa tìm thấy điều đó trongevent.currentTarget.id
sreginogemoh

Câu trả lời:


139

Nếu bạn muốn có quyền truy cập vào idthuộc tính của nút, bạn có thể tận dụng thuộc srcElementtính của sự kiện:

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

Xem plunkr này: https://plnkr.co/edit/QGdou4?p=preview .

Xem câu hỏi này:


1
event.srcElement.attributes.idlà undefined không biết tại sao ... nhưng tôi tìm thấy một idtrongevent.currentTarget.id
sreginogemoh

Có thật không? Bạn có thấy plunkr của tôi không? Đó là những gì tôi sử dụng và nó không undefined ... Trong trường hợp của tôi (Chrome), currentTargetlà undefined :-( trình duyệt nào bạn sử dụng?
Thierry Templier

Trên thực tế, đó là srcElement hoặc target theo trình duyệt. Xem câu hỏi này: stackoverflow.com/questions/5301643/…
Thierry Templier,

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

4
Tôi kết thúc việc sử dụng cái nàyvar target = event.srcElement.attributes.id || event.currentTarget.id;
sreginogemoh

36

Đối với người dùng TypeScript:

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

5
Điều này sẽ là câu trả lời được chấp nhận trong opinion.However của tôi nó có thể được const elementId: string = (event.target as Element).id;
Harish

1
trả về trống cho tôi. Không rỗng hoặc không xác định nhưng trống
Darren Street

Cảm ơn. Tôi rất bối rối tại sao tôi không thể kiểm tra trực tiếp thuộc tính của target, hoặc srcTarget, khi tôi có thể thấy tất cả chúng trong bảng điều khiển. Được chọn dưới dạng Element, duh.
Jeremy L

Đây chắc chắn phải là câu trả lời hàng đầu.
NobodySomewhere

19

Cuối cùng đã tìm ra cách đơn giản nhất:

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

Điều này có thể là một sự phức tạp: nếu nút của bạn có một số nội dung HTML, như <button ...><i class="fa fa-check"></i></button>và bạn thực sự nhấp vào iphần tử đó, là thành phần FontAwasome, thì event.target không phải là một phần tử buttonmà là một iphần tử.
Skorunka František

2
Để buttonsử dụng phần tử event.target.closest('button').
Skorunka František

18

Bạn chỉ có thể chuyển một giá trị tĩnh (hoặc một biến từ *ngForhoặc bất cứ thứ gì)

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

bạn có nghĩ là tốt hơn để tránh sử dụng một idtrong trường hợp như vậy?
sreginogemoh

1
Nếu mục đích duy nhất là chuyển nó dưới dạng tham số sự kiện thì tôi sẽ không sử dụng id.
Günter Zöchbauer

1
Thay vì sử dụng idchỉ chọn một chỉ mục từ một mảng hoặc lâu hơn. Thật ngạc nhiên là chúng ta thường xuyên bỏ qua các giải pháp thẳng thắn nhất.
Yuri

9

Không cần phải vượt qua toàn bộ sự kiện (trừ khi bạn cần các khía cạnh khác của sự kiện mà bạn đã nêu). Trong thực tế, nó không được khuyến khích. Bạn có thể chuyển tham chiếu phần tử chỉ với một chút sửa đổi.

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

}

Bản trình diễn StackBlitz

Về mặt kỹ thuật, bạn không cần phải tìm nút đã được nhấp vì bạn đã vượt qua phần tử thực tế.

Hướng dẫn góc


Đây phải là câu trả lời chính xác như được đề cập trong Liên kết đến hướng dẫn Angular của @ Greg!
Chrizzldi

4

Khi bạn HTMLElementkhông có id, namehoặc classkêu gọi,

sau đó sử dụng

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

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

2

làm như thế này đơn giản: (như đã nói trong nhận xét ở đây là ví dụ với hai phương pháp)

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.idlà undefined trong trường hợp của tôi không biết tại sao ... nhưng tôi tìm thấy một idtrongevent.currentTarget.id
sreginogemoh

chỉ cần thanh toán trong Đối tượng eventbị sa thải ở nơi bạn có thể nhìn thấyid
Pardeep Jain

1
@sreginogemoth bạn cũng có thể kiểm tra: event.target.idnó cũng có thể có giá trị id
Arthur

2

Bạn có thể sử dụng giao diện HTMLButtonElement kế thừa từ cha mẹ của nó HTMLElement!

Bằng cách này, bạn sẽ có thể tự động hoàn thành ...

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

Để xem tất cả danh sách HTMLElement từ tài liệu của World Wide Web Consortium (W3C)

Bản trình diễn StackBlitz


0

Nếu bạn muốn có quyền truy cập vào idthuộc tính của nút ở góc 6, hãy làm theo mã này

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

idgiá trị của bạn ,

giá trị của valuemyId.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.