fix($location): rewrite links with nested elements

For example:
<a href="some/link">inner <span>text</span></a>

If you click on "text", then the span element is event.target, so we need to traverse the DOM.
This commit is contained in:
Vojta Jina 2011-10-20 08:46:09 -07:00 committed by Igor Minar
parent c6c3949b14
commit 9b85757102
2 changed files with 20 additions and 6 deletions

View file

@ -442,12 +442,16 @@ angularServiceInject('$location', function($browser, $sniffer, $locationConfig,
// TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)
// currently we open nice url link and redirect then
if (uppercase(event.target.nodeName) != 'A' || event.ctrlKey || event.metaKey ||
event.which == 2) return;
if (event.ctrlKey || event.metaKey || event.which == 2) return;
var elm = jqLite(event.target),
href = elm.attr('href');
var elm = jqLite(event.target);
// traverse the DOM up to find first A tag
while (elm.length && lowercase(elm[0].nodeName) !== 'a') {
elm = elm.parent();
}
var href = elm.attr('href');
if (!href || isDefined(elm.attr('ng:ext-link')) || elm.attr('target')) return;
// remove same domain from full url links (IE7 always returns full hrefs)

View file

@ -556,10 +556,11 @@ describe('$location', function() {
var root, link, extLink, $browser, originalBrowser, lastEventPreventDefault;
function init(linkHref, html5Mode, supportHist, attrs) {
function init(linkHref, html5Mode, supportHist, attrs, content) {
var jqRoot = jqLite('<div></div>');
attrs = attrs ? ' ' + attrs + ' ' : '';
link = jqLite('<a href="' + linkHref + '"' + attrs + '>link</a>')[0];
content = content || 'link';
link = jqLite('<a href="' + linkHref + '"' + attrs + '>' + content + '</a>')[0];
root = jqRoot.append(link)[0];
jqLite(document.body).append(jqRoot);
@ -670,6 +671,15 @@ describe('$location', function() {
});
it('should rewrite when clicked span inside link', function() {
init('some/link', true, true, '', '<span>link</span>');
var span = jqLite(link).find('span');
browserTrigger(span, 'click');
expectRewriteTo('http://host.com/base/some/link');
});
// don't run next tests on IE<9, as browserTrigger does not simulate pressed keys
if (!(msie < 9)) {