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

本文旨在解决在使用 J*aScript 持久化 UTM 参数时,即使 URL 中不存在 UTM 参数,链接仍然被错误地添加问号的问题。通过分析问题代码,找出导致错误的原因,并提供修改后的代码,确保只有在存在 UTM 参数时才添加问号,从而避免生成不必要的 URL 参数。
在使用 J*aScript 追踪用户来源,并持久化 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 不为空时,才添加 ? 或 & 符号。
修改后的 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 h*e 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 h*e 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 更加清晰和易于管理。在实际应用中,需要根据具体的需求进行适当的调整和优化,以达到最佳的效果。
以上就是修复:持久化 UTM 代码导致链接出现多余问号的问题的详细内容,更多请关注其它相关文章!
# 在这个
# 鱼台全网seo报价多少
# 上海宝山全网营销推广
# 网站设计与网站建设书店
# 网站权重高怎么优化好呢
# seo首页排名怎么做
# 河北抖音关键词排名平台
# seo的职责
# 子墨seo
# b2b平台免费推广网站排名
# 配音SEO
# 都能
# javascript
# 有哪些
# 如何实现
# 如何用
# 你想要
# 如何使用
# 可以使用
# 也会
# 为空
# win
# ai
# java
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
抖音未来赚钱的新趋势 2025年值得关注的变现风口分析
创客贴用户入口官网登录 创客贴网页版电脑版系统
在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明
多闪网页版在线观看免费入口_多闪官网访问入口
千牛数据看板网页版_千牛数据看板网页版访问方法
c++如何使用Meson构建系统_c++比CMake更快的构建工具
如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践
微信网页版官方入口教程 微信网页版网页版快速登录步骤
LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置
快手赚钱渠道_快手收益来源
新三国志曹操传110级星符试炼夏侯渊极难攻略
Go语言HTML解析:利用Goquery精准获取指定元素内容
mysql备份恢复性能优化_mysql备份恢复性能优化方法
在Qt QML中通过Python字典动态更新TextEdit内容的教程
微信网页版扫码登录入口 微信网页版二维码登录入口
C++如何解决segmentation fault_C++段错误调试与原因分析
QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台
mcjs网页版在线存档 mcjs云存档登录入口
写好的html代码怎么运行出来_运行写好的html代码方法【教程】
实现全屏滚动与导航点:专业教程
利用Bokeh CustomJS动态控制DataTable列可见性
AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验
TypeScript/J*aScript:高效查找数组中首个唯一ID对象
Centos/Linux 系统下安装 composer 的完整步骤
Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】
韩小圈电脑版在线入口_网页版免费登录地址
Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】
微信网页版官方入口直达 微信网页版网页版登录使用方法
狙击外星人小游戏开始_狙击外星人小游戏立即开始
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
EMS快递官网app_中国邮政速递物流手机客户端
外媒分析《GTA6》定价:卖100美元可以但真没必要!
Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】
拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法
2026春节假期票务安排_2026春节放假购票指南
微博网页版首页入口 微博电脑端官网登录链接
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
使用Python高效删除Word宏并转换DOCM为DOCX格式
PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比
J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明
铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧
蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台
J*aScript动态修改指定div内所有a标签样式指南
荣耀Play7T运行卡顿解决_荣耀Play7T性能优化
J*a TimerTask中HashMap意外清空的深层原因与解决方案
Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践
三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】
J*aScript中在Map循环中检测并处理空数组元素


2025-10-12
浏览次数:次
返回列表