aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMisko Hevery2012-02-10 21:16:50 -0800
committerMisko Hevery2012-02-21 22:45:59 -0800
commitc8ee631c1999fc87c0002bb27bd411fb953a726f (patch)
tree7a0ffbb36db38a5c6f7c5fe9102c8b99d5ac8338 /src
parentcae9ad4ba9c31dfa9e1aa2acc945dfc8242d1c72 (diff)
downloadangular.js-c8ee631c1999fc87c0002bb27bd411fb953a726f.tar.bz2
feat(mouseenter/mouseleave): emulating ie events
Diffstat (limited to 'src')
-rw-r--r--src/jqLite.js112
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);
});