Skip to content
This repository has been archived by the owner on Apr 12, 2024. It is now read-only.

Commit

Permalink
fix($location): url rewriting if element was removed
Browse files Browse the repository at this point in the history
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
  • Loading branch information
vojtajina committed Jun 20, 2012
1 parent ad5d2f2 commit 3da4194
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/ng/location.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'),
Expand Down
15 changes: 15 additions & 0 deletions test/ng/locationSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
}));
});


Expand Down

0 comments on commit 3da4194

Please sign in to comment.