aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVojta Jina2011-05-31 22:52:44 +0200
committerIgor Minar2011-06-02 10:50:39 -0700
commit50076b571da522cf6d2cb92c28519694727e9c31 (patch)
tree778d736825ca6b03784af7ce020ec7511a270dcc
parentaa64d37a23d743d325b9d95cd4725042cca430db (diff)
downloadangular.js-50076b571da522cf6d2cb92c28519694727e9c31.tar.bz2
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
-rw-r--r--regression/issue-353.html18
-rw-r--r--src/Browser.js4
-rw-r--r--test/BrowserSpecs.js27
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 = '';
+ });
+ });
});
});