jquery 无法在表单提交后自动启动Html5 Qrcode(html5-qrcode)扫描程序

2ic8powd  于 2023-06-22  发布在  jQuery
关注(0)|答案(1)|浏览(210)

我正在使用WordPress插件中的Html5Qrcode扫描仪来扫描产品条形码。我的工作流程如下:
1.启动Html5Qrcode扫描仪并扫描条形码。
2.使用解码的条形码值在表单中搜索和显示有关产品的信息。
3.在用户更新表单并单击“Submit”之后,进行 AJAX 调用以处理表单数据。
4.成功提交表单后,我希望自动重新启动Html5Qrcode扫描仪,以便用户可以扫描下一个产品。
但是,我无法在提交表单后成功重新启动扫描仪。当使用按钮单击事件手动启动时,扫描仪工作完美。仅当我尝试在 AJAX 成功回调中以编程方式启动扫描程序时,才会出现此问题。
我已经将扫描器启动过程定义为一个单独的JavaScript函数,在按钮单击事件和 AJAX 成功回调中调用该函数。
下面是相关代码的一个片段:

  1. function startScanner() {
  2. // Show the scanner and hide the product info
  3. $('#reader').show();
  4. $('#product_info').hide();
  5. if (qrreader == null) {
  6. qrreader = new Html5Qrcode(qrreaderElementId);
  7. const videoConstraints = {
  8. facingMode: "environment"
  9. };
  10. const config = {
  11. fps: 10,
  12. qrbox: {
  13. width: 250,
  14. height: 250
  15. }
  16. };
  17. let isWaitingForResponse = false;
  18. const qrCodeSuccessCallback = (decodedText, decodedResult) => {
  19. if (isWaitingForResponse) {
  20. console.log("Still waiting for the previous scan...");
  21. return;
  22. }
  23. isWaitingForResponse = true;
  24. console.log(`Message: ${decodedText}, Result: ${JSON.stringify(decodedResult)}`);
  25. $('#barcode_search').val(decodedText); // Set the value of the barcode field
  26. $("#barcode_submit").trigger('click'); // Trigger a click event on the submit button
  27. // Hide the scanner and show the product info
  28. $('#reader').hide();
  29. $('#product_info').show();
  30. // Set a timeout to allow the next scan
  31. setTimeout(() => {
  32. isWaitingForResponse = false;
  33. }, 5000); // 5000ms = 5 seconds, adjust as needed
  34. };
  35. const qrCodeErrorCallback = (errorMessage) => {
  36. console.log(errorMessage);
  37. };
  38. qrreader.start(
  39. videoConstraints,
  40. config,
  41. qrCodeSuccessCallback,
  42. qrCodeErrorCallback
  43. ).catch((error) => {
  44. console.log(error);
  45. });
  46. }
  47. }
  48. // Start scanner on button click
  49. $(document).on('click', '#start_reader', function() {
  50. startScanner();
  51. });
  52. // Start scanner after successful form submission
  53. $('#update_form').on('submit', function(event) {
  54. event.preventDefault();
  55. $.ajax({
  56. type: 'POST',
  57. url: '../my-scanner-script.php',
  58. data: $(this).serialize(),
  59. dataType: 'json',
  60. success: function(response) {
  61. if (response.status === 'success') {
  62. // Attempt to start the scanner
  63. startScanner();
  64. }
  65. }
  66. });
  67. });

尽管控制台中没有抛出错误,但表单提交后扫描仪不会重新启动。我已经验证了startScanner函数确实在 AJAX 成功回调中被调用。
我怀疑这可能是由于浏览器对自动播放媒体流的限制,而不需要用户直接操作。如果是这种情况,是否有任何变通方法允许扫描仪以编程方式重新启动?
对这个问题的任何帮助或见解将不胜感激。
先谢谢你。

lb3vh1jj

lb3vh1jj1#

  • (考虑到问题的代码片段中明显缺少一些变量)*

似乎只有当global变量qrreader
问题

  1. function startScanner() {
  2. // ...
  3. if (qrreader == null) {
  4. qrreader = new Html5Qrcode(qrreaderElementId);
  5. // ...
  6. }
  7. }

如果你再次调用startScanner qrreader * 将 * 是一个Object示例,if语句将不会运行。

可能的解决方案:

  1. let qrreader = null;
  2. function startScanner() {
  3. // ...
  4. if (!qrreader) qrreader = new Html5Qrcode(qrreaderElementId);
  5. // ...
  6. }

此外,还有一个潜在的问题,即您没有正确清除超时。清除它们,如:

  1. let waitingTimeout;
  2. function startScanner() {
  3. clearTimeout(waitingTimeout);
  4. // ...
  5. waitingTimeout = setTimeout(() => {
  6. isWaitingForResponse = false;
  7. }, 5000);
  8. // ...
  9. }

为了完整起见,这里有一个轻微的改造,使用单个示例,没有任何检查,也没有使用超时:

  1. <button id="start_reader">Start QR Code scanner</button>
  2. <form id="update_form">
  3. <div id="reader"></div>
  4. <input id="barcode_search" />
  5. <button id="barcode_submit">Submit</button>
  6. <div id="product_info">Some product info</div>
  7. </form>
  8. <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
  9. <script src="https://unpkg.com/html5-qrcode" type="text/javascript"></script>
  1. // Create a QR code reader instance
  2. const qrReader = new Html5Qrcode("reader");
  3. // QR reader settings
  4. const qrConstraints = {
  5. facingMode: "environment"
  6. };
  7. const qrConfig = {
  8. fps: 10,
  9. qrbox: {
  10. width: 250,
  11. height: 250
  12. }
  13. };
  14. const qrOnSuccess = (decodedText, decodedResult) => {
  15. stopScanner(); // Stop the scanner
  16. console.log(`Message: ${decodedText}, Result: ${JSON.stringify(decodedResult)}`);
  17. $("#barcode_search").val(decodedText); // Set the value of the barcode field
  18. $("#update_form").trigger("submit"); // Submit form to backend
  19. };
  20. // Methods: start / stop
  21. const startScanner = () => {
  22. $("#reader").show();
  23. $("#product_info").hide();
  24. qrReader.start(
  25. qrConstraints,
  26. qrConfig,
  27. qrOnSuccess,
  28. ).catch(console.error);
  29. };
  30. const stopScanner = () => {
  31. $("#reader").hide();
  32. $("#product_info").show();
  33. qrReader.stop().catch(console.error);
  34. };
  35. // Start scanner on button click
  36. $(document).on("click", "#start_reader", function() {
  37. startScanner();
  38. });
  39. // Submit
  40. $("#update_form").on("submit", function(evt) {
  41. evt.preventDefault();
  42. $.ajax({
  43. type: "POST",
  44. url: "../my-scanner-script.php",
  45. data: $(this).serialize(),
  46. dataType: "json",
  47. success: function(res) {
  48. console.log(res);
  49. if (res.status === "success") {
  50. // Attempt to start the scanner
  51. startScanner();
  52. }
  53. }
  54. });
  55. });
展开查看全部

相关问题