从链接的href属性获取完整的URI

时间:2010-04-14 16:15:18

标签: javascript hyperlink

我想在某些方面得到确认。

我的目标是在从链接读取href属性时始终获取相同的字符串(在我的情况下是URI)。例如:

带有base_url = http://domain.name/

<a href="test.htm" /> 带有base_url = http://domain.name/domain/

<a href="../test.htm" /> 带有base_url的{p> <a href="http://domain.name/test.htm" /> =来自http://domain.name/

的任何文件夹

我需要从上面的3种情况中获得http://domain.name/test.htm(或任何其他相同的字符串)。

经过一些测试后,似乎my_a_dom_node.href始终返回完整限定的URI,包括http://domaine.name,这应该可以满足我的需要。

jQuery具有不同的行为,$(my_a_dom_node).attr('href')返回HTML中显示的内容(文本)。所以我的诀窍是使用$(my_a_dom_node).get(0).href来获取完整的URI。

问题是:我能依靠这个吗?

4 个答案:

答案 0 :(得分:21)

是的,你可以信赖!

当人们使用简单的javascript(没有jQuery)时,很多人问你要求的相反,他们想要得到href属性中写的真实url而不是完整的url,在这种情况下他们习惯于做:

my_a_dom_node.getAttribute('href', 2); //works both IE/FF

然后是jQuery帮助人们不浪费时间发现他们需要这样的代码,jQuery总是返回href属性中写的真实url。

有趣的是,现在有人问如何获取完整的URL,因为jQuery返回了href属性中写的那个。

答案 1 :(得分:13)

我知道这是一个老问题,但实际上这是第一个出现的条目,我相信添加额外的解决方案是件好事。自从jQuery推出了&#34; prop&#34;功能,获取完整的URL就像:

$(my_a_dom_node).prop('href');

我希望这仍然有助于某人。

答案 2 :(得分:10)

是的,你可以依靠这个。

通过jQuery(1.4.2)源代码,我看到正在使用的jQuery.attr()函数(浓缩到相关部分):

jQuery.extend({
  // ...
  attr: function( elem, name, value, pass ) {
    // ...

    var attr = !jQuery.support.hrefNormalized && notxml && special ?
               // Some attributes require a special call on IE
               elem.getAttribute( name, 2 ) :
               elem.getAttribute( name );

    // Non-existent attributes return null, we normalize to undefined
    return attr === null ? undefined : attr;    
  }
});

因此它有效地调用elem.getAttribute('href')返回实际属性值,而href属性按设计返回规范URL。

但是,有一个jQuery.support.hrefNormalized的引用,jQuery支持网站必须说:

  
      
  • hrefNormalized:如果.getAttribute()方法检索,则等于true   元素的href属性   没有改变,而不是正常化   到完全限定的URL。 (它是   在IE中目前是假的,URL是   归一化)。 DOM l3规范
  •   

这基本上意味着jQuery自己发现浏览器行为并相应地进行调整以提供一致的结果。

答案 3 :(得分:1)

您可以使用一些javascript重构完整的网址:

function parseLink(link) {
    var baseUrl = location.href.substring(0,location.href.lastIndexOf('/'));
    if (link.indexOf('/') != -1) {
        link = link.substring(link.lastIndexOf('/')); 
    } else {
        link = "/"+ link;
    }
    var fullUrl = baseUrl + link;
    return fullUrl
}