H5页面实现摇一摇(微信+APP内嵌入使用)

news/2024/4/20 22:53:52/文章来源:https://blog.csdn.net/tt18473481961/article/details/129255696

需求要求实现页面点击按钮摇一摇或者摇一摇手机触发抽奖。

页面会展示在微信小程序+APP中;

我在网络上找了一些方法,微信sdk中并未提供摇一摇的方法给H5页面调用,所以我采取以下方法:

h5代码判断运行环境是APP还是非APP

1.APP内 

保险起见,调用APP提供给H5这边的摇一摇方法(要和APP端的开发人员协商),h5直接调用方法,摇一摇触发之后要关闭这个摇一摇方法,不然抽完奖之后摇一摇手机还是会触发。

2.非APP内

使用shake.js,代码如下:

/** Author: Alex Gibson* https://github.com/alexgibson/shake.js* License: MIT license*/(function(global, factory) {if (typeof define === 'function' && define.amd) {define(function() {return factory(global, global.document);});} else if (typeof module !== 'undefined' && module.exports) {module.exports = factory(global, global.document);} else {global.Shake = factory(global, global.document);}
} (typeof window !== 'undefined' ? window : this, function (window, document) {'use strict';function Shake(options) {//feature detectthis.hasDeviceMotion = 'ondevicemotion' in window;this.options = {threshold: 15, //默认摇动阈值timeout: 1000  //默认两次事件间隔时间};if (typeof options === 'object') {for (var i in options) {if (options.hasOwnProperty(i)) {this.options[i] = options[i];}}}//使用date防止重复调用this.lastTime = new Date();//accelerometer valuesthis.lastX = null;this.lastY = null;this.lastZ = null;//创建自定义事件if (typeof document.CustomEvent === 'function') {this.event = new document.CustomEvent('shake', {bubbles: true,cancelable: true});} else if (typeof document.createEvent === 'function') {this.event = document.createEvent('Event');this.event.initEvent('shake', true, true);} else {return false;}}//重置时间计时器Shake.prototype.reset = function () {this.lastTime = new Date();this.lastX = null;this.lastY = null;this.lastZ = null;};//开始监听 devicemotionShake.prototype.start = function () {this.reset();var ua = navigator.userAgent.toLowerCase();if (this.hasDeviceMotion) {if (ua.indexOf("like mac os x") > 0) {// 正则判断手机系统版本var reg = /os [\d._]*/gi ;var verinfo = ua.match(reg) ;var version = (verinfo+"").replace(/[^0-9|_.]/ig,"").replace(/_/ig,".");var arr=version.split(".");console.log(arr[0]+"."+arr[1]+"."+arr[2]) //获取手机系统版本if (arr[0]>12&&arr[1]>2) {  //对13.3以后的版本处理,包括13.3DeviceMotionEvent.requestPermission().then(permissionState => {if (permissionState === 'granted') { //已授权window.addEventListener('devicemotion', this, false);//摇一摇} else if(permissionState === 'denied'){// 打开的链接不是https开头alert("当前IOS系统拒绝访问动作与方向。请退出微信,重新进入活动页面获取权限。")}}).catch((err)=>{layer.open({content: '<div style="height: 50px; text-align: center; padding-top: 20px">苹果设备申请摇动权限</div>',btn: '允许',// style: 'padding: 50px 30px;',shadeClose: false,yes: function(index){ios13granted();layer.close(index);}})});}else{  //13.3以前的版本window.addEventListener('devicemotion', this, false);}} else {window.addEventListener('devicemotion', this, false);}}};function ios13granted() {if (typeof DeviceMotionEvent.requestPermission === 'function') {DeviceMotionEvent.requestPermission().then(permissionState => {if (permissionState === 'granted') {var myShakeEvent = new Shake({threshold: 12});myShakeEvent.start();window.addEventListener('shake', function () {start();}, false); //摇一摇} else if(permissionState === 'denied'){// 打开的链接不是https开头alert("当前IOS系统拒绝访问动作与方向。请退出微信,重新进入活动页面获取权限。")}}).catch((error) => {alert("请求设备方向或动作访问需要用户手势来提示")})} else {// 处理常规的非iOS 13+设备alert("处理常规的非iOS 13+设备")}
}//停止监听 devicemotionShake.prototype.stop = function () {if (this.hasDeviceMotion) {window.removeEventListener('devicemotion', this, false);}this.reset();};//计算是否触发摇动Shake.prototype.devicemotion = function (e) {var current = e.accelerationIncludingGravity;var currentTime;var timeDifference;var deltaX = 0;var deltaY = 0;var deltaZ = 0;if ((this.lastX === null) && (this.lastY === null) && (this.lastZ === null)) {this.lastX = current.x;this.lastY = current.y;this.lastZ = current.z;return;}deltaX = Math.abs(this.lastX - current.x);deltaY = Math.abs(this.lastY - current.y);deltaZ = Math.abs(this.lastZ - current.z);if (((deltaX > this.options.threshold) && (deltaY > this.options.threshold)) || ((deltaX > this.options.threshold) && (deltaZ > this.options.threshold)) || ((deltaY > this.options.threshold) && (deltaZ > this.options.threshold))) {//calculate time in milliseconds since last shake registeredcurrentTime = new Date();timeDifference = currentTime.getTime() - this.lastTime.getTime();if (timeDifference > this.options.timeout) {window.dispatchEvent(this.event);this.lastTime = new Date();}}this.lastX = current.x;this.lastY = current.y;this.lastZ = current.z;};//事件处理Shake.prototype.handleEvent = function (e) {if (typeof (this[e.type]) === 'function') {return this[e.type](e);}};return Shake;
}));

