澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

h5端呼起摄像头扫描二维码并深入分析,扣丁学堂

2019-07-15 作者:澳门新萄京赌场网址   |   浏览(166)

H5端呼起摄像头扫描二维码并解析

2016/01/22 · HTML5 · 二维码

本文作者: 伯乐在线 - zhiqiang21 。未经作者许可,禁止转载!
欢迎加入伯乐在线 专栏作者。

Html5实现二维码扫描并解析,html5解析

引子:
最近公司项目有个需求,微博客户端中, h5 的页面上的某个按钮能够与native 交互呼起摄像头,扫描二维码并且解析。在非微博客户端中(微信或者是原生浏览器,如:safari)呼起系统的拍照或者上传图片按钮,通过拍照或者上传图片解析二维码。
第二种方案需要在前端 js 解析二维码。这样依赖一个第三方的解析库jsqrcode。这个库已经支持在浏览器端呼起摄像头的操作了,但是依赖一个叫getUserMedia的属性。该属性移动端的浏览器支持的都不是很好,所以只能间接的上传图片的方式解析二维码。
getUserMedia属性兼容浏览器列表:

图片 1

首先感谢 jsqrcode 的开发者,提供这么优秀的解析二维码的代码,为我减少了很大的工作量。jsqrcode 地址:点我
我的代码库地址:点我
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 样式
因为该插件需要使用<input type="file" /> ,该 html 结构在网页上面是有固定的显示样式,为了能够自定义按钮样式,我们可以按照下面的示例代码结构嵌套代码

代码如下:
<div class="qr-btn" node-type="jsbridge">扫描二维码1
<input node-type="jsbridge" type="file" name="myPhoto" value="扫描二维码1" />
</div>

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

代码如下:
input[node-type=jsbridge]{
visibility: hidden;
}

这里我们只需要按照自己的需要定义class="qr-btn"的样式即可。
3.在页面上初始化 Qrcode 对象

代码如下:
//初始化扫描二维码按钮,传入自定义的 node-type 属性
$(function() {
Qrcode.init($('[node-type=jsbridge]'));
});

主要代码解析

代码如下:
(function($) {
var Qrcode = function(tempBtn) {
//该对象只支持微博域下的解析,也就是说不是微博域下的页面只能用第二种方案解析二维码
if (window.WeiboJSBridge) {
$(tempBtn).on('click', this.weiBoBridge);
} else {
$(tempBtn).on('change', this.getImgFile);
}
};
Qrcode.prototype = {
weiBoBridge: function() {
WeiboJSBridge.invoke('scanQRCode', null, function(params) {
//得到扫码的结果
location.href=params.result;
});
},
getImgFile: function() {
var _this_ = this;
var imgFile = $(this)[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) {
//得到扫码的结果
location.href = data;
};
};
oFReader.readAsDataURL(oFile);
},
destory: function() {
$(tempBtn).off('click');
}
};
//初始化
Qrcode.init = function(tempBtn) {
var _this_ = this;
var inputDom;
tempBtn.each(function() {
new _this_($(this));
});
$('[node-type=qr-btn]').on('click', function() {
$(this).find('[node-type=jsbridge]')[0].click();
});
};
window.Qrcode = Qrcode;
})(window.Zepto ? Zepto : jQuery);

样例展示
1.呼起前的页面

图片 2

2.呼起后的页面

图片 3

引子: 最近公司项目有个需求,微博客户端中, h5 的页面上的某个按钮能够与native 交互呼起摄像头...

如今手机支付扫码已经广泛的应用与我们的生活中,今天本篇文章小编就和大家分享一下HTML5打开手机扫码功能的优缺点,文章中列出详细的代码供大家参考,喜欢HTML5开发技术的小伙伴下面就随小编一起来看一下吧。

h5端呼起摄像头扫描二维码并解析

引子:

最近公司项目有个需求,微博客户端中, h5 的页面上的某个按钮能够与native交互呼起摄像头,扫描二维码并且解析。在非微博客户端中(微信或者是原生浏览器,如:safari)呼起系统的拍照或者上传图片按钮,通过拍照或者上传图片解析二维码。

