0

我需要读取特定页面上的所有元标记,并将每个元名称和内容值存储在将用于谷歌标签管理器的数据层数组中。

我想获取所有元标记,然后我希望能够相应地推送数组中的每个值。

我有以下代码,但如果我有 20-30 个元标记,我认为这不是最好的方法。我希望有人可以帮助我改进此代码!

<html>
<head>
    <title> test metas</title>
    <meta name="ABC" content="dummy"/>
    <meta name="DEF" content="dummy"/>
    <meta name="JHK" content="dummy"/>
</head>
<body>
<script type="text/javascript" charset="utf-8">

function GTMMeta(name) { 
   var metas = document.getElementsByTagName('meta'); 
   for (i=0; i<metas.length; i++) { 
      if (metas[i].getAttribute('name') == name) { 
         return metas[i].getAttribute('content'); 
      } 
   } 
    return '';
} 

  dataLayer = [{}];

if (GTMMeta('ABC') !=''){
    dataLayer.push({'cmsName': GTMMeta('ABC')})
 }; 
if (GTMMeta('DEF') !=''){
  dataLayer.push({'transactionTotal': GTMMeta('DEF')});
}  

if (GTMMeta('JHK') !=''){
  dataLayer.push({'market': GTMMeta('JHK')});
}  
</script>
</body>
</html>
4

3 回答 3

2

也许直接形成数组?

dataLayer = [];
var metas = document.getElementsByTagName('meta'); 
for (i=0; i<metas.length; i++) { 
   d={}
   d[metas[i].getAttribute('name')]=metas[i].getAttribute('content')
   datalayer.push(d)
} 

如果您希望数组有一些别名而不是名称(并且只获取这些别名),请使用:

aliases={'ABC':'cmsName','DEF':'transactionTotal', 'JHK':'market'}
dataLayer = [];
var metas = document.getElementsByTagName('meta'); 
for (i=0; i<metas.length; i++) { 
   d={}
   d[aliases[metas[i].getAttribute('name')]]=metas[i].getAttribute('content')
   aliases[metas[i].getAttribute('name')] && datalayer.push(d)
} 

附注:没有必要有dataLayer=[{}],dataLayer=[]就足够了。

于 2013-02-17T16:27:51.070 回答
2

为了避免每次都查看<meta>,一种方法是将所有名称/内容对放入Object中。

var metaObj = {}, m = document.head.getElementsByTagName('meta'), i = m.length;
while (i--) { // looping down will result in the same behaviour as stopping @ 1st
    metaObj[m[i].name] = m[i].content;
}

然后直接从你的对象中获取你想要的东西

if (metaObj['ABC']) {
    dataLayer.push({'cmsName': metaObj['ABC']});
}

您也可以通过循环第二个Object来自动化这些,类似于Manishearth所建议的

var metaInterest = {'ABC':'cmsName','DEF':'transactionTotal', 'JHK':'market'}, o;
for (i in metaInterest)
    if (metaInterest.hasOwnProperty(i) && metaObj[i])
        o = {}, o[metaInterest[i]] = metaObj[i], dataLayer.push(o);
于 2013-02-17T16:37:44.823 回答
0

我确信你可以对这段代码做很多小的调整来提高性能,但是 20-30 个标签并不是很多。您可以使用.contentonmetas[i]代替,.getAttribute但它将是微优化,尤其是对于仅处理 20-30 个项目。

检查性能改进的最佳地点是http://jsperf.com

于 2013-02-17T16:29:11.953 回答