From 2a30a02f015dd54846bb62d1f05e82b3cf76ef9f Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Tue, 27 Jul 2010 15:54:50 -0700 Subject: fix preventDefault for events --- src/directives.js | 4 ++-- src/jqLite.js | 15 ++++----------- src/widgets.js | 5 +++-- 3 files changed, 9 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/directives.js b/src/directives.js index ffe37890..9aadbd11 100644 --- a/src/directives.js +++ b/src/directives.js @@ -199,10 +199,10 @@ angularWidget("@ng:repeat", function(expression, element){ angularDirective("ng:click", function(expression, element){ return function(element){ var self = this; - element.bind('click', function(){ + element.bind('click', function(event){ self.$tryEval(expression, element); self.$root.$eval(); - return false; + event.preventDefault(); }); }; }); diff --git a/src/jqLite.js b/src/jqLite.js index cff9ae00..26ca6dea 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -104,19 +104,12 @@ JQLite.prototype = { eventHandler = bind[type]; if (!eventHandler) { bind[type] = eventHandler = function(event) { - var bubbleEvent = false; + if (!event.preventDefault) { + event.returnValue = false; + } foreach(eventHandler.fns, function(fn){ - bubbleEvent = bubbleEvent || fn.call(self, event); + fn.call(self, event); }); - if (!bubbleEvent) { - if (msie) { - event.returnValue = false; - event.cancelBubble = true; - } else { - event.preventDefault(); - event.stopPropagation(); - } - } }; eventHandler.fns = []; addEventListener(element, type, eventHandler); diff --git a/src/widgets.js b/src/widgets.js index 5f0fcf7c..87a302fa 100644 --- a/src/widgets.js +++ b/src/widgets.js @@ -198,14 +198,15 @@ function inputWidget(events, modelAccessor, viewAccessor, initFn) { this.$eval(element.attr('ng:init')||''); // Don't register a handler if we are a button (noopAccessor) and there is no action if (action || modelAccessor !== noopAccessor) { - element.bind(events, function(){ + element.bind(events, function(event){ model.set(view.get()); lastValue = model.get(); scope.$tryEval(action, element); scope.$root.$eval(); // if we have noop initFn than we are just a button, // therefore we want to prevent default action - return initFn != noop; + if(initFn == noop) + event.preventDefault(); }); } view.set(lastValue = model.get()); -- cgit v1.2.3 From 6bd8006edcbfe1dc1be8cb865fbcfe25157fe117 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 27 Jul 2010 16:53:23 -0700 Subject: fix IE native mothods are not functions, and preventDefault --- src/Angular.js | 19 ++++++++++++------- src/Parser.js | 13 +++++-------- src/jqLite.js | 4 +++- 3 files changed, 20 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/Angular.js b/src/Angular.js index 850fe34c..32e3ccf7 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -293,13 +293,18 @@ function escapeAttr(html) { function bind(_this, _function) { var curryArgs = slice.call(arguments, 2, arguments.length); - return curryArgs.length == 0 ? - function() { - return _function.apply(_this, arguments); - } : - function() { - return _function.apply(_this, curryArgs.concat(slice.call(arguments, 0, arguments.length))); - }; + if (typeof _function == 'function') { + return curryArgs.length == 0 ? + function() { + return _function.apply(_this, arguments); + } : + function() { + return _function.apply(_this, curryArgs.concat(slice.call(arguments, 0, arguments.length))); + } + } else { + // in IE, native methonds ore not functions and so they can not be bound (but they don't need to be) + return function(a, b, c, d, e){ return _function(a, b, c, d, e); }; + } } function outerHTML(node) { diff --git a/src/Parser.js b/src/Parser.js index 5c2307e4..5eb75713 100644 --- a/src/Parser.js +++ b/src/Parser.js @@ -599,14 +599,11 @@ Parser.prototype = { for ( var i = 0; i < argsFn.length; i++) { args.push(argsFn[i](self)); } - var fnPtr = fn(self); - if (typeof fnPtr === 'function') { - return fnPtr.apply(self, args); - } else if (fnPtr === undefined) { - return fnPtr; - } else { - throw "Expression '" + fn.isAssignable + "' is not a function."; - } + var fnPtr = fn(self) || noop; + // IE stupidity! + return fnPtr.apply ? + fnPtr.apply(self, args) : + fnPtr(args[0], args[1], args[2], args[3], args[4]); }; }, diff --git a/src/jqLite.js b/src/jqLite.js index 26ca6dea..04682754 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -105,7 +105,9 @@ JQLite.prototype = { if (!eventHandler) { bind[type] = eventHandler = function(event) { if (!event.preventDefault) { - event.returnValue = false; + event.preventDefault = function(){ + event.returnValue = false; + } } foreach(eventHandler.fns, function(fn){ fn.call(self, event); -- cgit v1.2.3 From 1b768b84439e725010acc943ebfda462e49d3704 Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Thu, 29 Jul 2010 12:50:14 -0700 Subject: refactored $location service so that it correctly updates under all conditions --- src/Angular.js | 6 +-- src/angular-bootstrap.js | 6 +-- src/formatters.js | 1 + src/jqLite.js | 2 +- src/services.js | 95 ++++++++++++++++++++++++++++-------------------- 5 files changed, 63 insertions(+), 47 deletions(-) (limited to 'src') diff --git a/src/Angular.js b/src/Angular.js index 32e3ccf7..80acddf0 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -300,10 +300,10 @@ function bind(_this, _function) { } : function() { return _function.apply(_this, curryArgs.concat(slice.call(arguments, 0, arguments.length))); - } + }; } else { - // in IE, native methonds ore not functions and so they can not be bound (but they don't need to be) - return function(a, b, c, d, e){ return _function(a, b, c, d, e); }; + // in IE, native methods ore not functions and so they can not be bound (but they don't need to be) + return _function; } } diff --git a/src/angular-bootstrap.js b/src/angular-bootstrap.js index 90e1104e..e055371a 100644 --- a/src/angular-bootstrap.js +++ b/src/angular-bootstrap.js @@ -22,16 +22,14 @@ * THE SOFTWARE. */ (function(previousOnLoad){ - var filename = /(.*)\/angular-(.*).js(#(.*))?/, + var filename = /(.*)\/angular-(.*).js(#.*)?/, scripts = document.getElementsByTagName("SCRIPT"), serverPath, - config, match; for(var j = 0; j < scripts.length; j++) { match = (scripts[j].src || "").match(filename); if (match) { serverPath = match[1]; - config = match[4]; } } @@ -63,7 +61,7 @@ try { if (previousOnLoad) previousOnLoad(); } catch(e) {} - angularInit(parseKeyValue(config)); + angularInit(parseKeyValue(angularJsConfig(document))); }; })(window.onload); diff --git a/src/formatters.js b/src/formatters.js index 40462cf3..ca1ce83e 100644 --- a/src/formatters.js +++ b/src/formatters.js @@ -5,6 +5,7 @@ var NUMBER = /^\s*[-+]?\d*(\.\d*)?\s*$/; extend(angularFormatter, { 'noop':formatter(identity, identity), + 'json':formatter(toJson, fromJson), 'boolean':formatter(toString, toBoolean), 'number':formatter(toString, function(obj){ diff --git a/src/jqLite.js b/src/jqLite.js index 04682754..22b3c070 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -107,7 +107,7 @@ JQLite.prototype = { if (!event.preventDefault) { event.preventDefault = function(){ event.returnValue = false; - } + }; } foreach(eventHandler.fns, function(fn){ fn.call(self, event); diff --git a/src/services.js b/src/services.js index 106f8954..3dd7df09 100644 --- a/src/services.js +++ b/src/services.js @@ -7,61 +7,78 @@ var URL_MATCH = /^(file|ftp|http|https):\/\/(\w+:{0,1}\w*@)?([\w\.-]*)(:([0-9]+) var HASH_MATCH = /^([^\?]*)?(\?([^\?]*))?$/; var DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp':21}; angularService("$location", function(browser){ - var scope = this, location = {parse:parseUrl, toString:toString}; - var lastHash, lastUrl; + var scope = this, + location = {parse:parseUrl, toString:toString, update:update}, + lastLocation = {}; + + browser.watchUrl(function(url){ + update(url); + scope.$root.$eval(); + }); + this.$onEval(PRIORITY_FIRST, update); + this.$onEval(PRIORITY_LAST, update); + update(browser.getUrl()); + return location; + + function update(href){ + if (href) { + parseUrl(href); + } else { + href = check('href') || check('protocol', '://', 'host', ':', 'port', '', 'path', '?', 'search'); + var hash = check('hash'); + if (isUndefined(hash)) hash = check('hashPath', '?', 'hashSearch'); + if (isDefined(hash)) { + href = (href || location.href).split('#')[0]; + href+= '#' + hash; + } + if (isDefined(href)) { + parseUrl(href); + browser.setUrl(href); + } + } + } + + function check() { + var i = -1, + length=arguments.length, + name, seperator, parts = [], + value, same = true; + for(; i