微信中 qrcode 生成二維碼長按無效果的解決方案

引言

我們先來看這樣一段代碼

 <divid="qrcode"ref="qrcode"class="bind-code-img"style="height: 180px;width: 180px;margin-top: 22px;display: none;
"></div>
 new QRCode("qrcode", {width: 210,height: 210,text: this.qrcodeurl,correctLevel: QRCode.CorrectLevel.L,colorLight: "#ffffff",colorDark: "#000000",});

在項目開發中,我們使用 qrcode 插件將 url 轉換成二維碼,代碼邏輯在常規瀏覽器環境下運行良好,能正常生成可視化的二維碼圖片。然而,當部署到微信瀏覽器中時,卻出現了一個棘手的問題:用戶長按二維碼圖片,無法正常吊起微信的掃描彈窗,導致二維碼掃碼功能失效。這一問題嚴重影響了用戶通過掃碼跳轉鏈接的操作流程,比如無法實現掃碼關注公眾號、跳轉活動頁面等功能。

問題排查?

我們首先來看一下微信是如何識別頁面中的圖片并且調起彈窗的

  • 檢測長按操作:微信客戶端會監測頁面中的?img?標簽,當用戶在?img?標簽內進行長按操作時,客戶端會捕捉到這個動作。
  • 執行截屏操作:客戶端確認用戶長按?img?標簽后,會進行截屏。這里的截屏并非是對手機屏幕的真實截圖,而是基于 DOM(文檔對象模型),根據頁面上可用的信息構建出一個類似屏幕截圖的圖像數據。這樣做的好處是可以避免網絡傳輸等因素的影響,更快地獲取到用于識別的圖片數據,提升用戶體驗。
  • 啟動識別算法:截屏完成后,微信會啟動圖片識別算法對截屏圖像進行分析。對于二維碼圖片,微信有專門的二維碼識別算法,能夠快速準確地識別出二維碼中的信息,并執行相應的操作,如打開鏈接、顯示相關信息等。對于普通圖片,微信可能會根據圖像的特征、內容等進行分析,以提供相應的操作選項,如保存圖片、發送給朋友等。

那么問題找到了,是不是因為我們QRcode生成出來的圖片并不是img呢?

我們看運行到瀏覽器的代碼,來看一下qrcode實現二維碼的方式

  1. 創建 canvas 元素并設置 display 為 none 進行隱藏

  2. 將 canvas 中的二維碼圖像轉換為 base64 格式,創建 img 標簽并設置其 src 屬性為轉換后的 base64 數據

但在部分手機上,尤其是微信內置瀏覽器中,canvas 元素未能被完全隱藏,導致其仍覆蓋在 img 標簽上方。這就造成了交互問題:用戶長按二維碼時,瀏覽器實際響應的是不可見 canvas 的事件,而非我們期望的 img 標簽事件,最終使得微信無法觸發識別二維碼的功能。

解決方案

 new QRCode("qrcode", {width: 210,height: 210,text: this.qrcodeurl,correctLevel: QRCode.CorrectLevel.L,colorLight: "#ffffff",colorDark: "#000000",
});
let qrcodeEle = document.getElementById("qrcode");
let cvs = qrcodeEle.querySelector("canvas");
this.qrcodeimg = cvs.toDataURL("image/png");

生成二維碼后,我們獲取當前容器下的canvas元素,將其轉換為base64編碼格式。接著隱藏原始二維碼生成容器,創建新的img元素并為其賦值。問題完美解決

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87357.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87357.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87357.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《網絡安全與防護》作業復習

填空題 1. 網絡數據庫與數據安全專項作業 填空題解析&#xff1a; 數據庫安全的“三大核心目標”是 完整性&#xff1b;保密性&#xff1b;可用性 解釋&#xff1a;數據庫安全的三個核心目標是確保數據的完整性、保密性以及可用性&#xff0c;即保護數據不被篡改、未經授權訪…

【windows常見文件后綴】