在h5页面内引入

<script type="text/javascript" src="shake.js"></script>
 //创建实例var myShakeEvent = new Shake({threshold: 12 // 摇动阈值});// 监听设备动作myShakeEvent.start();//添加一个监听事件window.addEventListener('shake', function () {// start();console.log('摇一摇')}, false);

注意:

1、本地联调的时候这个方法不会触发,因为h5页面的链接开头必须是https://…才会触发(这个特别坑),而且微信调整了政策了,h5页面的链接必须使用ssl加密的证书。

2、在ios13.3之前的版本中可以触发摇一摇,之后的版本需要兼容,需要制作一个让用户能手动点击的弹框,才能使用户授权动作与方向的权限。(需使用https协议)

如果实在不触发,那就让设计师增加一个点一点的样式,晃动手机实在不触发那就通过点一点触发

3.关于摇一摇音效

如果是调用的APP抛出的方法,那可能是自带音效的(要看APP开发人员是怎么定义的方法)

不是调用的APP抛出的方法的话,那可以通过以下方式触发:

音效:https://download.csdn.net/download/tt18473481961/87512465

<audio preload="" id="sing"><source src="images/sing.mp3" type="audio/mp3"></audio>#sing {display: none;
}var sing=document.getElementById("sing");sing.play();

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

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

相关文章

