推送事件 GTM 时嵌套引号的问题

Issue with nesting quotes while pushing event GTM

提问人:Chaitanya Sai 提问时间:11/16/2015 更新时间:11/16/2015 访问量:1458

问:

我正在将事件推送到 GTM,以防出现锚标记,这里的问题是在通过 jQuery 获取数据时,我无法使用引号(单引号或双引号),因为它会破坏代码。我还尝试使用XML和XML转义引号,但仍然无法解决问题。这是我的代码onclick\(slash)"

    <a title="Comprar" class="btn-pdp-bag"
        onclick=" dataLayer.push({
          'event':addToCart,
          'ecommerce':{
              'remove':{
                  'products':[{'name':'Playera Polo',
                              'id':'123456' ,
                              'price':'1340.0',                                                     
                              'category':$('#ancestorLbl').text(),
                              'subcategory':$('#breadCrumbLbl').text(),
                              'variant': $('div').find('[data-id=\"ddldynamiccolor\"] span').text(),                                  'quantity':'1'
                           }]
                        }
                       }
                       }); href="#"> send Gtm </a>

我需要发送带有报价的数据,但如果我放置报价

$('#ancestorLbl').text()

如果我放置双引号,则将其视为字符串。onclick

同样的问题

$('div').find('[data-id=\"ddldynamiccolor\"] span').text()

在这种情况下,除了引号之外,我还需要对数据选择器使用引号。 请建议我如何解决这个问题,这是小提琴的链接。谢谢

JavaScript jQuery 引用 google-tag-manager 双引号

评论


答:

0赞 dmpg_tom 11/16/2015 #1

当您尝试将大量代码放入内联函数调用时,会出现问题。虽然通过一定数量的转义字符和删除空格/换行符是完全可以实现的,但我觉得不建议您使用的更优雅的解决方案是错误的。

选项 A - 调用函数

创建一个包含所有代码的函数,并从 onclick 事件中调用它。

选项 B - 动态地将代码绑定到元素

由于您已经在使用 jQuery,因此您可以使用 on() 函数绑定到此元素。这将要求您为链接提供唯一标识符(除非您希望多个链接触发正确的代码)。

因此,给您一个链接的唯一标识符并去除 onclick:

<a id="comprar" title="Comprar" class="btn-pdp-bag" href="#"> send Gtm </a>

现在,当发生单击事件时,将代码动态绑定到此链接

$('document').ready(function(){
  $('#comprar').on('click', function(){
    dataLayer.push({
      'event':addToCart,
      'ecommerce':{
        'remove':{
          'products':[{'name':'Playera Polo',
                              'id':'123456' ,
                              'price':'1340.0',                                                     
                              'category':$('#ancestorLbl').text(),
                              'subcategory':$('#breadCrumbLbl').text(),
                              'variant': $('div').find('[data-id="ddldynamiccolor"] span').text(),
                              'quantity':'1'
          }]
        }
      }
    });
  });
});

选项 C - 保持内联

如果你真的需要保持内联,首先,你应该问为什么。然后,您应该删除所有换行符(加上空格以保持整洁,但这不是绝对必要的)并使用以下内容:

    <a title="Comprar" class="btn-pdp-bag" onclick=" dataLayer.push({'event':'addToCart','ecommerce':{'remove':{'products':[{'name':'Playera Polo','id':'123456','price':'1340.0','category':$('#ancestorLbl').text(),'subcategory':$('#breadCrumbLbl').text(),'variant': $('div').find('[data-id=\'ddldynamiccolor\'] span').text(),'quantity':'1'}]}}});" href="#"> send Gtm </a>

使用哪种方法完全取决于您,但我推荐选项 B,因为这样做会更优雅一些。在这种方法中,您将 javascript 功能完全从 HTML 中抽象出来,因此您需要进行的任何更改只需要对 JS 进行更改。您也可以将其放在单独的文件中,并将其包含在您的页面上。

评论

0赞 Chaitanya Sai 11/16/2015
感谢您的快速回复dmpg_tom。但对我来说,必须从内联调用推送事件,是否有任何方法可以解决我上面使用的内联事件的这个问题。
0赞 dmpg_tom 11/16/2015
我为您添加了选项 C,它显示了如何做到这一点。你绝对需要质疑为什么你需要保持内联。即使您只能访问 HTML(并且没有链接的脚本文件),您也应该改用选项 A。选项 C 是最后的手段,但我真的想不出可能发生这种情况的情况。
0赞 Chaitanya Sai 11/16/2015
这听起来可能很奇怪,但我使用了内联推送。我认为删除空格和新线条没有任何效果。$('#breadCrumbLbl').text() 中的值被视为变量,我收到未定义的错误,因此我们必须使用引号。
0赞 dmpg_tom 11/16/2015
好点子,我注意到您在 data-id 属性选择器中使用了双引号。您需要使用转义的单引号,不能在内联代码中使用双引号 - 即使转义也是如此。此外,您需要在 addToCart 事件名称两边使用单引号。我现在已经测试了我的终端,似乎工作正常。
0赞 dmpg_tom 11/16/2015
我已经更新了代码,但是,你真的应该自己尝试调试(根据我的建议) - 仅仅给你代码并不能帮助你学习。上面选项 C 中的代码现在是正确的