如何从纯JavaScript中的<link标签获取属性?

WTF*_*gOn 13 javascript

<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://www.blogger.com/rsd.g?blogID=7487871339000666216" />
Run Code Online (Sandbox Code Playgroud)

如何在不使用任何JavaScript库的情况下获取此链接标记的href属性?

现在我正在使用下面的代码来实现这一目标,但我想知道是否有更简单的解决方案.

var links = document.getElementsByTagName("link");
for (i in links){
    var title = links[i].getAttribute("title");
    if ( title == "RSD"){
        var href = links[i].getAttribute("href");
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

jho*_*ter 35

现代浏览器支持querySelector()querySelectorAll():

document.querySelector("link[title=RSD]").getAttribute("href");
Run Code Online (Sandbox Code Playgroud)

请参阅浏览器支持的图表.

  • 请注意,IE 7及更低版本不支持此方法.也就是说,我会说"螺丝IE 7"并使用`querySelector`无论如何XD (5认同)

Poi*_*ars 7

原始代码:

<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://www.blogger.com/rsd.g?blogID=7487871339000666216" />
Run Code Online (Sandbox Code Playgroud)

...

var links = document.getElementsByTagName("link");
for (i in links){
  var title = links[i].getAttribute("title");
  if ( title == "RSD"){
    var href = links[i].getAttribute("href");
    break;
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 上面的标记是一个link元素,而不是"链接标记".

  2. 没有"javascript",几种不同的 ECMAScript实现.术语"javascript"具有误导性,不应该用作那些编程语言的总称.

    在Web浏览器中不能有"纯javascript",这是一个主机环境.甚至document指的是主机(提供的)对象,它不是任何核心语言的一部分(ECMAScript语言规范,5.1版[ECMA-262-5.1],第4节).

  3. 始终声明您的标识符(i未声明).不声明它们,从而不将它们附加到执行上下文,具有从泄漏到调用执行上下文到运行时错误的副作用.因此,此类代码不会在ECMAScript Ed中运行.5.x严格模式,它抛出ReferenceError异常(ECMA-262-5.1,第12.6.4和8.7.2节).

  4. 切勿将for- in语句与类似数组的对象一起使用,特别是在测试之外,不使用主机对象(links指一个).既不保证只考虑数字属性名称也不保证迭代顺序(ECMA-262-5.1,第12.6.4节).

  5. DRY:避免两次访问同一属性(您正在访问links[i]两次).否则结果将是程序中的更大变体(对象可能在此期间已经改变),并且该方法将是低效且难以维护的,不必要的.

  6. 避免调用元素对象的getAttribute()and setAttribute()方法,而不是访问具有getter和setter的属性属性.前者不太向后兼容并且已知不可靠,特别是在MSHTML/IE中,其中属性值和属性属性值之间没有适当的区别.

    var links = document.getElementsByTagName("link");
    for (var i = 0, len = links && links.length; i < len; ++i)
    {
      var link = links[i];
      if (link.title == "RSD")
      {
        var href = link.href;
        break;
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  7. 如果要快速引用元素,请使用id属性和document.getElementById()方法(还要考虑使用主机提供的集合):

    <link rel="EditURI" type="application/rsd+xml" title="RSD"
          href="http://www.blogger.com/rsd.g?blogID=7487871339000666216"
          id="mylink" />
    
    Run Code Online (Sandbox Code Playgroud)

    ...

    var link = document.getElementById("mylink");
    var href = link && link.href;
    
    Run Code Online (Sandbox Code Playgroud)
  8. 不要使用XHTML(语法),除非必须(如果它仍然有效,则删除尾部斜杠,请参阅W3C Validator).对于LINK必须位于元素内的特定HEAD元素,HTML 4.0版本中的语法错误没有标准化的补救措施. HTML5指定了它,但它仍然是工作草案,尚未在用户代理中完全实现.

  9. 只说"螺丝浏览器"的人满足于自己没有足够的专业经验(参见例如微软的Internet Explorer 6倒计时,它仍然在新兴市场中显示大量[目前为25.1%]的IE 6用户).建议您忽略前一组关于此主题的内容.

  • @jholster说"我不在乎"和"我在乎,但不是很多"之间有区别.可以使用包装器方法模拟那些尚未支持的功能,并优雅地降级,从而轻松实现最大兼容性.任何编写良好的脚本库都应该包含这样的兼容层,如果可能的话,它是可选的. (2认同)