斑马线javascript无法检测设备

问题描述

Rails应用程序正在调用

<div id="sourceSelectPanel" style="display:none">
  <label for="sourceSelect">Change video source:</label>
  <select id="sourceSelect" style="max-width:400px">
  </select>
</div>
<a class="button" id="resetButton">Stop</a>
<a class="button" id="startButton">Go</a>

a javascript library,然后初始化界面。

为控制台提供了预期的ZXing code reader initialized,但是随后发生了许多错误。具体来说:

Error: Can't enumerate devices,method not supported.
listVideoInputDevices
getVideoInputDevices

这是adopted mainly from的建议示例。请注意:随着时间的推移,一行已从codeReader.getVideoInputDevices()更改为codeReader.listVideoInputDevices()。影响锡纸的变化会碰到两个错误。

但是,特殊之处在于,有时它可以工作并显示设备(相机)列表,但大多数情况下不起作用。这样做时,有时它会对startButton的提交做出反应,并且摄像机的内容会出现在视频div中

    <video id="video" width="320" height="180" style="border: 1px solid gray"></video>

这是怎么回事?以下是此用例的JavaScript

  <script type="text/javascript">
window.addEventListener('load',function () {
  let selectedDeviceId;
  const codeReader = new ZXing.BrowserMultiFormatReader()
  console.log('ZXing code reader initialized')
  codeReader.getVideoInputDevices()
    .then((videoInputDevices) => {
      const sourceSelect = document.getElementById('sourceSelect')
      selectedDeviceId = videoInputDevices[0].deviceId
      if (videoInputDevices.length >= 1) {
        videoInputDevices.forEach((element) => {
          const sourceOption = document.createElement('option')
          sourceOption.text = element.label
          sourceOption.value = element.deviceId
          sourceSelect.appendChild(sourceOption)
        })

        sourceSelect.onchange = () => {
          selectedDeviceId = sourceSelect.value;
        };

        const sourceSelectPanel = document.getElementById('sourceSelectPanel')
        sourceSelectPanel.style.display = 'block'
      }

      document.getElementById('startButton').addEventListener('click',() => {
        codeReader.decodeFromVideoDevice(selectedDeviceId,'video',(result,err) => {
          if (result) {
            console.log(result)
            document.getElementById('result').textContent = result.text
let formData = new FormData();
let CodeParams = {
  code_data: result.text,shop_id:  <%= current_shop.id %>
  };
formData.append("code_json_data",JSON.stringify(CodeParams));
$.ajax({
  url: "new_movement",type: "post",data: formData,processData: false,contentType: false,});
          }
          if (err && !(err instanceof ZXing.NotFoundException)) {
            console.error(err)
            document.getElementById('result').textContent = err
          }
        })
        console.log(`Started continous decode from camera with id ${selectedDeviceId}`)
      })

      document.getElementById('resetButton').addEventListener('click',() => {
        codeReader.reset()
        document.getElementById('result').textContent = '';
        console.log('Reset.')
      })

    })
    .catch((err) => {
      console.error(err)
    })
})

解决方法

事实证明,该脚本需要浏览器SSL连接。不仅在JS上,在信封上也是如此。

事情在localhost上运行(这是一个例外),但又部分运行(设备菜单将偶尔出现),而控制台状态ZXing code reader initialized是令人困惑的元素。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...