Angular2获取点击元素ID


85

我有这样的点击事件

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

我在函数输入参数中捕获了该事件,并希望找出确切单击了什么按钮。

toggle(event) {

}

event没有id财产。

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

我如何找到一个 id

更新: 柱塞都很好,但就我而言,我在本地有:

event.srcElement.attributes.id -未定义 event.currentTarget.id-具有值

我正在使用最新的Chrome版本49.0.2623.87 m

可能是Material Design Lite东西吗?因为我正在使用它。

在此处输入图片说明


您想做什么id
Pardeep Jain

我有两个触发相同点击功能的按钮。所以我需要找出哪个人被点击了
sreginogemoh

只需将静态/动态id以及性能参数一起传递。
Pardeep Jain

为什么很难获得id
sreginogemoh '16

1
刚刚发现event.currentTarget.id
sreginogemoh '16

Answers:


138

如果要访问id按钮的属性,则可以利用srcElement事件的属性:

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

看到这个plunkr:https ://plnkr.co/edit/QGdou4 ? p = preview

看到这个问题:


1
event.srcElement.attributes.id未定义不知道为什么...但我发现了一个idevent.currentTarget.id
sreginogemoh

真?你看到我的朋克了吗?这就是我使用的,并且不是不确定的...就我而言(Chrome),它currentTarget是不确定的:-(您使用哪个浏览器?
Thierry Templier,2016年

实际上,它要么是srcElement,要么是根据浏览器定位的目标。看到这个问题:stackoverflow.com/questions/5301643/...
亨利TEMPLIER

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

4
我最终使用了它var target = event.srcElement.attributes.id || event.currentTarget.id;
sreginogemoh '16

36

对于TypeScript用户:

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

5
在我看来,这应该是公认的答案。但是可能会如此 const elementId: string = (event.target as Element).id;
-Harish

1
这对我来说是一片空白。不是null或未定义,而是空白
Darren Street

谢谢。当我在控制台中看到所有目标时,为什么不能直接检查target或srcTarget的属性,我感到非常困惑。演员,元素,du。
杰里米L

这绝对应该是最佳答案。
NobodySomewhere

19

终于找到了最简单的方法:

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

这可能很棘手:如果您的按钮具有一些HTML内容,例如<button ...><i class="fa fa-check"></i></button>您实际上单击了那个i元素,它是FontAwasome组件,那么event.target不是abutton而是i元素。
SkorunkaFrantišek17年

2
要获取button元素,请使用event.target.closest('button')
SkorunkaFrantišek'17

18

您可以只传递静态值(或来自的变量*ngFor或其他)

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

您认为最好避免使用id这种情况吗?
sreginogemoh '16

1
如果唯一的目的是将其作为事件参数传递,那么我不会使用id。
君特Zöchbauer

1
而不是id仅从数组左右选择索引。我们经常忽略最直接的解决方案常常令人感到惊讶。
Yuri

9

无需传递整个事件(除非您需要该事件的其他方面,除非您已声明)。实际上,不建议这样做。您只需稍加修改即可传递元素引用。

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演示

从技术上讲,您不需要找到被单击的按钮,因为您已经传递了实际的元素。

角度引导


这应该是@Greg的Angular指南链接所引用的正确答案!
Chrizzldi

4

当你HTMLElement不具备idnameclass打电话,

然后使用

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

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

2

简单地做到这一点:(如评论中所说,这里是带有两个方法的示例)

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

演示:http : //plnkr.co/edit/5kJaj9D13srJxmod213r?p=preview


4
event.srcElement.attributes.id在我的情况是不确定的,不知道为什么...但我发现了一个idevent.currentTarget.id
sreginogemoh

只需在被event解雇的对象中结帐即可,您会看到id
Pardeep Jain

1
您还可以检查@sreginogemoth:event.target.id它也可以具有id值
亚瑟


0

如果要访问id角度6中的按钮属性,请遵循以下代码

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

您的 id的价值,

的值value就是myId

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.