欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

HTML5打开手机扫码功能及优缺点

程序员文章站 2022-08-04 16:46:32
1.解决的问题: 1.能够在微博客户端呼起摄像头扫描二维码并且解析; 2.能够在原生和微信客户端中扫描二维码并且解析; 2.优点: web端或者是 h5端可以直接完成扫码的工作; 3.缺点: 图片不...
1.解决的问题:

1.能够在微博客户端呼起摄像头扫描二维码并且解析;

2.能够在原生和微信客户端中扫描二维码并且解析;

2.优点:

web端或者是 h5端可以直接完成扫码的工作;

3.缺点:

图片不清晰很容易解析失败(拍照扫描图片需要镜头离二维码的距离很近),相对于 native 呼起的摄像头解析会有1-2秒的延时。

说明:

此插件需要配合zepto.js 或者 jquery.js使用

使用方法:

1.在需要使用的页面按照下面顺序引入lib目录下的 js 文件

<script src="lib/zepto.js"></script>
<script src="lib/qrcode.lib.min.js"></script>
<script src="lib/qrcode.js"></script>

2.自定义按钮的 html 样式

为自定义的按钮添加自定义属性,属性名称为node-type

为 input 按钮添加自定义的属性, 属性名称为node-type

因为该插件需要使用<input type="file" /> ,该 html 结构在网页上面是有固定的显示样式,为了能够自定义按钮样式,我们可以按照下面的示例代码结构嵌套代码

<p>
       <p class="qr-btn" node-type="qr-btn">扫描二维码1
           <input node-type="jsbridge" type="file" name="myphoto" value="扫描二维码1" />
       </p>
   </p>

然后设置 input 按钮的 css 隐藏按钮,比如我使用的是属性选择器

input[node-type=jsbridge]{

display:none;

}

这里我们只需要按照自己的需要定义class="qr-btn"的样式即可。

3.在页面上初始化 qrcode 对象

//初始化扫描二维码按钮,传入自定义的 node-type 属性

$(function() {

qrcode.init($('[node-type=qr-btn]'));

});

主要代码解析

(function($) {

var qrcode = function(tempbtn) {

var _this_ = this;

var isweibowebview = /__weibo__/.test(navigator.useragent);

if (isweibowebview) {

if (window.weibojsbridge) {

_this_.bridgeready(tempbtn);

} else {

document.addeventlistener('weibojsbridgeready', function() {

_this_.bridgeready(tempbtn);

});

}

} else {

_this_.nativeready(tempbtn);

}

};

qrcode.prototype = {

nativeready: function(tempbtn) {

$('[node-type=jsbridge]',tempbtn).on('click',function(e){

e.stoppropagation();

});

$(tempbtn).bind('click',function(e){

$(this).find('input[node-type=jsbridge]').trigger('click');

});

$(tempbtn).bind('change', this.getimgfile);

},

bridgeready: function(tempbtn) {

$(tempbtn).bind('click', this.weibobridge);

},

weibobridge: function() {

window.weibojsbridge.invoke('scanqrcode', null, function(params) {

//得到扫码的结果

$('.result-qrcode').append(params.result + '
');

});

},

getimgfile: function() {

var _this_ = this;

var inputdom = $(this).find('input[node-type=jsbridge]');

var imgfile = inputdom[0].files;

var ofile = imgfile[0];

var ofreader = new filereader();

var rfilter = /^(?:image\/bmp|image\/cis\-cod|image\/gif|image\/ief|image\/jpeg|image\/jpeg|image\/jpeg|image\/pipeg|image\/png|image\/svg\+xml|image\/tiff|image\/x\-cmu\-raster|image\/x\-cmx|image\/x\-icon|image\/x\-portable\-anymap|image\/x\-portable\-bitmap|image\/x\-portable\-graymap|image\/x\-portable\-pixmap|image\/x\-rgb|image\/x\-xbitmap|image\/x\-xpixmap|image\/x\-xwindowdump)$/i;

if (imgfile.length === 0) {

return;

}

if (!rfilter.test(ofile.type)) {

alert("选择正确的图片格式!");

return;

}

ofreader.onload = function(ofrevent) {

qrcode.decode(ofrevent.target.result);

qrcode.callback = function(data) {

//得到扫码的结果

$('.result-qrcode').append(data + '
');

};

};

ofreader.readasdataurl(ofile);

},

destory: function() {

$(tempbtn).off('click');

}

};

qrcode.init = function(tempbtn) {

var _this_ = this;

tempbtn.each(function() {

new _this_($(this));

});

};

window.qrcode = qrcode;

})(window.zepto ? zepto : jquery);