diff options
| author | Misko Hevery | 2010-03-22 20:20:05 -0700 |
|---|---|---|
| committer | Misko Hevery | 2010-03-22 20:20:05 -0700 |
| commit | a8227086748e37c31c1bb71dec50c96d63c45eef (patch) | |
| tree | 80979da4e4124b57fa4962baf58bb326964b658e /src/Compiler.js | |
| parent | 7c87c17d08dbba318af1a149c0bbedb696b03458 (diff) | |
| download | angular.js-a8227086748e37c31c1bb71dec50c96d63c45eef.tar.bz2 | |
rudementary event bind and trigger for jqlite
Diffstat (limited to 'src/Compiler.js')
| -rw-r--r-- | src/Compiler.js | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/src/Compiler.js b/src/Compiler.js index ece44805..115ed094 100644 --- a/src/Compiler.js +++ b/src/Compiler.js @@ -50,7 +50,39 @@ Template.prototype = { //JQLite ////////////////////////////////// +var jqCache = {}; +var jqName = 'ng-' + new Date().getTime(); +var jqId = 1; +function jqNextId() { return jqId++; } + +var addEventListener = window.document.attachEvent ? + function(element, type, fn) { + element.attachEvent('on' + type, fn); + } : function(element, type, fn) { + element.addEventListener(type, fn, false); + }; + +var removeEventListener = window.document.detachEvent ? + function(element, type, fn) { + element.detachEvent('on' + type, fn); + } : function(element, type, fn) { + element.removeEventListener(type, fn, false); + }; + +function jqClearData(element) { + var cacheId = element[jqName], + cache = jqCache[cacheId]; + if (cache) { + foreach(cache.bind || {}, function(fn, type){ + removeEventListener(element, type, fn); + }); + delete jqCache[cacheId]; + delete element[jqName]; + } +}; + function JQLite(element) { + //todo: change to this[0]; this.element = element; } @@ -64,6 +96,67 @@ function jqLite(element) { } JQLite.prototype = { + data: function(key, value) { + var element = this.element, + cacheId = element[jqName], + cache = jqCache[cacheId || -1]; + if (isDefined(value)) { + if (!cache) { + element[jqName] = cacheId = jqNextId(); + cache = jqCache[cacheId] = {}; + } + cache[key] = value; + } else { + return cache ? cache[key] : null; + } + }, + + removeData: function(){ + jqClearData(this.element); + }, + + dealoc: function(){ + (function dealoc(element){ + jqClearData(element); + for ( var i = 0, children = element.childNodes; i < children.length; i++) { + dealoc(children[0]); + } + })(this.element); + }, + + bind: function(type, fn){ + var element = this.element, + bind = this.data('bind'), + eventHandler; + if (!bind) this.data('bind', bind = {}); + eventHandler = bind[type]; + if (!eventHandler) { + bind[type] = eventHandler = function() { + var self = this; + foreach(eventHandler.fns, function(fn){ + fn.apply(self, arguments); + }); + }; + eventHandler.fns = []; + addEventListener(element, type, eventHandler); + } + eventHandler.fns.push(fn); + }, + + trigger: function(type) { + var cache = this.data('bind'); + if (cache) { + (cache[type] || noop)(); + } + }, + + click: function(fn) { + if (fn) + this.bind('click', fn); + else + this.trigger('click'); + }, + eachTextNode: function(fn){ var i, chldNodes = this.element.childNodes || [], size = chldNodes.length, chld; for (i = 0; i < size; i++) { @@ -96,6 +189,7 @@ JQLite.prototype = { }, remove: function() { + this.dealoc(); this.element.parentNode.removeChild(this.element); }, |
