2013-02-17 1 views
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> 
+0

가장 좋은 방법은 아니지만 실제로는 매트가 아닙니다. 수백 개의 태그가 없다면 말이야. 함수를 호출하고 검색하는 대신 태그가 있는지 확인하기 위해 반환 값을 저장하면됩니다. – Pointy

+0

@ 포인트 : 정말 고마워요. 각 페이지에 약 30 개의 메타 데이터가 있으며 6 ~ 8 페이지에이 스 니펫이 필요하다고 가정하면 배열에 메타를 쓰는 더 좋은 방법이 있다면 매우 편리 할 것입니다. – digitup

답변

2

<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

에 의해 제안
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); 
+0

고맙습니다. 원래 코드보다 훨씬 낫습니다. 그러나 여기에 설명 된 것처럼 숫자, 문자열 및 배열과 같은 다른 유형의 다른 변수를 전달할 수있는 방법이 궁금합니다. [link] https://developers.google.com/tag-manager/reference dataLayer에 conversionAttributes를 추가한다고 가정 해 봅시다. 어떻게 수행 할 수 있습니까? – digitup

+0

"_String_을 _X_"로 변환하는 방법처럼 들립니다. 그것은 당신이 끝내고 싶은 것에 의존하고 주위 많은 예제를 가지고 있습니다. –

+0

다시 한 번 감사드립니다. 당신의 노력에 감사드립니다. – digitup

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=[]이면 충분합니다.

+0

두 번째 코드 블록에 'SyntaxError'가 있습니다. –

+0

@PaulS : 고맙습니다. – Manishearth

+0

여전히'SyntaxError' (두 블록 모두)가 있습니다. '({document [ 'title'] : 'foo'})' –

0

성능 향상을 위해이 코드를 약간만 수정하면되지만, 20-30 태그는 이 아니며이 많이 있습니다. .getAttribute 대신 metas[i] 대신 .content을 사용할 수 있지만 특히 20-30 개의 항목 만 처리하는 경우 미세 최적화가됩니다. 성능 향상을 확인하기 위해

가장 좋은 곳은 http://jsperf.com

관련 문제