diff options
| -rw-r--r-- | regression/issue-353.html | 18 | ||||
| -rw-r--r-- | src/Browser.js | 4 | ||||
| -rw-r--r-- | test/BrowserSpecs.js | 27 |
3 files changed, 46 insertions, 3 deletions
diff --git a/regression/issue-353.html b/regression/issue-353.html new file mode 100644 index 00000000..8410adf4 --- /dev/null +++ b/regression/issue-353.html @@ -0,0 +1,18 @@ +<!DOCTYPE HTML> +<html xmlns:ng="http://angularjs.org"> + <script type="text/javascript" src="../build/angular.js" ng:autobind></script> + <script type="text/javascript"> + function Cntl($route) { + $route.when('/item1', {}); + $route.when('/item2', {}); + $route.onChange(function() { + alert('change'); + }); + } + Cntl.$inject = ['$route']; + </script> + <body ng:controller="Cntl"> + <a href="#/item1">test</a> + <a href="#/item2">test</a> + </body> +</html> diff --git a/src/Browser.js b/src/Browser.js index 31f2c7f3..80cabe02 100644 --- a/src/Browser.js +++ b/src/Browser.js @@ -249,7 +249,9 @@ function Browser(window, document, body, XHR, $log) { * @return {function()} Returns the registered listener fn - handy if the fn is anonymous. */ self.onHashChange = function(listener) { - if ('onhashchange' in window) { + // IE8 comp mode returns true, but doesn't support hashchange event + var dm = window.document.documentMode; + if ('onhashchange' in window && (isUndefined(dm) || dm >= 8)) { jqLite(window).bind('hashchange', listener); } else { var lastBrowserUrl = self.getUrl(); diff --git a/test/BrowserSpecs.js b/test/BrowserSpecs.js index 635909a7..e01506dc 100644 --- a/test/BrowserSpecs.js +++ b/test/BrowserSpecs.js @@ -418,7 +418,10 @@ describe('browser', function(){ it('should use $browser poller to detect url changes when onhashchange event is unsupported', function() { - fakeWindow = {location: {href:"http://server"}}; + fakeWindow = { + location: {href:"http://server"}, + document: {} + }; browser = new Browser(fakeWindow, {}, {}); @@ -455,7 +458,8 @@ describe('browser', function(){ onHashChngListener = listener; }, removeEventListener: angular.noop, - detachEvent: angular.noop + detachEvent: angular.noop, + document: {} }; fakeWindow.onhashchange = true; @@ -479,5 +483,24 @@ describe('browser', function(){ jqLite(fakeWindow).dealoc(); } }); + + // asynchronous test + it('should fire onHashChange when location.hash change', function() { + var callback = jasmine.createSpy('onHashChange'); + browser = new Browser(window, {}, {}); + browser.onHashChange(callback); + + window.location.hash = 'new-hash'; + browser.startPoller(100, setTimeout); + + waitsFor(function() { + return callback.callCount; + }, 'onHashChange callback to be called', 1000); + + runs(function() { + if (!jQuery) jqLite(window).dealoc(); + window.location.hash = ''; + }); + }); }); }); |
