Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Google标记管理器中的值未定义,但控制台中的值正常_Javascript_Google Tag Manager - Fatal编程技术网

Javascript Google标记管理器中的值未定义,但控制台中的值正常

Javascript Google标记管理器中的值未定义,但控制台中的值正常,javascript,google-tag-manager,Javascript,Google Tag Manager,我通过GTM将价值观从网站推送到Facebook,但我无法在服务器端更改代码 因此,我需要发送给Fb的每个值都必须在GTM中使用自定义Javascripts查找 我可以在控制台中获得这些值,但我不知道为什么在调试模式下看不到它们。它总是未定义的 以下是GTM中的一个代码: function() { var prod = document.getElementById("product_addtocart_form").elements.namedItem("product").value;

我通过GTM将价值观从网站推送到Facebook,但我无法在服务器端更改代码

因此,我需要发送给Fb的每个值都必须在GTM中使用自定义Javascripts查找

我可以在控制台中获得这些值,但我不知道为什么在调试模式下看不到它们。它总是未定义的

以下是GTM中的一个代码:

function() {
  var prod = document.getElementById("product_addtocart_form").elements.namedItem("product").value;
  return prod;
}

那么我做错了什么

假设代码行在控制台中工作,我怀疑函数中的代码触发得太早,元素还没有准备好

确保在启动gtm.dom事件之前不会启动代码,如果仍然无法启动,则等待启动gtm.load。如果这仍然不起作用,那么看看这些元素何时真正准备好了(也许它们是使用AJAX调用创建的?)

如果gtm本机事件还不够晚,当您知道元素已经准备好时,您应该向您的数据层触发一个自定义事件,该事件触发您的标记并重新填充变量。希望这将确保在触发标记时正确填充变量

如果使用jQuery AJAX加载元素,您应该能够绑定到文档上的ajaxComplete事件。然后,您将向数据层触发一个自定义事件,该事件将触发使用现在应该填充的变量中的数据的标记。您将设置一个类型为customevent的触发器,其值为“ajax\u complete”(或您称之为事件的任何内容)

您的代码如下所示:

$(document).on('ajaxComplete', function(){
  dataLayer.push({'event':'ajax_complete'});
});

如果在一个页面上触发多个AJAX事件,那么您必须编写一些逻辑来区分调用和/或确保不会多次触发。GTM中的标签中还有一个设置,即“每页加载仅触发一次”,因此您也可以利用它。

嘿,汤姆,谢谢您的帮助,是的,产品信息是由ajax加载的,我没有访问服务器的权限。是否可以从GTM执行此操作,而不是在服务器端更改代码中的任何内容?Hi Ondrej,您应该能够绑定到ajaxComplete事件(假设您使用的是jQuery),该事件随后向数据层触发一个自定义事件,以触发读取该变量的标记。我会相应地更新答案。