2013-07-16 2 views
3

В обработчике событий мне нужно определить элемент DOM, который был нажат. Я ожидал бы использовать jqEvent.target.attributes ['tag'], где jqEvent имеет тип JQueryEventObject. Но «цель» определена в lib.d.ts по типу EventTarget, которая не содержит ничего, что я могу использовать ...JQueryEventObject & target

Я что-то пропустил?

+2

lib.d.ts как любой файл декларации - не последнее слово о том, что произойдет. Если jqEvent действительно имеет тип JQueryEventObject, вы всегда можете его отличить. –

ответ

5

Я использую это и она отлично работает ...

private funct(event: JQueryEventObject) { 
     var state = $(event.target).prop('checked'); 
    } 
+0

Дополнительная информация о параметре '$ event': https://docs.angularjs.org/guide/expression#-event- – rinogo

+0

@rinogo Мы говорим о JQuery, а не о угловом ...: D –

+0

Спасибо за разъяснение, @ Матей Покорны! FWIW, Angular по-прежнему использует «jqLite» (или полный jQuery, если он загружен), поэтому это все еще актуально. Ваш ответ помог мне с помощью Angrow-based Typcript, поэтому спасибо! :) Я оставлю свою ссылку в случае, если она поможет любому из Angular peeps, который ударил этот вопрос. – rinogo

-1

Я думаю, что это на самом деле ошибка в декларации. Предполагается, что он имеет тип JQuery. Но это может быть отлит либо машинописью построить

<JQuery>(event.target)[0].attributes['id']; 

или в качестве параметра конструктору для JQuery

$(event.target)[0].attributes['id']; 
+0

Это близко, но технически некорректно. ["Объект является экземпляром объекта события jQuery, когда присутствует jQuery или аналогичный объект jqLite."] (Https://docs.angularjs.org/guide/expression#-event-) – rinogo

0

Вот определение EventTarget (найденные в dom.generated.d.ts, распределенный с машинописью):

interface EventTarget { 
    removeEventListener(type: string, listener: EventListener, useCapture?: boolean): void; 
    addEventListener(type: string, listener: EventListener, useCapture?: boolean): void; 
    dispatchEvent(evt: Event): boolean; 
} 

Для прикрепления событий могут быть другие классы, которые реализуют EventTarget, поэтому самым безопасным определением API является установка Event.target к объекту, который реализует EventTarget, где подключены слушатели.

В контексте jQuery Event.target почти наверняка будет иметь тип HTMLElement (не тип JQuery как в ответе Андрее). Для вашего примера jqEvent.target.attributes['tag'], правильный путь, чтобы сообщить компилятору, что это на самом деле является Node (прародитель интерфейс HTMLElement), который действительно имеет attributes свойство:

(<Node> jqEvent.target).attributes['tag'] 

выше литой также может быть HTMLElement если вы явно обращаетесь к свойствам более конкретного интерфейса. Использование наиболее общего интерфейса возможно считается объектно-ориентированной передовой практикой.

Смежные вопросы