当前位置:   article > 正文

小程序嵌套h5界面,在h5界面调用小程序的扫一扫功能(自用方法3)_h5页面调用扫一扫

h5页面调用扫一扫

前言:

        因为小程序对项目要求比较多,我们经常会使用webview嵌套H5界面来,然后在H5界面来实现我们的一些功能页面,这里就会遇到一些问题,比如H5界面的微信扫码功能。

目录:

实现方法的尝试:(自用方法3)

方法1:

        在h5界面中,点击调用小程序的官方扫一扫功能,点击H5让动态跳转到小程序的组件方法里面,然后调用小程序的官方扫一扫方法,扫码完成以后,在拿到数据跳转到我们的H5界面

弊端:

附官方方法:

方法2:

        使用微信扫一扫功能,微信公众号的h5使用比较好,但是小程序嵌套的H5无法成功。

方法3:(自用)

        在调研各种方法以后,最终使用了这个方法。但是点击扫一扫,必须用户授权,才可以打开我们的扫一扫弹框。方法是我们手动控制打开摄像头,然后获取扫码内容,请看下面的操作步骤。

1、界面引入我们的配置文件

scan.js  (配置文件)

h5scan.js (对扫码方法进行二次封装的js)

核心方法是三个操作摄像头的方法

2、封装了一个方法 openH5Scan  ,根据你的实际需要,如果不要弹框,界面写个video也行。

3、拿到扫码内容,根据你的实际需要来截取方法,没必要非按照我的来


实现方法的尝试:(自用方法3)

方法1:

        在h5界面中,点击调用小程序的官方扫一扫功能,点击H5让动态跳转到小程序的组件方法里面,然后调用小程序的官方扫一扫方法,扫码完成以后,在拿到数据跳转到我们的H5界面

弊端:

        会出现明显的页面闪烁,我们H5跳转小程序第一次闪烁,小程序跳转回来第二次闪烁,用户体验效果不好。

附官方方法:

小程序官方扫一扫方法:js中调用就行

  1. wx.scanCode({
  2. success(res) {
  3. console.log(res)
  4. console.log(res.result);
  5. }
  6. })

参数

属性类型默认值必填说明最低版本
onlyFromCamerabooleanfalse是否只能从相机扫码,不允许从相册选择图片1.2.0
scanTypeArray.<string>['barCode', 'qrCode']扫码类型1.7.0
successfunction接口调用成功的回调函数
failfunction接口调用失败的回调函数
completefunction接口调用结束的回调函数(调用成功、失败都会执行)

object.success 回调函数

...

方法2:

        使用微信扫一扫功能,微信公众号的h5使用比较好,但是小程序嵌套的H5无法成功。

  1. wx.scanQRCode({
  2. desc: 'scanQRCode desc',
  3. needResult: 1,
  4. scanType: ['qrCode'],
  5. success: function(res) {
  6. let getCode = res.resultStr
  7. },
  8. fail: function(res) {
  9. alert('fail' + res)
  10. }
  11. })

方法3:(自用)

        在调研各种方法以后,最终使用了这个方法。但是点击扫一扫,必须用户授权,才可以打开我们的扫一扫弹框。方法是我们手动控制打开摄像头,然后获取扫码内容,请看下面的操作步骤。

1、界面引入我们的配置文件

scan.js  (配置文件)

                链接:https://pan.baidu.com/s/1VugLIvaRrTZtokU_-PQBnw   

                 提取码:dyt7

h5scan.js (对扫码方法进行二次封装的js)

