Angular2 получить идентификатор элемента с щелчком

88

У меня такое событие щелчка

 <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- undefined event.currentTarget.id- имеет значение

Я использую Chrome последней версии 49.0.2623.87 m

Может ли это быть Material Design Lite? потому что я им пользуюсь.

введите описание изображения здесь

срегиногемох
источник
что ты хочешь делать id?
Pardeep Jain
У меня есть две кнопки, запускающие одну и ту же функцию щелчка. Итак, мне нужно узнать, какой из них был
нажат
просто передайте static / dynamic idвместе с параметрами.
Pardeep Jain
почему так сложно получить id?
sreginogemoh
1
только что обнаружил, что вevent.currentTarget.id
срегиногемох

Ответы:

144

Если вы хотите получить доступ к 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не определено не знаю почему ... но я нашел idвevent.currentTarget.id
срегиногемох
В самом деле? Вы видели мой плункер? Это то, что я использую, и это не undefined ... В моем случае (Chrome) currentTargetне определено :-( Какой браузер вы используете?
Тьерри Темплиер,
Фактически, это либо srcElement, либо таргетинг на соответствующие браузеры. См. Этот вопрос: stackoverflow.com/questions/5301643/…
Тьерри Темплиер
4
Chrome:angular2.dev.js:23597 TypeError: Cannot read property 'nodeValue' of undefined
sreginogemoh
4
В итоге я использую этоvar target = event.srcElement.attributes.id || event.currentTarget.id;
sreginogemoh
37

Для пользователей TypeScript:

    toggle(event: Event): void {
        let elementId: string = (event.target as Element).id;
        // do something with the id... 
    }
quidkid
источник
5
На мой взгляд, это должен быть принятый ответ. Как бы то ни было, const elementId: string = (event.target as Element).id;
Хариш,
1
это возвращается для меня пустым. Не ноль или не определено, но пусто
Даррен-стрит
Благодарю. Я был так сбит с толку, почему я не могу проверить свойство target или srcTarget напрямую, когда я мог видеть их все в консоли. В ролях как элемент, да.
Джереми Л.
Это определенно должен быть главный ответ.
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 - это не элемент, buttonа iэлемент.
Skorunka František
2
Чтобы получить buttonэлемент, используйте event.target.closest('button').
Skorunka František
19

Вы можете просто передать статическое значение (или переменную из *ngForили что-то еще)

<button (click)="toggle(1)" class="someclass">
<button (click)="toggle(2)" class="someclass">
Гюнтер Цёхбауэр
источник
Как вы думаете, лучше не использовать idв таком случае?
sreginogemoh
1
Если единственная цель - передать его как параметр события, я бы не стал использовать идентификатор.
Günter Zöchbauer
1
Вместо использования idпросто выберите индекс из массива или около того. Часто удивительно, что мы так часто упускаем из виду самые простые решения.
Юрий
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не имеет id, nameили classдля вызова,

затем используйте

<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не определено в моем случае не знаю почему ... но я нашел idвevent.currentTarget.id
срегиногемох
просто проверьте в Объекте eventувольнения, где вы можете видетьid
Пардип Джайн
1
@sreginogemoth, вы также можете проверить: event.target.idон также может иметь значение id
Артур
2

Вы можете использовать его интерфейс 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);
 }

Чтобы увидеть весь список HTMLElement из документации Консорциума World Wide Web (W3C)

Демо StackBlitz

А. Морель
источник
0

Если вы хотите получить доступ к idатрибуту кнопки в angular 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в значении,

величина valueIS myId.

Эхсан
источник