Javascript 如何在GoogleTagManager中为某个类的每个元素在DOM上启动标记?
我是一名图书管理员,我们的图书馆和许多人一样,在其网站上使用了一个名为LibGuides的系统。我一直在使用Google Tag Manager将schema.org结构化数据注入带有JSON-LD的站点(考虑到有限的定制,这大概是唯一的方法) 我在网站上有页面显示多本书的列表,我还编写了一个标签和几个变量,可以用schema.org词汇表描述每本书。我已经设置了标记管理器,以便在页面上显示书籍时,在DOM Ready上触发此标记。到目前为止,一切顺利。标签工作正常,但有一个问题——对于第一本书,它只会触发一次,但对于后续的书,它不会再次触发。因此,无论页面显示多少本书,结构化数据中只显示一本书 我已经找到了很多在元素在视口中可见时重复触发标记的说明,但是因为这是关于结构化数据而不是用户交互的,所以我需要在DOM就绪时触发标记(我认为) 我假设可以用Javascript实现这一点,但不幸的是,我对Javascript的了解很少 显示的每本书都嵌套在一个div元素中,类为“s-lg-book”,LibGuides为其分配一个随机id。目前,我在标记管理器中将此Javascript设置为一个变量:Javascript 如何在GoogleTagManager中为某个类的每个元素在DOM上启动标记?,javascript,html,schema,google-tag-manager,Javascript,Html,Schema,Google Tag Manager,我是一名图书管理员,我们的图书馆和许多人一样,在其网站上使用了一个名为LibGuides的系统。我一直在使用Google Tag Manager将schema.org结构化数据注入带有JSON-LD的站点(考虑到有限的定制,这大概是唯一的方法) 我在网站上有页面显示多本书的列表,我还编写了一个标签和几个变量,可以用schema.org词汇表描述每本书。我已经设置了标记管理器,以便在页面上显示书籍时,在DOM Ready上触发此标记。到目前为止,一切顺利。标签工作正常,但有一个问题——对于第一本书
function bookGrab() {
var nodelist = document.getElementsByClassName("s-lg-book");
var i;
for (i = 0; i < nodelist.length; i++) {
return true;
}
}
函数bookGrab(){
var nodelist=document.getElementsByClassName(“s-lg-book”);
var i;
对于(i=0;i
该标记设置为每当该函数返回“true”时触发。我天真地认为它应该为页面上class=“s-lg-book”的每个实例触发,但这显然不起作用
下面是我所说的LibGuide页面的一个例子:
编辑一位有用的评论者要求提供标签本身。我最初没有发布它,因为我认为它可能太长了,所以这里是:
<script>
! function() {
var e = document.createElement("script");
e.type = "application/ld+json", e.innerHTML = JSON.stringify({
"@context": "https://schema.org",
"@type": "Book",
additionalType: "Product",
"@id": "{{Book URL}}#{{ISBN Number}}",
url: "{{Book URL}}",
name: "{{Book Title}}",
author: {
"@type": "Person",
name: "{{Author Name}}"
},
workExample: {
"@type": "Book",
isbn: "{{ISBN Number}}",
bookFormat: "https://schema.org/{{Book Format}}"
},
potentialAction: {
"@type": "ReadAction",
expectsAcceptanceOf: {
"@type": "Offer",
"@id": "{{Book URL}}#{{ISBN Number}}-offer"
},
target: {
"@type": "EntryPoint",
urlTemplate: "{{Book URL}}",
actionPlatform: ["https://schema.org/DesktopWebPlatform", "https://schema.org/MobileWebPlatform"]
}
},
datePublished: "{{Publication Date}}",
description: "{{Book Description}}",
thumbnailUrl: "{{Book Thumbnail}}",
subjectOf: {
"@type": "Article",
"@id": "#col-nest"
},
offers: {
"@type": "Offer",
"@id": "{{Book URL}}#{{ISBN Number}}-offer",
sku: "{{Call Number}}",
offeredBy: {
"@type": "Library",
"@id": "https://www.nwosu.edu/library#page-content"
},
businessFunction: "http://purl.org/goodrelations/v1#LeaseOut",
price: "0.00",
seller: {
"@type": "Library",
"@id": "https://www.nwosu.edu/library#page-content"
},
availableAtOrFrom: {
"@type": "Library",
"@id": "https://www.nwosu.edu/library#page-content"
},
itemOffered: {
"@type": "Book",
"@id": "{{Book URL}}#{{ISBN Number}}"
}
}
}), document.head.appendChild(e)
}();
</script>
! 函数(){
var e=document.createElement(“脚本”);
e、 type=“application/ld+json”,e.innerHTML=json.stringify({
“@context”:”https://schema.org",
“@type”:“Book”,
附加类型:“产品”,
“@id”:“{{Book URL}}{{{{ISBN Number}}”,
url:“{{Book url}}”,
名称:“{{书名}}”,
作者:{
“@type”:“Person”,
姓名:“{{作者姓名}}”
},
工作示例:{
“@type”:“Book”,
isbn:“{{isbn编号}}”,
书籍格式:“https://schema.org/{{书籍格式}}”
},
潜在作用:{
“@type”:“ReadAction”,
预期变化:{
“@type”:“Offer”,
“@id”:“{{Book URL}}{{{{ISBN Number}}-提供”
},
目标:{
“@type”:“入口点”,
URL模板:“{{Book URL}}”,
行动平台:[”https://schema.org/DesktopWebPlatform", "https://schema.org/MobileWebPlatform"]
}
},
datePublished:“{{发布日期}}”,
description:“{{Book description}}”,
缩略图URL:“{{Book Thumbnail}}”,
主题f:{
“@type”:“Article”,
“@id”:“#col nest”
},
提供:{
“@type”:“Offer”,
“@id”:“{{Book URL}}{{{{ISBN Number}}-提供”,
sku:“{{呼叫号码}}”,
报价人:{
“@type”:“库”,
“@id”:”https://www.nwosu.edu/library#page-内容“
},
业务功能:“http://purl.org/goodrelations/v1#LeaseOut",
价格:“0.00”,
卖方:{
“@type”:“库”,
“@id”:”https://www.nwosu.edu/library#page-内容“
},
可从以下地址获得:{
“@type”:“库”,
“@id”:”https://www.nwosu.edu/library#page-内容“
},
提供的项目:{
“@type”:“Book”,
“@id”:“{{Book URL}}{{{{ISBN Number}}”
}
}
}),document.head.appendChild(e)
}();
标签中当然有几个变量,用于从单个书籍的描述中获取元素。我意识到,如果我让每本书都使用标签,变量可能会“断裂”,但我想(或希望)我知道的足够多,可以在问题出现时解决这个问题。你也可以和我们分享一下你的标签(为书籍注入schema.org数据)的样子吗
dataLayer.push({'event':'singleBook'})代码>
最后bookGrab函数应该如下所示:
function bookGrab() {
var nodelist = document.getElementsByClassName("s-lg-book");
var i;
for (i = 0; i < nodelist.length; i++) {
dataLayer.push({'event' : 'singleBook'});
}
}
函数bookGrab(){
var nodelist=document.getElementsByClassName(“s-lg-book”);
var i;
对于(i=0;i
然后更改您的标记(注入schema.org的标记)设置(在高级标记设置中),使其在每个事件中触发一次(而不是一个页面仅触发一次)
并将此标记的触发规则设置为在事件等于“singleBook”时触发(或者将事件名称更改为您喜欢的任何名称[当然,还记得在bookGrab函数中更改它的名称])
当然,这可能无法正常工作,因为我不知道schema.org标记的确切外观 我在上面添加了图书标签的代码。根据你的建议,标签似乎仍会发射一次,但我肯定还是出了什么问题,因为它没有发射多次。根据您的建议,我将以前是变量的内容放入自己的标记中,并在数据层变量“event”等于“singleBook”时触发它。我还将其设置为在“Book”标签前点火。它仍然吸引人