第二种方案需要在前端 js 解析二维码。这样依赖一个第三方的解析库jsqrcode。这个库已经支持在浏览器端呼起摄像头的操作了,但是依赖一个叫getUserMedia的属性。该属性移动端的浏览器支持的都不是很好,所以只能间接的上传图片的方式解析二维码。

getUserMedia属性兼容浏览器列表:
图片 4

首先感谢jsqrcode的开发者,提供这么优秀的解析二维码的代码,为我减少了很大的工作量。jsqrcode 地址:点我

我的代码库地址:点我

2016年6月29日补充:

最近做了一些与表单相关的项目,使用了h5的input控件,在使用过程中遇到了很多的坑。也包括与这篇文章相关的。

首先我们应该知道使用h5新提供的属性getUserMedia这个属性,是可以调取系统的摄像头进行拍照或者是摄像的,但是兼容性支持的不好,所以当我们需要获取系统的多媒体权限时我们都不会采用这个属性。

使用<input type="file">标签我们可以间接的呼起系统选择文件的窗口,来读取系统文件。但是在WebView中,因为安卓权限的问题,我们是没办法直接获取读取文件这个操作的。而在原生的浏览器中是不存在这个问题的。所以选择使用这个input的时候一定要注意自己的页面是主要运行在webview中还是浏览器中。如果注意运行在客户端的webvie中,是需要客户端的同学支持的。

在IOS的某些系统版本中也会出现这个问题。具体的可以参考下面的参考文章。
参考文章:

图片 5扣丁学堂HTML5培训

引子:

最近公司项目有个需求,微博客户端中, h5 的页面上的某个按钮能够与native交互呼起摄像头,扫描二维码并且解析。在非微博客户端中(微信或者是原生浏览器,如:safari)呼起系统的拍照或者上传图片按钮,通过拍照或者上传图片解析二维码。

第二种方案需要在前端 js 解析二维码。这样依赖一个第三方的解析库jsqrcode。这个库已经支持在浏览器端呼起摄像头的操作了,但是依赖一个叫getUserMedia的属性。该属性移动端的浏览器支持的都不是很好,所以只能间接的上传图片的方式解析二维码。

getUserMedia属性兼容浏览器列表:
图片 6

首先感谢jsqrcode的开发者,提供这么优秀的解析二维码的代码,为我减少了很大的工作量。jsqrcode 地址:点我

我的代码库地址:点我

1.解决的问题:

1.能够在微博客户端呼起摄像头扫描二维码并且解析;
2.能够在原生浏览器和微信客户端中扫描二维码并且解析;

引子:

最近公司项目有个需求,微博客户端中, h5 的页面上的某个按钮能够与native 交互呼起摄像头,扫描二维码并且解析。在非微博客户端中(微信或者是原生浏览器,如:safari)呼起系统的拍照或者上传图片按钮,通过拍照或者上传图片解析二维码。

第二种方案需要在前端 js 解析二维码。这样依赖一个第三方的解析库jsqrcode。这个库已经支持在浏览器端呼起摄像头的操作了,但是依赖一个叫getUserMedia的属性。该属性移动端的浏览器支持的都不是很好,所以只能间接的上传图片的方式解析二维码。

getUserMedia属性兼容浏览器列表:
图片 7

首先感谢 jsqrcode 的开发者,提供这么优秀的解析二维码的代码,为我减少了很大的工作量。jsqrcode 地址:点我

我的代码库地址:点我

1.解决的问题:

1.能够在微博客户端呼起摄像头扫描二维码并且解析;
2.能够在原生浏览器和微信客户端中扫描二维码并且解析;

2.优点:

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

1.解决的问题:

1.能够在微博客户端呼起摄像头扫描二维码并且解析;
2.能够在原生浏览器和微信客户端中扫描二维码并且解析;

1、解决的问题:

2.优点:

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

3.缺点:

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

2.优点:

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

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

3.缺点:

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

说明:

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

3.缺点:

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

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

说明:

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

使用方法:

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

<code class="sourceCode javascript hljs">    <!--{cke_protected}-->
    <!--{cke_protected}-->
    <!--{cke_protected}--></code>

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

<code class="sourceCode html hljs xml">        扫描二维码1
            <input node-type="jsbridge" data-cke-saved-name="myPhoto" name="myPhoto" value="扫描二维码1" data-cke-editable="1" contenteditable="false" type="file">
        </code>

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

