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 = ''; +      }); +    });    });  });  | 
