使用JavaScript将所有元标记名称和值保存到对象
我需要读取特定页面上的所有元标记,并将每个元名称和内容值存储在将用于Google Tag Manager的数据层数组中 我想获取所有元标记,然后我想能够相应地推送数组中的每个值 我有以下代码,但如果我有20-30个元标记,我认为这不是最好的方法。我希望有人能帮助我改进这段代码使用JavaScript将所有元标记名称和值保存到对象,javascript,Javascript,我需要读取特定页面上的所有元标记,并将每个元名称和内容值存储在将用于Google Tag Manager的数据层数组中 我想获取所有元标记,然后我想能够相应地推送数组中的每个值 我有以下代码,但如果我有20-30个元标记,我认为这不是最好的方法。我希望有人能帮助我改进这段代码 <html> <head> <title> test metas</title> <meta name="ABC" content="dummy"/&g
<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>
测试元
函数GTMMeta(名称){
var metas=document.getElementsByTagName('meta');
对于(i=0;i可能直接形成数组
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)
}
dataLayer=[];
var metas=document.getElementsByTagName('meta');
对于(i=0;i可能直接形成数组
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)
}
dataLayer=[];
var metas=document.getElementsByTagName('meta');
对于(i=0;i我确信您可以对该代码进行大量的小调整以提高性能,但是20-30个标记并不多。您可以在metas[i]
上使用.content
而不是.getAttribute
但它将是微优化,特别是对于仅处理20-30个项目
检查性能改进的最佳位置是我确信您可以对该代码进行大量的小调整以提高性能,但20-30个标记并不多。您可以在metas[I]上使用.content
而不是.getAttribute
,但这将是一种微优化,特别是对于仅处理20-30个项目
检查性能改进的最佳方法是为了避免每次都要查看每个
,一种方法是将所有名称/内容对放入一个对象中
然后直接从你的物体上拿走你想要的东西
if (metaObj['ABC']) {
dataLayer.push({'cmsName': metaObj['ABC']});
}
您也可以通过在第二个对象上循环来自动化这些,类似于
为了避免每次都要查看每个
,一种方法是将所有名称/内容对放入一个对象中
然后直接从你的物体上拿走你想要的东西
if (metaObj['ABC']) {
dataLayer.push({'cmsName': metaObj['ABC']});
}
您也可以通过在第二个对象上循环来自动化这些,类似于
这不是最好的方法,但除非你有数百个标记,否则这并不重要。你至少可以在检查标记是否存在时保存返回值,而不是调用函数(和搜索)两次。@Pointy:非常感谢。考虑到我将在每页上有大约30个meta,并且我将在6-8页上需要这个片段,那么如果有更好的方法在数组中写入meta,它将非常方便。这不是最好的方法,但除非你有数百个标记,否则它实际上并不重要。你至少可以保存返回值,而不是调用函数(并进行搜索)两次。@Pointy:非常感谢。考虑到我将在每一页上有大约30个元,并且我将在6-8页上需要这个片段,如果有更好的方法在数组中写入元,那么它将非常方便。您仍然有SyntaxError
s(两个块);请参阅下面的简化错误示例:({document['title']:'foo'})
@Manishearth:非常感谢。你帮了很多忙,你的回答非常好。你仍然有语法错误(两个块);请参见下面的简化错误示例:({document['title']:'foo'})
@Manishearth:非常感谢。你帮了我很大的忙,你的回答非常好。非常感谢,它比原始代码好得多。不过,我想知道如何传递不同类型的变量,如数字、字符串和数组,如下所述。[链接]假设我想在数据层中添加conversionAttributes,这是如何实现的?这听起来像是如何将“字符串转换为X”。这取决于你想要得到什么,有很多例子。再次感谢,你的答案非常感谢。感谢你的努力。非常感谢,它比原始代码好得多。但是我想知道如何传递不同类型的变量,如数字、字符串和数组,如这里所解释的。[链接]让我们假设我想在数据层中添加conversionAttributes,这是如何实现的?这听起来像是如何将“String”转换为X。这取决于你想要得到什么,有很多例子。再次感谢你的回答。感谢你的努力。
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);