文件后綴解釋css層疊樣式表&#xff08;Cascading Style Sheets&#xff09;&#xff1a;用于描述HTML或XML&#xff08;包括如SVG、XHTML等XML方言&#xff09;文檔的呈現樣式&#xff0c;控制網頁的布局、顏色、字體等視覺效果。jsJavaScript&#xff1a;一種輕量級的解釋型或…

labelme啟動報錯動態鏈接庫DLL初始化例程失敗

安裝 pip install labelme啟動 labelmewin11python3.12&#xff0c;pycharm venv 安裝&#xff1a; pip install labelme&#xff0c;啟動labelme報錯&#xff1a; 降級numpy&#xff0c;降級onnxruntime pip install “numpy<2.0” pip install onnxruntime1.18.0 再次cm…

Mybatis(javaweb第九天)

Mybatis基礎操作 占位符&#xff1a;#{變量名} 注意事項&#xff1a;如果Mapper接口方法只有一個普通類型參數&#xff0c;屬性名可以隨便寫 > Preparing: delete from emp where id? > Parameters: 1(Integer) 預編譯SQL 不會將值直接放在SQL語句中&#xff0c;而是…

C#開發MES管理系統源碼工業生產線數據采集WPF上位機產線執行系統源碼

該源碼是實際生產線運行的實際項目&#xff0c;全套源碼。適合開發者學習參考&#xff0c;有需要源碼可以聯系博主

`ngx_otel_module` NGINX OpenTelemetry 分布式追蹤實戰

1. 模塊簡介 ngx_otel_module 為 NGINX&#xff08;開源版 1.25.3&#xff0c;商業版 1.23.4&#xff09;提供了 OpenTelemetry&#xff08;OTel&#xff09;分布式追蹤支持&#xff0c;能夠&#xff1a; 自動采集 HTTP 請求的生命周期 Span上下文傳播&#xff1a;兼容 W3C t…

Vue+TypeScript 枚舉(Enum)的使用規范

在 TypeScript 中&#xff0c;枚舉&#xff08;Enum&#xff09;的命名應遵循以下規范&#xff0c;這些規范結合了 TypeScript 官方建議和行業最佳實踐&#xff1a; 枚舉命名規范&#xff08;TypeScript/Vue 項目&#xff09; 基本命名規則&#xff1a; 使用 PascalCase&#…

一個完整的LSTM風光發電預測與并網優化方案,包含數據處理、模型構建、訓練優化、預測應用及系統集成實現細節

以下是一個完整的LSTM風光發電預測與并網優化方案,包含數據處理、模型構建、訓練優化、預測應用及系統集成實現細節: 風光發電功率預測與并網優化系統 基于LSTM的時間序列預測與儲能協同控制 第一部分:系統架構設計(1200字) 1.1 整體技術路線 #mermaid-svg-U5pxzefmzZ4s…

如何在 MX Linux 上安裝 Mint 的 Cinnamon 桌面 UI

如何在 MX Linux 上安裝 Mint 的 Cinnamon 桌面 UI 你是否想在 MX Linux 上安裝流行的 Linux Mint Cinnamon 圖形用戶界面?那么這里有一個教程…… Cinnamon 是一個類似 Windows 7 的界面,它默認安裝在 Linux Mint 操作系統中。它使 Mint 非常易于理解和使用,這也是 Mint …

OpenStack 入門

目錄 簡介 一、云計算與 OpenStack 基礎概念 1.1 云計算概述 1.2 OpenStack 簡介 二、OpenStack 單機環境部署 2.1 環境準備 2.2 部署前準備工作 2.3 在線部署 OpenStack&#xff08;Train 版本&#xff09; 三、通過 Dashboard 部署 OpenStack 的功能 3.1 登錄 Dash…

【Git】關于項目開發分支的使用規范

