JavaScript—提取文档元字段的最快方法

JavaScript—提取文档元字段的最快方法,javascript,xpath,document,meta-tags,Javascript,Xpath,Document,Meta Tags,我需要提取文档的“description”元标记 默认方法是使用document.getElementsByTagName('META'),然后遍历数组-如中所示: 但我想知道是否没有其他更快的“一行代码”方法。我对xPath不太熟悉,但这可能行得通吗?有什么想法吗?当然 var desc = document.getElementsByName('description')[0].getAttribute('content'); 这假定有一个名为description of course的元

我需要提取文档的“description”元标记

默认方法是使用document.getElementsByTagName('META'),然后遍历数组-如中所示:

但我想知道是否没有其他更快的“一行代码”方法。我对xPath不太熟悉,但这可能行得通吗?有什么想法吗?

当然

var desc = document.getElementsByName('description')[0].getAttribute('content');
这假定有一个名为description of course的元标记

更完整地说,不管是哪种情况,这都会抓住描述

function getDesc(){
  var metas = document.getElementsByTagName('meta');
  for(var i=0;mLen=metas.length;i<mLen;i++){
    if(metas[i].getAttribute('name').toLowerCase() == 'description'){
      return metas[i].getAttribute('content');
    }
  }
  return null;//or empty string if you prefer
}
var desc = getDesc();
函数getDesc(){ var metas=document.getElementsByTagName('meta'); 对于(var i=0;mLen=metas.length;i您可以使用XPath(在支持
document.evaluate
的客户机中)执行此操作,但这可能是一种过度使用:

document.evaluate('//*[@name="description"]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);

Scunliffe,我认为你的建议肯定会奏效,至少多行函数会

我提出了一个不在Webkit(Chrome+Safari)上运行但非常紧凑的解决方案:

var metas = document.getElementsByTagName('META');
var value = (metas.namedItem ("description") || metas.namedItem ("Description") || metas.namedItem ("DESCRIPTION") || {}).content;
这将在NodeList对象上使用namedItem()函数,寻找其他程序员编写“描述”的最可能方式。请注意,这将检索标记属性的值,同时忽略属性名称的大小写:

<meta name="description" content="my description" />
<meta NAME="Description" CoNtEnT="my description" />


但是遗憾的是,nameItem()在Safari和Chrome上不起作用:-(也许这些浏览器有一种替代方法…

这还取决于您所说的“最快”是指可以编写的最短代码,还是来自浏览器的最快响应

要获得最快的响应,只需查看head元素中的meta元素,并选择任何名为“description”的元素

{
  var s=[], metas=document.getElementsByTagName('head')[0].getElementsByTagName('meta');
  for(var i=0,L=metas.length;i<L;i++){
    if(metas[i].name=='description')s[s.length]=metas[i].content;
  }
  s= s.join(',');
}
{
var s=[],metas=document.getElementsByTagName('head')[0]。getElementsByTagName('meta');

对于(var i=0,L=metas.length;我支持该建议,但(a)这将返回其他命名实体,不仅是元标记,而且(b)我最初没有提到它,但我试图找到不区分大小写的情况,因为一些站点使用名称“Description”,一些使用“Description”,等等…@CamelHive-the[0]语法应该会让你得到第一个带有name属性的元素…99.999%的时间这将是meta标记。对于区分大小写…是的,这将失败。我将添加一个不完全是1行的版本。这很好,我真的应该了解XPath-谢谢。区分大小写的问题可以解决(所以我学到了)通过大量扩展XPath。无论如何,谢谢!要替换
namedItem
,您可以尝试直接从
NodeList
访问元素。IIRC,大多数现代浏览器(?)仍然支持这种元素解析(从DOM0开始)
document.getElementsByTagName('meta')['description']
。但我不建议使用这种速记。更安全的做法是只枚举元素,检查
name
属性或使用某种抽象(如大多数JS库提供的选择器实用程序或您自己的简化实现)