Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript将所有元标记名称和值保存到对象_Javascript - Fatal编程技术网

使用JavaScript将所有元标记名称和值保存到对象

使用JavaScript将所有元标记名称和值保存到对象,javascript,Javascript,我需要读取特定页面上的所有元标记,并将每个元名称和内容值存储在将用于Google Tag Manager的数据层数组中 我想获取所有元标记,然后我想能够相应地推送数组中的每个值 我有以下代码,但如果我有20-30个元标记,我认为这不是最好的方法。我希望有人能帮助我改进这段代码 <html> <head> <title> test metas</title> <meta name="ABC" content="dummy"/&g

我需要读取特定页面上的所有元标记,并将每个元名称和内容值存储在将用于Google Tag Manager的数据层数组中

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

我有以下代码,但如果我有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>

测试元
函数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);