【问题标题】:Angular2 get clicked element idAngular2获取点击的元素ID
【发布时间】:2016-06-30 15:12:47
【问题描述】:

我有这样的点击事件

 <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

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

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

我正在使用 chrome 最新版本 49.0.2623.87 m

会不会是Material Design Lite 的东西?因为我正在使用它。

【问题讨论】:

  • 你想用id做什么?
  • 我有两个按钮触发相同的点击功能。所以我需要找出哪个被点击了
  • 只需将静态/动态id 与参数一起传递。
  • 为什么很难获得id
  • 刚刚在event.currentTarget.id找到了

标签: angular


【解决方案1】:

如果您想访问按钮的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

看到这个问题:

【讨论】:

  • event.srcElement.attributes.id 未定义不知道为什么...但我在event.currentTarget.id 中找到了id
  • 真的吗?你看到我的plunkr了吗?这是我使用的,它不是未定义的......在我的情况下(Chrome),currentTarget 是未定义的 :-( 你使用哪个浏览器?
  • 其实根据浏览器,要么是srcElement,要么是target。看到这个问题:stackoverflow.com/questions/5301643/…
  • 铬:angular2.dev.js:23597 TypeError: Cannot read property 'nodeValue' of undefined
  • 我最终使用了这个var target = event.srcElement.attributes.id || event.currentTarget.id;
【解决方案2】:

对于 TypeScript 用户:

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

【讨论】:

  • 在我看来这应该是公认的答案。不过也可以是const elementId: string = (event.target as Element).id;
  • 对我来说返回空白。不为空或未定义但为空白
  • 谢谢。当我可以在控制台中看到它们全部时,我很困惑为什么我不能直接检查目标或 srcTarget 的属性。扮演元素,呵呵。
  • 这绝对应该是最佳答案。
  • @DarrenStreet 你是怎么解决的?对我来说也是空白
【解决方案3】:

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

<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 内容,比如&lt;button ...&gt;&lt;i class="fa fa-check"&gt;&lt;/i&gt;&lt;/button&gt;,而你实际上点击了那个 i 元素,它是 FontAwasome 组件,那么 event.target 不是buttoni 元素。
  • 要获取button 元素,请使用event.target.closest('button')
【解决方案4】:

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

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

【讨论】:

  • 您认为在这种情况下最好避免使用id 吗?
  • 如果唯一的目的是将它作为事件参数传递,那么我不会使用 id。
  • 而不是使用id,只需从数组中选择一个索引。我们如此频繁地忽视最直接的解决方案,这常常令人惊讶。
【解决方案5】:

没有必要传递整个事件(除非您需要事件的其他方面而不是您声明的)。事实上,不建议这样做。您只需稍作修改即可传递元素引用。

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 demo

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

Angular guidance

【讨论】:

  • 这应该是@Greg's Link to the Angular guide 所指的正确答案!
【解决方案6】:

当您的HTMLElement 没有idnameclass 可供调用时,

然后使用

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

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

【讨论】:

    【解决方案7】:

    您可以使用它的接口 HTMLButtonElement 继承自其父级HTMLElement

    这样你就可以自动完成...

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

    To see all list of HTMLElement from the World Wide Web Consortium (W3C) documentation

    StackBlitz demo

    【讨论】:

      【解决方案8】:

      简单地这样做:(如评论中所说,这里有两种方法的示例)

      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

      【讨论】:

      • event.srcElement.attributes.id 在我的情况下未定义不知道为什么...但我在event.currentTarget.id 中找到了id
      • 只需在event 触发的对象中结帐即可看到id
      • @sreginogemoth 你也可以查看:event.target.id 也可以有id值
      【解决方案9】:

      对于嵌套的 html,使用closest

      <button (click)="toggle($event)" class="someclass" id="btn1">
          <i class="fa fa-user"></i>
      </button>
      
      toggle(event) {
         (event.target.closest('button') as Element).id; 
      }
      

      【讨论】:

        【解决方案10】:

        如果您想访问 Angular 6 中按钮的 id 属性,请遵循此代码

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

        【讨论】:

          【解决方案11】:

          您可以通过名称检索属性的值,从而使您能够获取自定义属性的值,例如指令中的属性:

          <button (click)="toggle($event)" id="btn1" myCustomAttribute="somevalue"></button>
          
          
          toggle( event: Event ) {
            const eventTarget: Element = event.target as Element;
            const elementId: string = eventTarget.id;
            const attribVal: string = eventTarget.attributes['myCustomAttribute'].nodeValue;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-12
            • 2022-07-19
            • 2017-05-26
            • 1970-01-01
            • 2012-06-24
            相关资源
            最近更新 更多