0

特定のページのすべてのメタ タグを読み取り、各メタ名とコンテンツ値を Google タグ マネージャーで使用されるデータレイヤー配列に保存する必要があります。

すべてのメタ タグを取得したいので、それに応じて配列内の各値をプッシュできるようにしたいと考えています。

次のコードがありますが、メタ タグが 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

毎回調べる手間を省くために、すべての名前/コンテンツのペアをObject<meta>に入れる方法があります。

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']});
}

Manishearthによって提案されたものと同様に、2 番目のObjectをループすることにより、これらも自動化できます。

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 個のタグは多くありません。代わりに.contentonを使用することもできますが、特に 20 ~ 30 個のアイテムのみを処理するためのマイクロ最適化になります。metas[i].getAttribute

パフォーマンスの改善を確認するには、http://jsperf.comが最適です。

于 2013-02-17T16:29:11.953 に答える