背景 在項目開發過程中&#xff0c;往往一個優秀的產品都會出現不斷的版本迭代&#xff0c;我時常在項目發布后對于如何結合后續更新的業務場景在分支上的應用沒有一個很好的辦法&#xff0c;一直也比較苦惱。目前項目的迭代場景如下&#xff0c;一個A項目&#xff0c;經過需求…

msquic的windows版本編譯

首先確保安裝cmake和powershell&#xff08;需要6以上&#xff0c;本人升級到了7.5&#xff09;&#xff0c;vs&#xff08;本人用的vs2022&#xff09; powershell&#xff0c;默認是5&#xff0c;會編譯不成功&#xff0c;所以附帶一個升級的流程 $PSVersionTable.PSVersion …

批量文件重命名工具 OncePower ,永久免費!

軟件介紹 適用于Windows OncePower是一款Windows批量重命名工具&#xff0c;支持基本及高級匹配重命名&#xff0c;無需復雜正則。特色包括匹配修改、長度截取、日期命名、前綴后綴修改及TXT文件導入。支持保留特定內容、批量移動文件和刪除空文件夾。可保存設置&#xff0c;…

Python入門Day6.1:異常處理

一、什么是異常&#xff08;Exception&#xff09;&#xff1f; 異常是指程序運行過程中出現的錯誤情況。比如&#xff1a; 打開一個不存在的文件0作為除數列表索引越界類型轉換失敗 二、基本結構&#xff1a;try...except try:# 可能出錯的代碼 except 錯誤類型:# 出錯時執…

C++中的標準模板(STL)

C中的核心標準模板包含&#xff1a;容器、迭代器、算法、函數對象、適配器。 1.容器 容器提供了各種數據結構&#xff0c;包括向量(vector)、鏈表(list)、隊列(queue)、棧(stack)、集合(set)、映射(map)等&#xff0c;可以根據實際需求選擇合適的容器。 容器分為三大類&…

excel 待辦日歷軟件(需要宏)特別推薦

Excel待辦日歷軟件是一款基于Excel表格的日程管理工具&#xff0c;能夠幫助用戶更高效地管理待辦事項和日程安排。用戶可以在軟件中創建不同的任務列表&#xff0c;以便更好地進行管理和跟蹤。軟件還提供了日歷視圖&#xff0c;用戶可以直觀地查看和安排每日的任務&#xff0c;…

激活函數-sigmoid、tanh、relu、softmax對比

激活函數是神經網絡的核心組件&#xff0c;用于引入非線性特性&#xff0c;使網絡能夠學習復雜模式。以下從定義、作用、分類及應用場景進行詳細解析&#xff1a; &#x1f50d; ??一、定義?? 激活函數&#xff08;Activation Function&#xff09;是作用于神經元輸出的?…

三步走實現嵌入式硬件與軟件開發

目錄 ? 一、嵌入式硬件與軟件的邊界(為你后面每階段安排任務打基礎) ? 二、三階段開發策略規劃(以你的三步走為主線) ??階段1:確定能做 → 外包技術顧問協助選型 + 需求拆解 + 采購建議 適用角色 關鍵目標 如何管理? 工具推薦 ??階段2:會做一些 → 小范圍…

ubuntu運行cursor

一.CURSOR官網下載AppImage文件 https://www.cursor.com/en/download 二、解壓 AppImage 繞過掛載機制 解決&#xff1a;默認使用Cursor.AppImage 會自動掛載臨時目錄在/tmp目錄下&#xff0c;出現沒有權限掛載的報錯問題 若掛載點仍不可寫&#xff0c;直接解壓 AppImage 運…

PTA天梯賽L1 071-080題目解析

目錄 1.L1-071 前世檔案 2.L1-072 刮刮彩票 3.L1-073 人與神 4.L1-074 兩小時學完C語言 5.L1-075 強迫癥 6.L1-076 降價提醒機器人 7.L1-077 大笨鐘的心情 8.L1-078 吉老師的回歸 9.L1-079 天梯賽的善良 10.L1-080 乘法口訣數列 1.L1-071 前世檔案 解析&#xff1a;…