(event, type)
| 3726 | |
| 3727 | function createEventHandler(element, events) { |
| 3728 | var eventHandler = function(event, type) { |
| 3729 | // jQuery specific api |
| 3730 | event.isDefaultPrevented = function() { |
| 3731 | return event.defaultPrevented; |
| 3732 | }; |
| 3733 | |
| 3734 | var eventFns = events[type || event.type]; |
| 3735 | var eventFnsLength = eventFns ? eventFns.length : 0; |
| 3736 | |
| 3737 | if (!eventFnsLength) return; |
| 3738 | |
| 3739 | if (isUndefined(event.immediatePropagationStopped)) { |
| 3740 | var originalStopImmediatePropagation = event.stopImmediatePropagation; |
| 3741 | event.stopImmediatePropagation = function() { |
| 3742 | event.immediatePropagationStopped = true; |
| 3743 | |
| 3744 | if (event.stopPropagation) { |
| 3745 | event.stopPropagation(); |
| 3746 | } |
| 3747 | |
| 3748 | if (originalStopImmediatePropagation) { |
| 3749 | originalStopImmediatePropagation.call(event); |
| 3750 | } |
| 3751 | }; |
| 3752 | } |
| 3753 | |
| 3754 | event.isImmediatePropagationStopped = function() { |
| 3755 | return event.immediatePropagationStopped === true; |
| 3756 | }; |
| 3757 | |
| 3758 | // Some events have special handlers that wrap the real handler |
| 3759 | var handlerWrapper = eventFns.specialHandlerWrapper || defaultHandlerWrapper; |
| 3760 | |
| 3761 | // Copy event handlers in case event handlers array is modified during execution. |
| 3762 | if ((eventFnsLength > 1)) { |
| 3763 | eventFns = shallowCopy(eventFns); |
| 3764 | } |
| 3765 | |
| 3766 | for (var i = 0; i < eventFnsLength; i++) { |
| 3767 | if (!event.isImmediatePropagationStopped()) { |
| 3768 | handlerWrapper(element, event, eventFns[i]); |
| 3769 | } |
| 3770 | } |
| 3771 | }; |
| 3772 | |
| 3773 | // TODO: this is a hack for angularMocks/clearDataCache that makes it possible to deregister all |
| 3774 | // events on `element` |
no test coverage detected