input[node-type=jsbridge]{
    visibility: hidden;
}

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

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

    //初始化扫描二维码按钮,传入自定义的 node-type 属性
    $(function() {
        Qrcode.init($('[node-type=jsbridge]'));
    });

说明:

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

2、优点:

使用方法:

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

<code class="sourceCode javascript hljs">    <!--{cke_protected}-->
    <!--{cke_protected}-->
    <!--{cke_protected}--></code>

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

<code class="sourceCode html hljs xml">        扫描二维码1
            <input node-type="jsbridge" data-cke-saved-name="myPhoto" name="myPhoto" value="扫描二维码1" data-cke-editable="1" contenteditable="false" type="file">
        </code>

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

input[node-type=jsbridge]{
    visibility: hidden;
}

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

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

    //初始化扫描二维码按钮,传入自定义的 node-type 属性
    $(function() {
        Qrcode.init($('[node-type=jsbridge]'));
    });

主要代码解析

(function($) {

    var Qrcode = function(tempBtn) {
        //该对象只支持微博域下的解析,也就是说不是微博域下的页面只能用第二种方案解析二维码
        if (window.WeiboJSBridge) {
            $(tempBtn).on('click', this.weiBoBridge);
        } else {
            $(tempBtn).on('change', this.getImgFile);
        }
    };

    Qrcode.prototype = {
        weiBoBridge: function() {
            WeiboJSBridge.invoke('scanQRCode', null, function(params) {
                //得到扫码的结果
                location.href=params.result;
            });
        },
        getImgFile: function() {
            var _this_ = this;
            var imgFile = $(this)[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) {
                    //得到扫码的结果
                    location.href = data;
                };
            };

            oFReader.readAsDataURL(oFile);
        },
        destory: function() {
            $(tempBtn).off('click');
        }
    };

    //初始化
    Qrcode.init = function(tempBtn) {
        var _this_ = this;
        var inputDom;

        tempBtn.each(function() {
            new _this_($(this));
        });
        $('[node-type=qr-btn]').on('click', function() {
            $(this).find('[node-type=jsbridge]')[0].click();
        });
    };
    window.Qrcode = Qrcode;
})(window.Zepto ? Zepto : jQuery);

使用方法:

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

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

1
2
3
   <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

因为该插件需要使用 style="font-family: 'Courier 10 Pitch', Courier, monospace;font-size: 12px;background-color: #f4f4f4"><input type=”file” /> ,该 html 结构在网页上面是有固定的显示样式,为了能够自定义按钮样式,我们可以按照下面的示例代码结构嵌套代码

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

1
2
3
4
5
    <div>
        <div class="qr-btn" node-type="qr-btn">扫描二维码1
            <input node-type="jsbridge" type="file" name="myPhoto" value="扫描二维码1" />
        </div>
    </div>

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

input[node-type=jsbridge]{ display:none; }

1
2
3
input[node-type=jsbridge]{
    display:none;
}

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

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

//初始化扫描二维码按钮,传入自定义的 node-type 属性 $(function() { Qrcode.init($('[node-type=qr-btn]')); });

1
2
3
4
    //初始化扫描二维码按钮,传入自定义的 node-type 属性
    $(function() {
        Qrcode.init($('[node-type=qr-btn]'));
    });

主要代码解析

<pre code_snippet_id="1562226" snippet_file_name="blog_20160122_1_1027181" name="code" class="javascript">(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 '<br/>'); }); }, 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 '<br/>'); }; }; 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);</pre><br><br>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<pre code_snippet_id="1562226" snippet_file_name="blog_20160122_1_1027181" name="code" class="javascript">(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 '<br/>');  
            });  
        },  
        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 '<br/>');  
                };  
            };  
 
            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);</pre><br><br>

 

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

主要代码解析

