我正在尝试捕获IP地址,对其进行哈希处理,并将值存储在Google Analytics中的会话范围维度中
首先,我使用以下方法触发一个自定义JS标记来获取用户IP:
function getIP(json) {
dataLayer.push({"event":"ipEvent","ipAddress" : json.ip});
}
</script>
<script type="application/javascript" src="https://api.ipify.org?format=jsonp&callback=getIP"></script>
该脚本创建一个"ipEvent“,它拉取用户IP并触发”hash2IP scrambled“事件来散列值。一切正常,但问题是当我需要发送散列值通过Pageview,这是执行在3容器加载。
您可以从截图中看到,获取IP的脚本是在"3 Container loaded“消息之前执行的,但实际事件发生在”3 Container loaded“消息之后。
任何想法可以做到这一点(在3容器加载之前获取"ipEvent“)
发布于 2021-09-14 08:10:51
不需要为此触发一个标记。好吧,也许是为了加载散列代码。但我只会使用一些简单的散列函数,并在内联运行它,而不是从其他地方加载它。应避免不必要的网络请求。
将您的主散列逻辑移动到CJS变量并返回散列,而不是接触数据层。
现在,在您想要使用它的任何标记中引用您出色的CJS变量。或者,更好的是,在GA配置变量中。真的由你决定。
结果是:一切正常,但DOM和全局JS作用域没有变化。
发布于 2021-09-14 10:03:04
您的JSONP请求是异步的-您发送请求,并在结果返回时执行回调。
为了确保ip api调用的结果作为第一个事件被可靠地推送,您必须进行一个同步调用,这是ipify不支持的(在这里我可能是错的),而且您也不希望这样做,因为您需要停止执行GTM安装中的所有其他内容。在这种情况下,你还必须以某种方式处理超时等。这不是一个好主意(即使你在GTM之外解决了这个问题,你也不知道API调用的结果什么时候会回来)。
如果您确实想确保IP在给定的标签中可用,请使用标签序列。在这种情况下,您需要在回调函数中包含一个onHtmlSuccess调用,该调用表示您的设置标记已经执行,并且可以触发后续标记。从我的头顶上看,它应该是这样的:
<script>
function getIP(json) {
dataLayer.push({"event":"ipEvent","ipAddress" : json.ip});
var gtm = window.google_tag_manager[{{Container ID}}];
gtm.onHtmlSuccess({{HTML ID}});
}
</script>
<script type="application/javascript" src="https://api.ipify.org?format=jsonp&callback=getIP"></script>
对于需要IP的标签,将其用作标签序列中的设置标签。将后续标记设置为仅在设置标记成功时触发,并将设置标记设置为每页仅触发一次,这样就不会对每个标记重复执行API调用。
虽然这不会使您的标签在第一个事件之前触发(因此从技术上讲,它不会回答您的问题),但它确实确保了需要IP的标签被推迟到IP可用时,因此,这可能在某种程度上接近您想要的。
https://stackoverflow.com/questions/69180167
复制相似问题