值得一看
广告
彩虹云商城
广告

热门广告位

修复:持久化 UTM 代码导致链接出现多余问号的问题

修复:持久化 utm 代码导致链接出现多余问号的问题

本文旨在解决在使用 JavaScript 持久化 UTM 参数时,即使 URL 中不存在 UTM 参数,链接仍然被错误地添加问号的问题。通过分析问题代码,找出导致错误的原因,并提供修改后的代码,确保只有在存在 UTM 参数时才添加问号,从而避免生成不必要的 URL 参数。

在使用 JavaScript 追踪用户来源,并持久化 UTM 参数(如 utm_source, utm_medium, utm_campaign 等)是非常常见的需求。然而,在实现过程中,可能会遇到一些问题,例如,即使URL中没有UTM参数,链接也会被错误地添加一个问号?。 这会导致URL看起来不美观,甚至可能影响某些网站的正常功能。本文将分析导致此问题的原因,并提供解决方案。

问题分析

问题出在 decorateUrl 函数中,该函数负责将 UTM 参数添加到 URL 中。原始代码无论 collectedQueryParams 是否为空,都会尝试添加 ? 或 & 符号。

function decorateUrl(urlToDecorate) {
urlToDecorate = (urlToDecorate.indexOf('?') === -1) ? urlToDecorate + '?' : urlToDecorate + '&';
var collectedQueryParams = [];
for (var queryIndex = 0; queryIndex < queryParams.length; queryIndex++) {
if (getQueryParam(queryParams[queryIndex])) {
collectedQueryParams.push(queryParams[queryIndex] + '=' + getQueryParam(queryParams[queryIndex]))
}
}
return urlToDecorate + collectedQueryParams.join('&');
}

这段代码的逻辑是:如果 urlToDecorate 中没有 ?,则添加 ?,否则添加 &。但是,它没有判断 collectedQueryParams 是否为空,也就是说,即使没有收集到任何 UTM 参数,也会添加 ? 或 &。

解决方案

为了解决这个问题,我们需要修改 decorateUrl 函数,使其在 collectedQueryParams 为空时,直接返回原始的 urlToDecorate。只有当 collectedQueryParams 不为空时,才添加 ? 或 & 符号。

问问小宇宙

问问小宇宙

问问小宇宙是小宇宙团队出品的播客AI检索工具

问问小宇宙77

查看详情
问问小宇宙

修改后的 decorateUrl 函数如下:

function decorateUrl(urlToDecorate) {
var collectedQueryParams = [];
for (var queryIndex = 0; queryIndex < queryParams.length; queryIndex++) {
if (getQueryParam(queryParams[queryIndex])) {
collectedQueryParams.push(queryParams[queryIndex] + '=' + getQueryParam(queryParams[queryIndex]))
}
}
if(collectedQueryParams.length === 0){
return urlToDecorate;
}
//only add the ? if we have params AND if there isn't already one
urlToDecorate = (urlToDecorate.indexOf('?') === -1) ? urlToDecorate + '?' : urlToDecorate + '&';
return urlToDecorate + collectedQueryParams.join('&');
}

在这个修改后的版本中,我们首先检查 collectedQueryParams 的长度。如果长度为 0,说明没有收集到任何 UTM 参数,此时直接返回原始的 urlToDecorate,避免添加多余的 ? 符号。

完整代码示例

下面是包含修改后的 decorateUrl 函数的完整代码示例:

<script>
(function() {
var domainsToDecorate = [
'example.com'
],
queryParams = [
'utm_medium', //add or remove query parameters you want to transfer
'utm_source',
'utm_campaign',
'utm_content',
'utm_term'
]
// do not edit anything below this line
var links = document.querySelectorAll('a');
// check if links contain domain from the domainsToDecorate array and then decorates
for (var linkIndex = 0; linkIndex < links.length; linkIndex++) {
for (var domainIndex = 0; domainIndex < domainsToDecorate.length; domainIndex++) {
if (links[linkIndex].href.indexOf(domainsToDecorate[domainIndex]) > -1 && links[linkIndex].href.indexOf("#") === -1) {
links[linkIndex].href = decorateUrl(links[linkIndex].href);
}
}
}
// decorates the URL with query params
function decorateUrl(urlToDecorate) {
var collectedQueryParams = [];
for (var queryIndex = 0; queryIndex < queryParams.length; queryIndex++) {
if (getQueryParam(queryParams[queryIndex])) {
collectedQueryParams.push(queryParams[queryIndex] + '=' + getQueryParam(queryParams[queryIndex]))
}
}
if(collectedQueryParams.length === 0){
return urlToDecorate;
}
//only add the ? if we have params AND if there isn't already one
urlToDecorate = (urlToDecorate.indexOf('?') === -1) ? urlToDecorate + '?' : urlToDecorate + '&';
return urlToDecorate + collectedQueryParams.join('&');
}
// a function that retrieves the value of a query parameter
function getQueryParam(name) {
if (name = (new RegExp('[?&]' + encodeURIComponent(name) + '=([^&]*)')).exec(window.location.search))
return decodeURIComponent(name[1]);
}
})();
</script>

注意事项

  • 确保 domainsToDecorate 数组包含你想要追踪的域名。
  • queryParams 数组包含你想要持久化的 UTM 参数。
  • 在部署代码之前,务必进行充分的测试,确保其在各种场景下都能正常工作。

总结

通过修改 decorateUrl 函数,我们可以避免在 URL 中添加多余的 ? 符号,从而使 URL 更加清晰和易于管理。在实际应用中,需要根据具体的需求进行适当的调整和优化,以达到最佳的效果。

相关标签:

javascript java ai win JavaScript

大家都在看:

JavaScript动态更新元素内容教程
JavaScript 的 new 关键字在实例化对象时内部执行了哪些步骤?
JavaScript CSS 缩放动画期间获取最终 offset 值的替代方案
JavaScript中的设计模式,如工厂模式、单例模式如何现代应用?
如何理解JavaScript中的不可变数据结构的优势?
温馨提示: 本文最后更新于2025-10-12 10:42:53,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞9赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容