diff options
| author | Misko Hevery | 2012-02-10 21:16:50 -0800 | 
|---|---|---|
| committer | Misko Hevery | 2012-02-21 22:45:59 -0800 | 
| commit | c8ee631c1999fc87c0002bb27bd411fb953a726f (patch) | |
| tree | 7a0ffbb36db38a5c6f7c5fe9102c8b99d5ac8338 /src/jqLite.js | |
| parent | cae9ad4ba9c31dfa9e1aa2acc945dfc8242d1c72 (diff) | |
| download | angular.js-c8ee631c1999fc87c0002bb27bd411fb953a726f.tar.bz2 | |
feat(mouseenter/mouseleave): emulating ie events
Diffstat (limited to 'src/jqLite.js')
| -rw-r--r-- | src/jqLite.js | 112 | 
1 files changed, 72 insertions, 40 deletions
| diff --git a/src/jqLite.js b/src/jqLite.js index 751d9eb1..48dfcc20 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -467,6 +467,50 @@ forEach({    };  }); +function createEventHandler(element) { +  var eventHandler = function (event) { +    if (!event.preventDefault) { +      event.preventDefault = function() { +        event.returnValue = false; //ie +      }; +    } +    if (!event.stopPropagation) { +      event.stopPropagation = function() { +        event.cancelBubble = true; //ie +      }; +    } +    if (!event.target) { +      event.target = event.srcElement || document; +    } + +    if (isUndefined(event.defaultPrevented)) { +      var prevent = event.preventDefault; +      event.preventDefault = function() { +        event.defaultPrevented = true; +        prevent.call(event); +      }; +      event.defaultPrevented = false; +    } + +    event.isDefaultPrevented = function() { +      return event.defaultPrevented; +    }; + +    forEach(eventHandler.fns, function(fn){ +      fn.call(element, event); +    }); + +    // Remove monkey-patched methods (IE), +    // as they would cause memory leaks in IE8. +    // It shouldn't affect normal browsers, as their native methods are defined on prototype. +    delete event.preventDefault; +    delete event.stopPropagation; +    delete event.isDefaultPrevented; +  }; +  eventHandler.fns = []; +  return eventHandler; +}; +  //////////////////////////////////////////  // Functions iterating traversal.  // These functions chain results into a single @@ -477,53 +521,41 @@ forEach({    dealoc: JQLiteDealoc, -  bind: function(element, type, fn){ +  bind: function bindFn(element, type, fn){      var bind = JQLiteData(element, 'bind'); + +      if (!bind) JQLiteData(element, 'bind', bind = {});      forEach(type.split(' '), function(type){        var eventHandler = bind[type]; -      if (!eventHandler) { -        bind[type] = eventHandler = function(event) { -          if (!event.preventDefault) { -            event.preventDefault = function() { -              event.returnValue = false; //ie -            }; -          } -          if (!event.stopPropagation) { -            event.stopPropagation = function() { -              event.cancelBubble = true; //ie -            }; -          } -          if (!event.target) { -            event.target = event.srcElement || document; -          } - -          if (isUndefined(event.defaultPrevented)) { -            var prevent = event.preventDefault; -            event.preventDefault = function() { -              event.defaultPrevented = true; -              prevent.call(event); -            }; -            event.defaultPrevented = false; -          } -          event.isDefaultPrevented = function() { -            return event.defaultPrevented; -          }; -          forEach(eventHandler.fns, function(fn){ -            fn.call(element, event); +      if (!eventHandler) { +        if (type == 'mouseenter' || type == 'mouseleave') { +          var mouseenter = bind.mouseenter = createEventHandler(element); +          var mouseleave = bind.mouseleave = createEventHandler(element); +          var counter = 0; + + +          bindFn(element, 'mouseover', function(event) { +            counter++; +            if (counter == 1) { +              event.type = 'mouseenter'; +              mouseenter(event); +            }            }); - -          // Remove monkey-patched methods (IE), -          // as they would cause memory leaks in IE8. -          // It shouldn't affect normal browsers, as their native methods are defined on prototype. -          delete event.preventDefault -          delete event.stopPropagation -          delete event.isDefaultPrevented -        }; -        eventHandler.fns = []; -        addEventListenerFn(element, type, eventHandler); +          bindFn(element, 'mouseout', function(event) { +            counter --; +            if (counter == 0) { +              event.type = 'mouseleave'; +              mouseleave(event); +            } +          }); +          eventHandler = bind[type]; +        } else { +          eventHandler = bind[type] = createEventHandler(element); +          addEventListenerFn(element, type, eventHandler); +        }        }        eventHandler.fns.push(fn);      }); | 
