小程序二级页面tabbar_小程序页面推广踩坑记

1e9d95e86302d4e11e9c8ab4981ed863.gif

前几天,团队里有个小伙伴遇到一个问题,卡壳了大半天。我觉得这个例子值得拿出来分享给大家。希望大家以后遇到类似的问题能顺利绕过这种坑。

业务场景很常见,就是为了配合小程序中特定页面的推广,区分推广渠道和人员,逐步实现较高精准度的投放。稍微特殊一点的地方在于,这个页面在小程序中。

为了达到区分推广渠道和人员的目的,我们决定采用在页面url末尾添加参数src和uid的方法。由于这样的推广不能使用体验版进行测试,所以全程我们只能在微信开发者工具中模拟推广行为。

页面本身的交互是这样的:

在index页面点击按钮跳转到webview嵌套的h5页面pages/webhref/webhref?url=xxx。跳转时需要携带index页面设置的参数uid和src,以及目标页面地址url。在webhref页面的onload方法中再接收options对象并解析。

首先,在编译模式中设置index页面的启动参数,模拟index页面被推广的场景:      

bea78966e43371a203a7e78ebd13228c.png       

然后在对应按钮的点击事件中执行跳转:

let newurl = api.host+'/m/'+ pageurl +'&src=' + this.data.src + '&uid=' + this.data.uid;wx.navigateTo({  url: '../webhref/webhref?url=' + newurl});

这样,在跳转后的页面webhref的onload方法中就可以接收到这几个参数了:

onLoad: function (options) {  if (options.url.indexOf('/pages') == -1) {    console.log('options--',options);    this.setData({      url: options.url + '?src=' + options.src + '&uid=' + options.uid    })  }}    // {url: "https://xxxxx.com.cn/m/bj", src: "111", uid: "222"}

像上面这样,将接收到的这三个参数拼接起来就好了。

看起来的确就是这么简单,然鹅~

如果过不了几天,options.url中需要带?该怎么办呢?

那我们就需要兼容一下options.url有没有?两种情况了。这个好说:

onLoad: function (options) {      if (options.url.indexOf('/pages') == -1) {          let tourl = options.url;          let params = (tourl.indexOf('?')!=-1 ? '&': '?') + options.src + '&uid=' + options.uid          this.setData({              url: tourl + params          })  }}

也不难嘛,是不是~

可是我们貌似忽略了另一个问题,如果options.url中如果有?的话,webhref页面setData的url就会包含两个?了,这……这就需要用到encodeURIComponent和decodeURIComponent两个方法了。

encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。decodeURIComponent()可以进行对应的解码。

So,为了避免浏览器误解,我们在index页面执行跳转时,需要使用encodeURIComponent()将url进行转码,到webhref之后再用decodeURIComponent()进行解码。然后使用setData重置一下webhref页面地址就好了。就像这样:

// pages/index/index.jslet newurl = api.host+'/m/'+ pageurl;wx.navigateTo({  url: '../webhref/webhref?url=' + encodeURIComponent(newurl) + '&src=' + this.data.src + '&uid=' + this.data.uid});// pages/webhref/webhref.jslet newurl = decodeURIComponent(options.url);let params = (newurl.indexOf('?')!=-1 ? '&': '?') + options.src + '&uid=' + options.uidthis.setData({  url: newurl + params})
看到这里,可能有的小伙伴会说,为什么不把tourl和参数src/uid一起编码解码呢?那样不是更方便吗?

其实,如果只推广一个页面完全可以如此。但这里关联着我们另一个小需求,就是webhref页面也要做推广。所以,webhref页面接收options时,只需要获取url部分,然后拼接自身页面设置的参数src和uid,拼接成完整的推广链接。如果一起编码解码,options.url中就会包含index页面中的src和uid参数,增加url部分的分离难度。

说句俗话,行百里者半九十。果然如此。分析代码确认没问题了,但是webhref页面的数据入库情况依然有问题。

找了各种原因,最终发现,在设置启动参数时,小伙伴使用了编码后的url和编码前的src和uid,类似这种:url=https%3A%2F%2F100audio.com%2F%3Furl_targeting%3D1&src=111&uid=bbb。原来是自己挖的坑,还说啥呢?

所以,大家还需要注意:

设置启动参数时,url和后面的参数要保持编码的一致性。切记!

还是那句话,我们踩的不是坑,而是我们自己技术上的模糊点。每一个点踩实了,我们的技术能力才能得到切实的提高。和大家共勉~

原创不易,你的鼓励是我持续进步的动力,希望亲爱的们给一个在看或者小小的❤哟~ 

CC推荐· 加我微信(codenotes66),进我的技术交流群· 关注我的公众号,做一个有趣的技术人………

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转移指令jmp和跳转指令call

【-1】写在前面 以下内容文字描述来自于 王爽老师的《汇编语言》教材,建议大家都买一本,哈哈。不是我打广告,确实人家写的好,应该支持。我只是附上了自己的图片和理解而已。 【0】先上干货 只修改ip,称为段内转移&a…

jmeter负载测试测试_使用Apache JMeter负载测试Web应用程序

jmeter负载测试测试Apache JMeter是用于模拟Web应用程序上的用户负载以测试性能的出色工具。 您可以通过指定用户数量和请求间隔来轻松地构建测试计划,然后JMeter将为每个用户生成一个线程并访问您的Web应用程序。 在测试结束时,您将获得一份性能摘要报告…

Windows下安装Nutch

Nutch安装 一、需求部份 a) Nutch是Java开发的所以需要下载Java JDK 下载地址http://java.sun.com/javase/downloads/index.jsp b) Nutch的演示搜索页面是Jsp的需要Tomcat做服务器 下载地址:http://jakarta.apache.org/tomcat/ c) Nutch的脚本都是用Linux的Shell写的…

python子进程关闭fd_gpg –passphrase-fd无法使用python 3子进程

以下脚本encrypt_me.py(modified from another post)使用gpg加密自身并以装甲形式打印出密文.但它只适用于python2.7但不适用于python3?你知道它在python3上运行时有什么问题吗?import subprocessimport shleximport osimport sysin_fd, out_fd os.pipe…

程序编码(机器级代码+汇编代码+C代码+反汇编)

【-1】相关声明 本文总结于csapp; 了解详情,或有兴趣,建议看原版书籍;【0】程序编码 GCC调用了一系列程序,将源代码转化成可执行代码的流程如下: (1)C预处理器扩展源代码&#xf…

angular1.2.27_Angular 8 + Spring Boot 2.2:立即构建一个CRUD应用程序!

angular1.2.27“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 如果您已经成为Java开发人员超过15年,那么您可能还记得何时…

ssm中怎么用location.href跳到controller层_聊聊自动驾驶中的功能开发

在知乎上看过不少大牛写的自动驾驶技术介绍文章,大多谈到的是AI, Deep Learning, Computer Vision等等感知(Perception)层面的。但在各个传感器(雷达、摄像头、激光雷达等)探测到目标信息及周围环境后,车辆该如何做出反应?自动驾驶的大脑该怎…

MyEclipse详细使用教程

第一部分MyEclipse的基本使用 一.提示:MyEclipse的透视图按钮:可以切换不同的透视图(位于右上角) 1.建立一个工程 ----File—new—project—选项含有Javaproject,webproject等等—输入工程名字如myproject&…

控制语句(if-else+循环+switch)汇编规则

【1】说说条件码 最常用的的条件码有: CF:进位标志 (无符号溢出)ZF:零标志SF:符号标志(结果为负数)OF:溢出标志 (补码溢出, 有符号溢出&#xf…

zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?

zxing qr区域判断在本文中,我们将研究如何使用Zxing QR代码生成库和JFreeSVG库在Java中创建QR Code SVG图像。 QR码生成 下面的代码使用Zxing库创建一个表示QR Code的java.awt.image.BufferedImage对象: public static BufferedImage getQRCode(String …

审批流_怎样让审批工作流和应用数据分离?

在企业行政管理中,审批是最常遇到的场景。传统管理中,人们会有纸张审批,而现在市场上已有大量的线上审批软件,他们帮助企业完成审批电子化,审批速度更快,信息也能留档。然而大部分审批软件都不够灵活&#…

java 反射api_反射是最重要的Java API

java 反射api前几天我在想-这是最重要的Java API。 哪种SE和EE API可以使大多数Java生态系统成为可能,而哪些API不能重新创建为第三方库。 正如您可能已经猜到标题一样,我认为它是Reflection API 。 是的,它不可避免地是每个项目的直接或间接…

前端校验表单项内容是否合规的JS脚本代码

用途:校验ip地址的格式 输入:strIP:ip地址 返回:如果通过验证返回true,否则返回false; */ function isIP(strIP) { if (isNull(strIP)) return false; var re/^(\d).(\d).(\d).(\d)$/g //匹配IP地址的正则表达式 if(r…

过程(栈帧结构是干货)

【0】写在前面 过程(栈帧结构是干货);本文总结于csapp, 加上自己的理解;【1】栈帧结构 每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。 过程调用&#xf…

山东小学信息技术课本 python 五年级_山东教育出版社小学信息技术五年级上册教案 全册.doc...

山东教育出版社小学信息技术五年级上册教案 全册电子备课教学案学年度 第一学期学科 信息技术年级 五年级姓名教师个人备课情况统计一览表 项目?精备课二次备课课堂检测课后反思交流平台 篇数月份第( )月第( )月第( )月第( )月备注:为便于自查,此表由教…

apache ranger_Apache Ranger插件的美丽简洁

apache ranger如果您在这里,您已经知道什么是Apache Ranger 。 这是在Hadoop框架中管理安全性的最流行(即使不是唯一)的方法。 它与Active Directory,Kerberos和其他各种身份验证集成在一起,但是我认为最有趣的功能是其…

可重定位目标文件

【0】GCC将源代码转化成可执行代码的流程 (1)C预处理器cpp扩展源代码,插入所有用#include命令指定的文件,并扩展声明的宏;(2)编译器ccl产生两个源代码的汇编代码:*.s;&a…

经典颜色的RGB值

红 RED    品红Magenta(热情)    CMYK:C15 M100 Y20 K0   RGB: R207 G0 B112    洋红Carmine(大胆)   CMYK: C100 M0 Y60 K10   RGB: R215 G0 B64    宝石红Ruby(富贵)   CMYK…

python中for x in range_python教程:对 [lambda x: x*i for i in range(4)] 理解

题目:lst [lambda x: x*i for i in range(4)]res [m(2) for m in lst]print res实际输出:[6, 6, 6, 6]想要输出 [0, 2, 4, 6] 应该怎么改?如下:lst [lambda x, ii: x*i for i in range(4)]res [m(2) for m in lst]print res这…

adf.test_在ADF 12.2.1.3中使用基于JSON的REST Web服务

adf.test以前,我曾发布过有关在ADF中使用基于ADF BC的REST Web服务的信息。 现在,本文讨论使用通用数据控件使用基于JSON的REST Web服务。 您还可以查看有关Web服务的先前文章,以获取更多信息。 在ADF 12.2.1中使用应用程序模块快速创建SOA…