2014-11-01 5 views
6

От ngTouch ngClick documentation:ngTouch ngClick не пузырь

Более мощная замена по умолчанию ngClick предназначен для использования на устройствах с сенсорными экранами. Большинство мобильных браузеров ждут около 300 мс после нажатия и выпуска, прежде чем отправлять событие click. Эта версия обрабатывает их немедленно, а затем предотвращает распространение следующего события click.

Это создает непоследовательное поведение в том, что на компьютере событие click продолжает пузыриться/распространяться, но на мобильном устройстве оно останавливается. Это означает, что любые директивы, более высокие в dom, которые прослушивают клики элементов, терпят неудачу. Кажется, это ошибка для меня, но я не должен быть первым, кто должен обойти это.

Если вы посмотрите на ngTouch code, the problem stems from line 453

element.triggerHandler('click', [event]); 

Angular docs:

angular.element делегаты Угловой встроенный в подмножестве JQuery, которая называется "JQuery облегченным" или "jqLite."

jqLite имеет доступ к JQuery-х triggerHandler, но не trigger.

jQuery docs:

.triggerHandler() метод ведет себя аналогично .trigger(), со следующими исключениями:

  • События запускаемых с .triggerHandler() не пузыриться DOM- иерархия; если они не обрабатываются целевым элементом напрямую, они ничего не делают.

Так Угловые людям должны добавить поддержку trigger в jqLite и изменить эту строку в trigger для того, чтобы работать должным образом.

В то же время, как я могу обойти это? Есть ли способ использовать ngClick внутри пользовательской директивы?


Bonus для смеха: Comment from the ngTouch source code

// This is an ugly, terrible hack! 
// Yeah, tell me about it. 

ответ

2

Я заменил линии 453 с

element[0].dispatchEvent(new MouseEvent('click', event)); 

Он работает, как ожидается, на данный момент. Не уверен, что такое совместимость с браузером для new MouseEvent(), поэтому не стесняйтесь комментировать, если вы есть.

2

В дополнение к вышеуказанному решению, я также должен был добавить ng-click = "" к каждому из моих якорей, чтобы сделать эту работу.

примечание: я бы предпочел написать это как комментарий, но stackoverflow не чувствует, что я заслужил право. Прости.

1

Новые версии ngTouch 1.5.3+ больше не должно быть этой проблемы. См. https://github.com/angular/angular.js/commit/0dfc1dfebf26af7f951f301c4e3848ac46f05d7f

Это побочный продукт кода ngTocuh, предназначенный для преодоления проблемы задержки мобильного браузера 300 мс. Подробнее см. В разделе http://developer.telerik.com/featured/300-ms-click-delay-ios-8/.

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