jjzjj

javascript - dataLayer.push() 在 anchor 上触发时肯定会向谷歌发送数据吗?

coder 2024-12-25 原文

这似乎是一个简单的问题,但在我能找到的任何地方似乎都没有答案。

我正在编写一个 onClick 事件处理程序,它会在单击 anchor 时简单地调用 dataLayer.push()

dataLayer.push() 是同步操作吗?

GET 请求是否一定会发送到 google,即使浏览器由于链接被跟踪而卸载了请求它的页面?

有些浏览器显示连接被取消,有些显示连接成功。

我的问题是如果电脑很慢,是否有可能在发送请求之前页面就被卸载了?

这就是为什么我假设谷歌在点击链接后开始使用 eventCallback 属性来重定向用户。 例如 https://developers.google.com/tag-manager/enhanced-ecommerce#product-clicks

此源代码不包含点击处理程序,但暗示 onClick 事件应该停止传播并让 eventCallback 函数设置 document.location.

但是,一旦您取消事件,所有信息都将消失。

这(在我看来)只是错误的做法。 例如 (CTRL 或 COMMAND)+ 单击在浏览器上打开一个新选项卡。除非 onClick 事件处理程序允许继续进行,否则这将不起作用。

依赖 eventCallback 还意味着如果 google scrips 由于可能(但仍然不太可能)的众多原因之一而未加载,您的链接将不起作用。你的网站坏了。

因此,这为 onClick 事件处理程序留下了正确的方法,以允许事件传播并返回 true。

这也意味着 dataLayer.push() 需要在发送 GET 请求后返回,这样才能正常工作。

代码示例: 注意:您将在混合环境中得到混合结果。

<a href="/somewhere-else">Link</a>


$(document).on('click', 'a', function(event) {

    // Is dataLayer.push() guaranteed to fire a GET ?
    // data set externally
    dataLayer.push(data);

    return true;

});

有没有人可以保证 GET 请求会被触发到谷歌服务器?

谷歌开发者是不是忘记了什么?

编辑:更新标题以与问题更相关。

最佳答案

datalayer.push 不会向 Google 发送任何内容。它将具有键/值对的对象推送到数据层数组。这可能包含一个事件,该事件又会触发一个标签。是否发送标签取决于标签的设置,而不是dataLayer.push。

因此,当您编写自己的点击处理程序时,您自己有责任确保您的代码确实被触发。

如果您使用内置的点击处理程序,您可以 configure a delay to make sure your tag has time to fire before the link redirects :

Since link clicks usually cause the browser to load a new page and interrupt any pending HTTP request, you have the option to add a small delay to allow tags fired by Tag Manager to execute properly before redirecting to the next page. Checking the “Wait For Tags” option will delay opening of links until all tags have fired or the specified timeout has elapsed, whichever comes first.

您应该能够混合使用这两种方法(在点击时推送数据,但仍然使用事件的“ native ”链接点击处理程序)。

You can also try to specify "beacon" as the transport method在您的 Google Analytics 标签中,在支持此功能的浏览器(我认为目前只有 Chrome)上,GA 将使用 navigator.sendBeacon 接口(interface),即使页面卸载也会发送数据。

你可能会认为 Google 的解决方案不是很优雅(但简单的延迟有一个优点,它适用于所有标签,而不仅仅是 GA),但他们并没有“忘记”这个问题。

还有一些解决方案将 GA 命中回调与超时结合起来,如果回调失败则重定向(如 Simo Ahava 某处所提议的那样)应该适用于 GTM,即使它们在 GA 中实现起来可能更麻烦。

关于javascript - dataLayer.push() 在 anchor 上触发时肯定会向谷歌发送数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42263136/

有关javascript - dataLayer.push() 在 anchor 上触发时肯定会向谷歌发送数据吗?的更多相关文章

  1. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  2. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

    我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

  3. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

    是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

  4. ruby - 是否可以在不实际发送或读取数据的情况下查明 ruby​​ 套接字是否处于 ESTABLISHED 或 CLOSE_WAIT 状态? - 2

    s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成

  5. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  6. ruby - 如何理解 Ruby 中的发送者和接收者? - 2

    我很难理解Ruby中sender和receiver的实际含义。它们一般是什么意思?到目前为止,我只是将它们理解为方法调用和获取其返回值的调用。但是,我知道我的理解还远远不够。谁能给我一个Ruby中发送者和接收者的具体解释? 最佳答案 面向对象中的一个核心概念是消息传递和早期概念化,这在很大程度上借鉴了计算的Actor模型。艾伦·凯(AlanKay)创造了面向对象一词并发明了最早的OO语言之一SmallTalk,他拥有voicedregretatusingatermwhichputthefocusonobjectsinsteadofo

  7. ruby - 更改 $LOAD_PATH 时,为什么使用 unshift 而不是 push? - 2

    我发现ruby加载路径是一个数组,很多项目都是这样使用的:$:.unshift(File.expand_path("../../lib",__FILE__))可以将本地文件添加到ruby路径数组的前面,方便我们require或者load。所以,我希望知道为什么我们不使用push将文件添加到数组的末尾? 最佳答案 假设您有一个“date.rb”文件(为什么不呢)并且您想要加载这个文件,而不是标准库日期。如果您使用追加,当您调用require'date'时您的文件将永远不会被加载,因为它位于数组的末尾并且标准日期会在之前找到。因此,如果

  8. ruby - 动态扩展现有方法或覆盖 ruby​​ 中的发送方法 - 2

    假设我们有A、B、C类。Adefself.inherited(sub)#metaprogramminggoeshere#takeclassthathasjustinheritedclassA#andforfooclassesinjectprepare_foo()as#firstlineofmethodthenrunrestofthecodeenddefprepare_foo#=>prepare_foo()neededhere#somecodeendendBprepare_foo()neededhere#somecodeendend如您所见,我正在尝试将foo_prepare()调用注入

  9. ruby-on-rails - 如何通过 POST 发送多个相同的键/参数? - 2

    如果我必须在一个HTTP请求中发送一堆post参数,所有这些参数都具有相同的名称,我该如何构建要发布的data对象?想象一个带有一些复选框的表单,它们都具有相同的name属性但具有不同的值(如果它们被选中):我想用ruby​​构建它(但它需要根据在表单上选择的内容动态创建):data={"color"=>"red","color"=>"green","color"=>"blue"}然后将数据发送到某个URL:Net::HTTP.post_form(url,data)我无法控制接收端,所以我必须发送它期望接收的参数。怎么办? 最佳答案

  10. ruby - 在 Mechanize 中使用 JavaScript 单击链接 - 2

    我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan

随机推荐