Javascript 如何在GoogleTagManager中为某个类的每个元素在DOM上启动标记?

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上触发此标记。到目前为止,一切顺利。标签工作正常,但有一个问题——对于第一本书

我是一名图书管理员,我们的图书馆和许多人一样,在其网站上使用了一个名为LibGuides的系统。我一直在使用Google Tag Manager将schema.org结构化数据注入带有JSON-LD的站点(考虑到有限的定制,这大概是唯一的方法)

我在网站上有页面显示多本书的列表,我还编写了一个标签和几个变量,可以用schema.org词汇表描述每本书。我已经设置了标记管理器,以便在页面上显示书籍时,在DOM Ready上触发此标记。到目前为止,一切顺利。标签工作正常,但有一个问题——对于第一本书,它只会触发一次,但对于后续的书,它不会再次触发。因此,无论页面显示多少本书,结构化数据中只显示一本书

我已经找到了很多在元素在视口中可见时重复触发标记的说明,但是因为这是关于结构化数据而不是用户交互的,所以我需要在DOM就绪时触发标记(我认为)

我假设可以用Javascript实现这一点,但不幸的是,我对Javascript的了解很少

显示的每本书都嵌套在一个div元素中,类为“s-lg-book”,LibGuides为其分配一个随机id。目前,我在标记管理器中将此Javascript设置为一个变量:

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数据)的样子吗

  • 尝试将“bookGrab”JS函数更改为自定义HTML标记(在DOM就绪时启动),而不是变量

  • 然后,将每本书的单个事件推送到GTM,而不是“return true”行。这样写一行:

  • 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”标签前点火。它仍然吸引人