mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-16 23:30:23 +00:00
fix($location): url rewriting if element was removed
When user clicks a link, $location needs to intercept this event. The <a> doesn't have to be target element of the DOM event, so it needs to traverse the DOM, to find first <a> parent. If the target element was removed from DOM, during the same event, it would throw an exception. This fixes the issue. Closes #1058
This commit is contained in:
parent
ad5d2f2991
commit
3da4194f98
2 changed files with 17 additions and 2 deletions
|
|
@ -550,8 +550,8 @@ function $LocationProvider(){
|
|||
|
||||
// traverse the DOM up to find first A tag
|
||||
while (lowercase(elm[0].nodeName) !== 'a') {
|
||||
if (elm[0] === $rootElement[0]) return;
|
||||
elm = elm.parent();
|
||||
// ignore rewriting if no A tag (reached root element, or no parent - removed from document)
|
||||
if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;
|
||||
}
|
||||
|
||||
var absHref = elm.prop('href'),
|
||||
|
|
|
|||
|
|
@ -1087,6 +1087,21 @@ describe('$location', function() {
|
|||
expect(event.preventDefault).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// regression https://github.com/angular/angular.js/issues/1058
|
||||
it('should not throw if element was removed', inject(function($document, $rootElement, $location) {
|
||||
// we need to do this otherwise we can't simulate events
|
||||
$document.find('body').append($rootElement);
|
||||
|
||||
$rootElement.html('<button></button>');
|
||||
var button = $rootElement.find('button');
|
||||
|
||||
button.bind('click', function() {
|
||||
button.remove();
|
||||
});
|
||||
browserTrigger(button, 'click');
|
||||
}));
|
||||
});
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue