From 50076b571da522cf6d2cb92c28519694727e9c31 Mon Sep 17 00:00:00 2001 From: Vojta Jina Date: Tue, 31 May 2011 22:52:44 +0200 Subject: Fix hashchange event on IE8 compatibility mode Stupid IE8 in compatibility mode or in IE7 mode returns true for `('onhashchange' in window)`, but does not support hashchange event. Closes #353 --- regression/issue-353.html | 18 ++++++++++++++++++ src/Browser.js | 4 +++- test/BrowserSpecs.js | 27 +++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 regression/issue-353.html 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 @@ + + + + + + test + test + + 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 = ''; + }); + }); }); }); -- cgit v1.2.3