华为OD机试模拟题 用 C++ 实现 - 寻找连续区间(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明寻找连续区间题目输入输出示例一输入输出说明示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率…

华为OD机试题,用 Java 解【求解连续数列】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

大数据算法自检

1 大数据亚线性空间算法 1.1 流模型的计数问题 问题定义&#xff1f;用什么算法&#xff1f;算法步骤&#xff1f;(提示&#xff1a;三层递进) 切比雪夫不等式&#xff1f;怎么证明&#xff1f;期望&#xff0c;方差&#xff0c;空间复杂度&#xff1f; 极其有限的空间存储极…

数据结构与算法(六):图结构

图是一种比线性表和树更复杂的数据结构&#xff0c;在图中&#xff0c;结点之间的关系是任意的&#xff0c;任意两个数据元素之间都可能相关。图是一种多对多的数据结构。 一、基本概念 图&#xff08;Graph&#xff09;是由顶点的有穷非空集合和顶点之间边的集合组成&#x…

每日分享(免登录积分商城系统 动力商城 兑换商城源码)

​demo软件园每日更新资源,请看到最后就能获取你想要的: 1.Python教程2022&#xff1a;100天从新手到大师 完整版 Python 100天从新手到大师是一个Python入门教程&#xff0c;Python从入门到精通&#xff0c;专门为热爱python的新手量身定做的学习计划&#xff0c;100天速成pyt…

OOM的俩种情况---主动kill/被动kill

出现OOM, 有两种处理方式&#xff1a;1. 主动Kill; 2. 被动Kill 例&#xff1a;HBase Region Server OOM定位问题复盘 现象 在HBase资源隔离项目中&#xff0c;对测试集群进行压测时&#xff0c;发现region server会出现崩溃的情况&#xff0c;单机请求量从>200到~50每秒都…

【Git使用教程】从入门到学废

文章目录1. 基础git流程图常用命令基本配置快捷指令解决GitBash乱码获取本地仓库基础操作指令查看修改的状态&#xff08;status&#xff09;添加工作区到暂存区(add)提交暂存区到本地仓库(commit)查看提交日志(log)版本回退添加文件至忽略列表总结2. 分支查看本地分支创建本地…

程序员多赚20k的接私活必备网站

为什么都是程序员&#xff0c;就有人能多赚20k&#xff1f;那是因为副业搞得那么溜啊&#xff01; 今天分享一些程序员搞钱必备的接私活网站&#xff0c;让更多程序员们在工作之余能有另外一份收入。 1.程序员客栈&#xff1a;http://proginn.com 专为程序员服务的软件外包对…

超级品牌符号怎么设计?大咖有方法

怎么设计超级LOGO图标&#xff1f;有方法&#xff01; LOGO设计大趋势&#xff1a;卡通化、拟人化 抽象符号已经泛滥 但卡通形象也已经泛滥 趣讲大白话&#xff1a;设计容易出名难 【安志强趣讲信息科技89期】 ******************************* 别以为设计一个卡通就牛X闪闪 比…

React Native使用echart——wrn-echarts

这里写自定义目录标题前言Tips详细使用过程如下1、开发环境搭建2、准备RN工程3、build App包4、 安装相关依赖5、试用Skia模式6、试用Svg模式7、封装Chart组件8、多个图表使用总结前言 平时写图表相关需求&#xff0c;用得最多的图表库就是echarts。echarts在web端的表现已经相…

机器学习:基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测

机器学习&#xff1a;基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测 作者&#xff1a;AOAIYI 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;AOAIYI首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞…

毕业设计 基于51单片机环境监测设计 光照 PM2.5粉尘 温湿度 2.4G无线通信

基于51单片机环境监测设计 光照 PM2.5粉尘 温湿度 2.4G无线通信1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 STC89C52单片机核心系统电路设计2.2 dht11温湿度检测电路设计2.3 NRF24L01无线通信电路设计3、部分代码展示3.1 NRF24L01初始化3.2 NRF24L01的SPI写时序3.…

【数据库】数据库基本概念和类型

一、数据库基本概念 1、数据 所谓数据&#xff08;Data&#xff09;是指对客观事物进行描述并可以鉴别的符号&#xff0c;这些符号是可识别的、抽象的。它不仅仅指狭义上的数字&#xff0c;而是有多种表现形式&#xff1a;字母、文字、文本、图形、音频、视频等。现在…

STM32开发(16)----CubeMX配置DMA

CubeMX配置DMA前言一、什么是DMA&#xff1f;二、实验过程1.CubeMX配置2.代码实现3.实验结果总结前言 本章介绍使用STM32CubeMX对DMA进行配置的方法&#xff0c;DMA的原理、概念和特点&#xff0c;配置各个步骤的功能&#xff0c;并通过串口DMA传输实验方式验证。 一、什么是…

【学习笔记汇总】Github Note

本科毕业设计 Internet of Things environmental monitoring system based on STM32 STM32系列单片机工程模板 【STM32F103_Libary】基于STM32F103开发板的工程模板 ST7735屏幕【STM32F103Template】基于STM32F103开发板的工程模板 ILI9341屏幕【STM32F103_LibaryFinalVersio…

服务拆分及远程调用

目录 服务拆分 服务拆分注意事项 服务间调用 步骤一&#xff1a;注册RestTemplate 步骤二&#xff1a;修改业务层代码 总结&#xff1a; 提供者和消费者 思考 服务调用关系 服务拆分 服务拆分注意事项 单一职责&#xff1a;不同微服务&#xff0c;不要重复开发相同业…

电压放大器和电流放大器的区别是什么意思

在日常电子实验测试中&#xff0c;很多电子工程师都会使用到电压放大器和电流放大器&#xff0c;但是很多新手工程师却无法区分两者的区别&#xff0c;下面就让安泰电子来为我们讲解电压放大器和电流放大器的区别是什么意思。 一、电压放大器介绍&#xff1a; 电压放大器是一种…

2023王道考研数据结构笔记第一章绪论

第一章 绪论 1.1 数据结构的基本概念 1.数据&#xff1a;数据是信息的载体&#xff0c;是描述客观事物属性的数、字符以及所有能输入到计算机中并被程序识别和处理的符号的集合。 2.数据元素&#xff1a;数据元素是数据的基本单位&#xff0c;通常作为一个整体进行考虑和处理…

【MySQL】数据库中锁和事务的相关知识点

1.事务的四大特点 原子性&#xff1a;事务中的所有操作要么都成功&#xff0c;要么都失败。所有的操作是一个不可分割的单位。一致性&#xff1a;一致性指的是事务执行前后&#xff0c;数据从一个合法性状态转移到另一个合法性状态。这个状态和业务有关&#xff0c;是自己定义…

Editor工具开发实用篇:EditorGUI/EditorGUILayout的区别和EditorGUILayout的方法介绍

目录 一&#xff1a;EditorGUI和EditorGUILayout区别 二&#xff1a;EditorGUILayout 1.EditorGUILayout.BeginFadeGroup(float value); 2.EditorGUILayout.BeginHorizontal EditorGUILayout.BeginVertical 3.EditorGUILayout.BeginScrollView 4.EditorGUILayout.BeginT…