【问题标题】:Issue with nesting quotes while pushing event GTM推送事件 GTM 时出现嵌套引号问题
【发布时间】:2016-02-17 06:52:52
【问题描述】:

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

    <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()

在这种情况下,除了引号之外,我还需要为数据选择器使用引号。 请建议我如何解决这个问题,这里是link to fiddle。谢谢

【问题讨论】:

    标签: javascript jquery quotes google-tag-manager double-quotes


    【解决方案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。您也可以将其放在一个单独的文件中并将其包含在您的页面中。

    【讨论】:

    • 感谢 dmpg_tom 的快速回复。但对我来说,从内联调用推送事件是强制性的,有什么方法可以解决我上面使用的内联事件的这个问题。
    • 我已经为你添加了选项 C,它显示了如何做到这一点。你绝对需要质疑为什么你需要保持这个内联。即使您只能访问 HTML(并且没有链接的脚本文件),您也应该改用选项 A。选项 C 是最后的手段,但我真的想不出这种情况可能发生的情况。
    • 这听起来可能很奇怪,但我使用了内联推送。我认为删除空格和新行没有效果。来自 $('#breadCrumbLbl').text() 的值被视为变量,我收到未定义的错误,所以我们必须使用引号。
    • 好点,我注意到您在 data-id 属性选择器中使用了双引号。您需要使用转义的单引号,不能在内联代码中使用双引号 - 即使转义时也是如此。另外,您需要在 addToCart 事件名称周围使用单引号。我现在已经对此进行了测试,似乎工作正常。
    • 我已经更新了代码,但是你真的应该自己去尝试调试(根据我的建议)——仅仅给你代码并不能帮助你学习。上面选项 C 中的代码现在是正确的
    猜你喜欢
    • 2012-02-18
    • 2021-02-03
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    相关资源
    最近更新 更多