新闻中心

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

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

修复:持久化 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循环中检测并处理空数组元素 

搜索