核心方法是三个操作摄像头的方法

  1. function H5Scan() {
  2. var selectedDeviceId = ''; //当前的摄像头
  3. var resultText = ''; //二维码内容
  4. var resultError = ''; //二维码报错信息
  5. var callback;
  6. //调用我们的scan.js里面的方法
  7. var codeReader = new ZXing.BrowserMultiFormatReader();
  8. this.callBack = function (fun) {
  9. callback = fun;
  10. };
  11. /**
  12. * 初始化摄像头
  13. */
  14. this.initFun = function () {
  15. codeReader.listVideoInputDevices()
  16. .then((videoInputDevices) => {
  17. if (videoInputDevices.length >= 1) {
  18. //获取最后一个摄像头
  19. selectedDeviceId = videoInputDevices[videoInputDevices.length - 1].deviceId
  20. }
  21. })
  22. .catch((err) => {
  23. console.error(err)
  24. dialogBox.showMessDialog("扫码失败:" + err);
  25. })
  26. };
  27. /**
  28. * 打开摄像头
  29. */
  30. this.openCodeReader = function () {
  31. codeReader.decodeFromVideoDevice(selectedDeviceId, 'video', (result, err) => {
  32. if (result) {
  33. resultText = result.text;
  34. this.closeCodeReader('success', result.text); //关闭摄像
  35. }
  36. if (err && !(err instanceof ZXing.NotFoundException)) {
  37. resultError = err;
  38. this.closeCodeReader('error', err); //关闭摄像
  39. }
  40. })
  41. };
  42. /**
  43. *@关闭摄像头
  44. * title = 成功/失败
  45. * text = 二维码内容/报错信息
  46. * resultText 扫码成功以后的内容
  47. * resultError 扫码失败以后的报错信息
  48. * */
  49. this.closeCodeReader = function (title, text) {
  50. if (callback) {
  51. eval(callback(text));
  52. }
  53. codeReader.reset()
  54. $('.modal').hide() //关闭弹框
  55. };
  56. /**
  57. * 打开弹框
  58. */
  59. this.openScanFun = function () {
  60. this.openCodeReader()
  61. setTimeout(() => {
  62. $('.modal').show()
  63. }, 500)
  64. };
  65. /**
  66. * 初始化函数
  67. * @param callback 回调函数
  68. */
  69. this.init = function (callback) {
  70. this.callBack(callback);
  71. this.initFun();
  72. this.openScanFun();
  73. }
  74. }
  75. var H5Scan = new H5Scan();

2、封装了一个方法 openH5Scan  ,根据你的实际需要,如果不要弹框,界面写个video也行。

  1. //扫一扫弹框封装
  2. this.openH5Scan = function (callback) {
  3. //我这里是提前加载两个js,你自己用放script里面也可以
  4. this.loadJsOrCss("/js/qrcode/scan.js");
  5. this.loadJsOrCss("/js/qrcode/h5scan.js");
  6. //我这里是封装的一个弹框+内容
  7. var html = `
  8. <div class="modal" style="position: fixed;width: 100vw;height: 100vh;background: rgba(0,0,0,.8);top: 0;display: none;z-index: 100000;">
  9. <div class="closeImg" onclick="$('.modal').hide()" style="width: 15vw;height: 15vw;float:right;">
  10. <img src="../../images/close-1.png" alt="关闭" style="width: 100%;height: 100%;cursor: pointer;"/>
  11. </div>
  12. <div class="content">
  13. //***核心内容,如果你不需要弹框,只写video就行***
  14. <video id="video" autoplay="true" muted="true" playsinline="true" style="width: 90vw;height: 80vh;position: absolute;left: 5vw;top: 10vh;"></video>
  15. </div>
  16. </div>
  17. `;
  18. var val = $('.modal').html();
  19. //如果页面没有该dom,添加
  20. if (!val) {
  21. $('body').append(html);
  22. }
  23. //调用H5scan.js里面封装的方法
  24. H5Scan.init(callback);
  25. }

3、拿到扫码内容,根据你的实际需要来截取方法,没必要非按照我的来

  1. /**
  2. * 扫一扫
  3. * @param function 回调方法,获取扫码结果
  4. * @param e 扫码返回值JSON格式
  5. */
  6. page.openH5Scan(function (e) {
  7. $("#result").html(e);
  8. });

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/389501?site
推荐阅读
相关标签
  

闽ICP备14008679号