获得原始href属性的方法

JavaScript里得到某个链接的href属性时,有三种方式,总结一下:

1. 直接获得href属性,也就是

var url = el.href;  // el是一个a元素

2. 使用getAttribute方法,像这样:

var url = el.getAttribute("href");

3. IE下的getAttribute方法有第二个参数,参见msdn的这篇。第二个参数如果是2,意思是以字符串形式返回。

var url = el.getAttribute("href", 2);

获得href属性的这三种方法,同样的,有三点,让人很费解,而且浏览器实现各不相同。

  1. 如果href写的是相对地址,得到属性时,浏览器可能会自动转为绝对地址。(很多情况下我们是不希望这样的)
  2. 如果href里有汉字,浏览器会自动编码吗?
  3. 如果href里有特殊字符,浏览器会自动编码吗?例如大括号{}。

为此我做了一个小测试页面(点这里可测试),得到了如下的结果:

获得href和src属性的浏览器差异(相对地址与自动编码情况)
.href getAttribute(“href”) getAttribute(“href”, 2)
IE6 转绝对,不编码 转绝对,不编码 正常
IE7 转绝对,汉字不编码,特殊符号编码 转绝对,汉字不编码,特殊符号编码 正常
IE8 as IE7 转绝对,汉字不编码,特殊符号编码 转绝对,汉字不编码,特殊符号编码 正常
IE8 standard 转绝对,汉字不编码,特殊符号编码 正常 正常
Firefox 3.0+ 转绝对,全部编码 正常 正常
Chrome 2.0 转绝对,全部编码 正常 正常
Safari 4.0 转绝对,汉字编码,特殊符号不编码 正常 正常
Opera 10.0beta 转绝对,汉字编码,特殊符号不编码 正常 正常

其中,“正常”的意思是,得到href属性里原始链接,不自动转绝对地址、汉字和符号都不编码。

结论,如果想得到href里的未经转换、未经编码的原始内容,IE浏览器下全部使用getAttribute(“href”, 2),其他浏览器下使用getAttribute(“href”)即可,这在序列化DOM时会非常有用;如果想得到绝对地址、编不编码没关系,那就用href属性。

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

4 Comments »