(function($) {

    var Qrcode = function(tempBtn) {
        //该对象只支持微博域下的解析,也就是说不是微博域下的页面只能用第二种方案解析二维码
        if (window.WeiboJSBridge) {
            $(tempBtn).on('click', this.weiBoBridge);
        } else {
            $(tempBtn).on('change', this.getImgFile);
        }
    };

    Qrcode.prototype = {
        weiBoBridge: function() {
            WeiboJSBridge.invoke('scanQRCode', null, function(params) {
                //得到扫码的结果
                location.href=params.result;
            });
        },
        getImgFile: function() {
            var _this_ = this;
            var imgFile = $(this)[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) {
                    //得到扫码的结果
                    location.href = data;
                };
            };

            oFReader.readAsDataURL(oFile);
        },
        destory: function() {
            $(tempBtn).off('click');
        }
    };

    //初始化
    Qrcode.init = function(tempBtn) {
        var _this_ = this;
        var inputDom;

        tempBtn.each(function() {
            new _this_($(this));
        });
        $('[node-type=qr-btn]').on('click', function() {
            $(this).find('[node-type=jsbridge]')[0].click();
        });
    };
    window.Qrcode = Qrcode;
})(window.Zepto ? Zepto : jQuery);

样例展示

样例展示

3、缺点:

样例展示

1.呼起前的页面

图片 8

1.呼起前的页面

图片 9

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

1.呼起前的页面

图片 10

2.呼起后的页面

图片 11


如果您觉得对您有帮助,请点击下面的 star 给我一颗星。谢谢啦!

2.呼起后的页面

图片 12

打赏支持我写出更多好文章,谢谢!

打赏作者

说明:

2.呼起后的页面

图片 13


h5端呼起摄像头扫描二维码并深入分析,扣丁学堂简述HTML5开拓手计算机扫描码功效的利害。如果您觉得对您有帮助,请点击下面的 star 给我一颗星。谢谢啦!

引子: 最近公司项目有个需求,微博客户端中, h5 的页面上的某个按钮能够与 native 交互呼起摄像头,扫...

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

图片 14 图片 15

1 赞 7 收藏 评论

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

关于作者:zhiqiang21

图片 16

做认为对的事情,如果可能是错的,那就做认为自己承受得起的事情! 个人主页 · 我的文章 · 11 ·      

图片 17

使用方法:

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

2、自定义按钮的 html 样式

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

h5端呼起摄像头扫描二维码并深入分析,扣丁学堂简述HTML5开拓手计算机扫描码功效的利害。为 input 按钮添加自定义的属性, 属性名称为node-type

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

扫描二维码1

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

input[node-type=jsbridge]{

display:none;

}

这里我们只需要按照自己的需要定义的样式即可。

3、在页面上初始化 Qrcode 对象

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

$(function() {

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

});

主要代码解析

(function {

var Qrcode = function {

var _this_ = this;

var isWeiboWebView = /__weibo__/.test(navigator.userAgent);

if (isWeiboWebView) {

if (window.WeiboJSBridge) {

_this_.bridgeReady;

} else {

document.addEventListener('WeiboJSBridgeReady', function() {

_this_.bridgeReady;

});

}

} else {

_this_.nativeReady;

}

};

Qrcode.prototype = {

nativeReady: function {

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

e.stopPropagation();

});

$.bind('click',function{

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

});

$.bind('change', this.getImgFile);

},

bridgeReady: function {

$.bind('click', this.weiBoBridge);

},

weiBoBridge: function() {

window.WeiboJSBridge.invoke('scanQRCode', null, function {

//得到扫码的结果

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

});

},

getImgFile: function() {

var _this_ = this;

var inputDom = $.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 {

qrcode.decode(oFREvent.target.result);

qrcode.callback = function {

//得到扫码的结果

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

};

};

oFReader.readAsDataURL;

},

destory: function() {

$.off;

}

};

Qrcode.init = function {

var _this_ = this;

tempBtn.each(function() {

new _this_;

});

};

window.Qrcode = Qrcode;

})(window.Zepto ? Zepto : jQuery);

以上就是扣丁学堂HTML5在线学习小编给大家分享的HTML5打开手机扫码功能的优缺点,希望对小伙伴们有所帮助,想要了解更多内容的小伙伴可以登录扣丁学堂官网咨询。扣丁学堂是专业HTML5培训机构,不仅有专业的老师和与时俱进的课程体系,还有大量的HTML5视频教程供学员观看学习哦。

本文由澳门新萄京官方网站发布于澳门新萄京赌场网址,转载请注明出处:h5端呼起摄像头扫描二维码并深入分析,扣丁学堂

关键词: