在用户增长业务中,通过各种取巧方式打开微信小程序是一个特别常见的业务需求,但是微信也不想就这么“被利用”,以前微信可能还是很好的分享渠道,但是随着更新迭代,已经关闭了很多入口。我们也是在业务需求下不停的寻找更多的解决办法。 一、URL Scheme 原理:前端提供路径和appid,后端对接微信获取accesstoken和短链,最后前端负责……
标签目录:前端
以下是与标签 “前端” 相关联的文章让人久久不能忘怀的是业务的坑
今天来吐槽一下多业务协作的坑,最近一周几乎都杠在这些协作问题上。 首先有几个前提,一个是小程序A,一个父级小程序B,两个都是小程序,只是B中会有A的子包,这个做小程序开发的应该了解;另外就是多个业务了,模板和组件,模板偏UI,是公用的,组件偏流程,是自定义的。 问题1:我在调试小程序A的时候模板正常, 在调试B的时候模板始终不展示。 问题……
js实现同步等待
场景:用户下单后需要支付,但是支付前需要确定用户的订单是否生成,这就需要在用户操作后,不断查询订单状态。 方法:无非就是设置一个定时器,每隔n秒去查一下,如果状态ok就走下一步,不行就等待,直到获取成功。当然了,可以设置一个最多界限。 第一种方法:promise
1 2 3 4 5 6 7 8 9 10 11 12 |
const check = async (times=0) => { if(times > 3){ return; } const res = await new Promise((resolve) => { setTimeout(async () => { const prom = await check(times + 1); resolve(prom); }, 1000); }); return res; } |
第二种方法……
userAgent判断合集
通过navigator.userAgent判断一些设备和环境类型,总结了一些:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
//系统 var webkit = ua.match(/Web[kK]it[/]{0,1}([\d.]+)/); var android = ua.match(/(Android);?[\s/]+([\d.]+)?/); var osx = !!ua.match(/\(Macintosh; Intel /); var ipad = ua.match(/(iPad).*OS\s([\d_]+)/); var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); var iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/); var webos = ua.match(/(webOS|hpwOS)[\s/]([\d.]+)/); var wp = ua.match(/Windows Phone ([\d.]+)/);var touchpad = webos && ua.match(/TouchPad/); //app var chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/); var firefox = ua.match(/Firefox\/([\d.]+)/); var firefoxos = ua.match(/\((?:Mobile|Tablet); rv:([\d.]+)\).*Firefox\/[\d.]+/); var webview = !chrome && ua.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/); var safari = webview || ua.match(/Version\/([\d.]+)([^S](Safari)|[^M]*(Mobile)[^S]*(Safari))/); var qq = ua.match(/(QQBrowser)\/([\d.]+)/); var baidubox = ua.match(/baiduboxapp\/([\d.]+)/i); var baidubrowser = ua.match(/baidubrowser\/([\d.]+)/i); var weixin = ua.match(/MicroMessenger\/([\d.]+)/i); var iqiyi = ua.match(/iqiyi\s*IqiyiVersion\/([\d.]+)/i); var uc = ua.match(/(?:ucbrowser|ucweb)\/([\d.]+)/i) || typeof ucweb !== 'undefined'; var qqApp = ua.match(/(QQ)\/([\d.]+)/); var readApp = ua.match(/iqiyireader IqiyiReaderVersion\/([\d.]+)/i); // 爱奇艺阅读 var readPlugin = ua.match(/IqiyiVersion_Reader\/([\d.]+)/i); // 爱奇艺阅读插件 var youku = ua.match(/Youku\/([\d.]+)/i); var xigua = ua.match(/VideoArticle\/([\d.]+)/i); var toutiao = ua.match(/NewsArticle\/([\d.]+)/i); //设备 var oppo = ua.match(/OPPO (\w+) |OppoBrowser\/(\w+)/i); var vivo = ua.match(/vivo (\w+) /i); var sumsung = ua.match(/SM-(\w+) /i); var le = ua.match(/(?:Letv|Le) (\w+) Build/i); var mi = ua.match(/(?:MI) ([\w ]+) Build/i); var huawei = ua.match(/(?:HUAWEI ([\w-]+) Build)|(?:; (?:HW-)?([\w-]+) Build\/(?:HUAWEI|HONOR))/i); var redmi = ua.match(/(?:Redmi|HM) ([\w ]+) Build/i); var meizu = ua.match(/(((?:meizu\/|m|mx|PRO) ?(?:[0-9]+)) ?(?:\w*)) Build/i); |
phantom将网页转成图片乱码
我们书接上回,继续来说乱码的问题。我也是好久没在centos上操作了,一时间也是翻看各种资料。 其实已经在本地和测试服务器都试过了,是没问题的,但是后来在一个cocker里运行,发现乱码,想必是这个docker有什么问题吧。 1、先是设置了docker的容器编码格式,重启服务,发现不行; 2、设置phantom的编码格式,网上有说:pha……
nodejs把html转化为image
业务需求:每个用户都可以生成自己的卡片,并分享到朋友圈。 尝试:canvas画图。但是部分安卓手机不支持,iPhone6以下不支持,最大的问题是canvas功能实现的过程是比较麻烦的,尤其是布局的部分,时刻挑战你的额GPU。网上有一个html2canvas的库,可以把指定的div转化为canvas,不过如果手机本身不支持的话,恐怕这个库也……
“前端”背后刀–Lottie
最近一个项目中UI同学给了我一个json文件,说可以用lottie操作,完成一个动画——哇?!设计同学都这么牛了吗! 话不多说,按照惯例,先上代码图: 代码不难,就是引用一个库文件,然后初始化,文章末尾附上了比较官方都手册,其中的animationData可以换成path,定义一个在线路径,这样可以在打包的时候减少包的大小,而且还可以随时……
微信小程序广告收益
没事弄个小程序,等累计用户过千,就可以投放一些广告进去,坐等收益,想象很美好。而现实确实,收益甚少! 广告收益计算方式 单日广告收入流水10万元以内(含)的部分,开发者可获其中50%, 单日广告收入流水超过10万元的部分,开发者可获其中30%。 以单日广告收入15万元为例,开发者收益=10万 * 50% + 5万 * 30% = 6.5万……
H5调用摄像头
最近要做的一个项目需要调用移动摄像头,想必大家也都清楚,这个兼容性很不好,除了在pc上测试通过,移动端很少有可行的。最终这个功能弱化,而在端内进行。但是我还是把代码贴出来,方便学习。 HTML代码
1 2 3 4 5 6 7 8 |
<!--video用于显示媒体设备的视频流,自动播放--> <video id="video" autoplay style="width: 480px;height: 320px;background: #999">当前浏览器不支持video</video> <!--拍照按钮--> <div> <button id="capture">拍照</button> </div> <!--描绘video截图--> <canvas id="canvas" width="480" height="320"></canvas> |
js代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
//访问用户媒体设备的兼容方法 function getUserMedia(constraints, success, error) { if (navigator.mediaDevices.getUserMedia) { //最新的标准API navigator.mediaDevices.getUserMedia(constraints).then(success).catch(error); } else if (navigator.webkitGetUserMedia) { //webkit核心浏览器 navigator.webkitGetUserMedia(constraints,success, error) } else if (navigator.mozGetUserMedia) { //firfox浏览器 navigator.mozGetUserMedia(constraints, success, error); } else if (navigator.getUserMedia) { //旧版API navigator.getUserMedia(constraints, success, error); } } var video = document.getElementById('video'); var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); function success(stream) { //兼容webkit核心浏览器 var CompatibleURL = window.URL || window.webkitURL; //将视频流设置为video元素的源 console.log(stream); //video.src = CompatibleURL.createObjectURL(stream); video.srcObject = stream; video.play(); } function error(error) { console.log(`访问用户媒体设备失败${error.name}, ${error.message}`); } if (navigator.mediaDevices.getUserMedia || navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia) { //调用用户媒体设备, 访问摄像头 getUserMedia({video : {width: 480, height: 320}}, success, error); } else { alert('不支持访问用户媒体'); } document.getElementById('capture').addEventListener('click', function () { context.drawImage(video, 0, 0, 480, 320); }) |
……
mpvue的注意事项
最近手贱,写了个mpvue的项目,有一些问题和想法,跟大家分享一下。 比较打击人的一点是美团对这个孩子的关注下降了,从官方的log记录来看,19年以来,都没在更新了,有一些其他的框架可能更好,所以mpvue的使用可能比较受限,但是如果你是vue用户倒是可以尝试。另外是如果你在js中写了wx的方法,它是不会给你转化成my的,所以用起来可能要……