前面的话

  在电脑端发现一篇好的博文,想在手机上访问。这时,就必须打开手机浏览器输入长长的URL地址才行,非常不方便。如果在博客标题的后面跟一张小的图片,点击该图片后,出现一张二维码的大图,然后再通过手机扫一扫,来进行博文的访问,就相对方便很多。

  通过搜索引擎搜索了一些生成二维码的文章,发现其并不是一件容易的事。同时,也发现了qrcode插件,该插件专门用于生成二维码。于是,在qrcode的基础上,实现了一个二维码插件qr

效果演示

  如果细心的话,会发现该博文标题的后面紧跟着一个表示二维码的手机小图标。点击该图标后,出现二维码大图,通过手机扫一扫,即可进行手机端对网页的访问。再点击小图标或二维码图片后,二维码图片消失

  我将该插件命名为qr.js,使用方式很简单,只要进行如下引入既可

<script src="http://files.cnblogs.com/files/xiaohuochai/qr.js"></script>

原理说明

  1、首先分析博客园的HTML结构

  由上图可知,博客园的博文位于类名为'post'的div中,外层是id名为'topics'的div,而博文的标题位于类名为'postTitle'的h1中。所以,当页面结构加载完成后,就可以在该标题的后面添加图片了

var oBox = document.getElementById('topics');
var oTitle = oBox.getElementsByTagName('h1')[0];
console.log(oTitle.innerHTML);

  2、二维码小图生成

  现在,需要准备一个二维码小图,插入博文标题后面

  通过iconfont,找到一个二维码小图,该小图如下所示,因为是为了方便移动端使用,所以使用了一个表示‘小手机’的图标

  然后将对该图片进行base64编码

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAoklEQVQ4T+2T4Q2CMBCFv27CBjgCG+gIjAAbOAIjOIJs4Ai6gRvIBpjXXCOp19T/8pJLoTneXcj3Ah91wAV4bu68xwXoAZ2EzEAmE9AWTB6AelRDyaAx9zgh0wE4ATczcTdIE7wl0oe7wX/8RMHigfQTB3fDdM1IEvYyONdIVEOSqDwCY2Z2NaS/UNbqMSQmvauUPlfbNKpBSdTUVyXSs/XyBlRCNBG20I28AAAAAElFTkSuQmCC

  通过查看样式,使用的皮肤对img标题设置了margin属性,如下所示

  所以,这里需要对margin置0

var oBox = document.getElementById('topics');
var oTitle = oBox.getElementsByTagName('h1')[0];
var oImg = new Image();
oImg.id = 'oImg';
oImg.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAoklEQVQ4T+2T4Q2CMBCFv27CBjgCG+gIjAAbOAIjOIJs4Ai6gRvIBpjXXCOp19T/8pJLoTneXcj3Ah91wAV4bu68xwXoAZ2EzEAmE9AWTB6AelRDyaAx9zgh0wE4ATczcTdIE7wl0oe7wX/8RMHigfQTB3fDdM1IEvYyONdIVEOSqDwCY2Z2NaS/UNbqMSQmvauUPlfbNKpBSdTUVyXSs/XyBlRCNBG20I28AAAAAElFTkSuQmCC";
oImg.style.margin = '0';
oTitle.appendChild(oImg);

  3、将该网页的URL转换为二维码

  获取URL非常简单,只要使用location对象的href属性即可

  接下来,就要使用QRCode插件来实现将URL转换为二维码的功能了,首先先下载qrcodejs插件,然后将博文的URL转换为自定义尺寸的二维码

<div id="qrcode"></div>
<script src="http://files.cnblogs.com/files/xiaohuochai/qrcode.min.js"></script>
<script type="text/javascript">
var qrcode = new QRCode(document.getElementById("qrcode"), {
text: location.href,
width: 80,
height: 80
});
</script>

  生成如下图所示的二维码图片

  4、动态生成及鼠标点击事件

  由于最终是要封装在一个js文件中的,所以第三步涉及到的HTML结构都需要动态生成

  由于生成二维码需要依赖qrcodejs插件,所以只要当该插件加载完毕后,才可以进行后续操作。script标签支持load事件,但不兼容IE8-浏览器。所以,更保险的方法是使用window.onload

  鼠标点击标识图片后,在标识图片的右侧显示生成的二维码图片,由于该二维码图片要相当于图片进行绝对定位,所以需要改变HTML结构,在小标识图片的外层添加一层oImgBox的div,用于定位大的二维码图片

//获取博文标题
var oBox = document.getElementById('topics');
var oTitle = oBox.getElementsByTagName('h1')[0]; //创建标识图片及外层包装div
var oImgBox = document.createElement('div');
oImgBox.style.cssText = 'position:relative;display:inline-block;vertical-align:middle';
var oImg = new Image();
oImg.id = 'oImg';
oImg.style.cursor = 'pointer';
oImg.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAoklEQVQ4T+2T4Q2CMBCFv27CBjgCG+gIjAAbOAIjOIJs4Ai6gRvIBpjXXCOp19T/8pJLoTneXcj3Ah91wAV4bu68xwXoAZ2EzEAmE9AWTB6AelRDyaAx9zgh0wE4ATczcTdIE7wl0oe7wX/8RMHigfQTB3fDdM1IEvYyONdIVEOSqDwCY2Z2NaS/UNbqMSQmvauUPlfbNKpBSdTUVyXSs/XyBlRCNBG20I28AAAAAElFTkSuQmCC";
oImg.style.margin = '0';
oImgBox.appendChild(oImg);
//将标识图片插入标题后面
oTitle.appendChild(oImgBox); //动态生成script标签,引入qrcode插件
var script = document.createElement("script");
script.type = "text/javascript";
script.src = 'http://files.cnblogs.com/files/xiaohuochai/qrcode.min.js';
document.body.appendChild(script); //动态生成div标签,用于放置通过qrcode插件生成的二维码大图,默认隐藏显示
var oDiv = document.createElement('div');
oDiv.id = 'qrcode';
oDiv.mark = false;
oDiv.style.cssText = 'display:none;position:absolute;left:20px;top:-40px';
oImgBox.appendChild(oDiv);
window.onload = function(){
new QRCode(oDiv, {
text: location.href,
width: 80,
height: 80
});
} //鼠标移入标识图片外层oImgBox后,在该标识图片的右侧显示二维码图片
oImgBox.onclick = function(){
//如果mark为真,说明二维码图片正在显示,将其隐藏
if(oDiv.mark){
oDiv.style.display = 'none';
//否则说明二维码图片正在隐藏,将其显示
}else{
oDiv.style.display = 'block';
}
//将mark标识置反
oDiv.mark = !oDiv.mark;
}

  5、移动端优化

  由于该功能只适用于电脑端,在移动端并无实际的用处。所以,可以通过用户代理检测,如果是非移动端,才执行上述操作

  由于其他的插件也可能会用到window.onload,所以为了避免冲突,使用兼容性的事件处理程序函数

  优化后的最终代码如下

(function(){
//事件处理程序兼容写法
function addEvent(target,type,handler){
if(target.addEventListener){
target.addEventListener(type,handler,false);
}else{
target.attachEvent('on'+type,function(event){
return handler.call(target,event);
});
}
}
function whichMobile(){
var ua = navigator.userAgent;
if(/iPhone OS (\d+_\d+)/.test(ua)){
return 'iPhone' + RegExp.$1.replace("_",".");
}
if(/iPad.+OS (\d+_\d+)/.test(ua)){
return 'iPad' + RegExp.$1.replace("_",".")
}
if(/Android (\d+\.\d+)/.test(ua)){
return 'Android' + RegExp["$1"];
}
}
//如果是非移动端,则执行如下代码
if(!whichMobile()){
//获取博文标题
var oBox = document.getElementById('topics');
var oTitle = oBox.getElementsByTagName('h1')[0]; //创建标识图片及外层包装div
var oImgBox = document.createElement('div');
oImgBox.style.cssText = 'position:relative;display:inline-block;vertical-align:middle';
var oImg = new Image();
oImg.id = 'oImg';
oImg.style.cursor = 'pointer';
oImg.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAoklEQVQ4T+2T4Q2CMBCFv27CBjgCG+gIjAAbOAIjOIJs4Ai6gRvIBpjXXCOp19T/8pJLoTneXcj3Ah91wAV4bu68xwXoAZ2EzEAmE9AWTB6AelRDyaAx9zgh0wE4ATczcTdIE7wl0oe7wX/8RMHigfQTB3fDdM1IEvYyONdIVEOSqDwCY2Z2NaS/UNbqMSQmvauUPlfbNKpBSdTUVyXSs/XyBlRCNBG20I28AAAAAElFTkSuQmCC";
oImg.style.margin = '0';
oImgBox.appendChild(oImg);
//将标识图片插入标题后面
oTitle.appendChild(oImgBox); //动态生成script标签,引入qrcode插件
var script = document.createElement("script");
script.type = "text/javascript";
script.src = 'http://files.cnblogs.com/files/xiaohuochai/qrcode.min.js';
document.body.appendChild(script); //动态生成div标签,用于放置通过qrcode插件生成的二维码大图,默认隐藏显示
var oDiv = document.createElement('div');
oDiv.id = 'qrcode';
oDiv.mark = false;
oDiv.style.cssText = 'display:none;position:absolute;left:20px;top:-40px';
oImgBox.appendChild(oDiv); addEvent(window,'load',function(){
new QRCode(oDiv, {
text: location.href,
width: 80,
height: 80
});
}) //鼠标移入标识图片外层oImgBox后,在该标识图片的右侧显示二维码图片
addEvent(oImgBox,'click',function(){
//如果mark为真,说明二维码图片正在显示,将其隐藏
if(oDiv.mark){
oDiv.style.display = 'none';
//否则说明二维码图片正在隐藏,将其显示
}else{
oDiv.style.display = 'block';
}
//将mark标识置反
oDiv.mark = !oDiv.mark;
})
}
})();

出处:http://www.cnblogs.com/xiaohuochai/p/6876551.html

图片的base64编码通过javascript生成图片--当前URL地址的二维码应用的更多相关文章

  1. 使用javascript生成当前博文地址的二维码图片

    前面的话 在电脑端发现一篇好的博文,想在手机上访问.这时,就必须打开手机浏览器输入长长的URL地址才行,非常不方便.如果在博客标题的后面跟一张小的图片,点击该图片后,出现一张二维码的大图,然后再通过手 ...

  2. javascript利用canvas解析图片中的二维码

    本方法两种应用方式:一种使用canvas解析本站图片中的二维码,canvas有同源策略限制,只能处理本站图片.另一种处理文件选择中的图片二维码. 第一种使用场景可以换成像微信中一样,长按图片识别二维码 ...

  3. python将url转变成二维码图片

    将url数据转变成二维码数据,再将二维码图片转成base64格式返回 import qrcode import io def url_image(self,url): img = qrcode.mak ...

  4. 给二维码(图片)添加文字(水印),让生成的二维码中间带logo

    <?php //生成二维码 require_once IA_ROOT . '/framework/library/qrcode/phpqrcode.php'; QRcode::png($url, ...

  5. ZXing 生成、解析二维码图片的小示例

    概述 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME ...

  6. js生成带有logo的二维码并保存成图片下载

    生成二维码,需要依赖jquery,先引入一个jquery,然后需要一个插件改变过了jquery-qrcode.js 插件代码(需要的自己打开看): /*! jquery-qrcode v0.14.0 ...

  7. asp.net.web如何简单生成和保存二维码图片的例子

    首先,要有生成二维码图片,需要二维码生成的类库,到官网下载thoughtWorks.QRCode.dll 例子的步骤: 1.创建项目QRCodeTest1,选择asp.net.web窗体应用程序

  8. php背景图片上生成二维码,二维码上带logo 代码示例 (原)

    依赖库文件 phpqrcode.php (下载地址://www.jb51.net/codes/189897.html :或者在官网下载:http://phpqrcode.sourceforge.net ...

  9. 利用phpqrcode二维码生成类库和imagecopymerge函数制拼接图片的经验

    前期准备 引入phpqrcode类库(下载地址:https://sourceforge.net/projects/phpqrcode/) PHP开启GD扩展库支持 1.利用phpqrcode生成二维码 ...

随机推荐

  1. INSPIRED启示录 读书笔记 - 第12章 产品探索

    软件项目可以划分为两个阶段 探索产品阶段:弄清楚要开发什么产品(定义正确的产品) 在探索产品的阶段,产品经理负责分析各种创意,广泛收集用户需求,了解如何运用新技术,拿出产品原型并加以测试 从全局视角思 ...

  2. python 中文字符的处理

    刚开始学习python的时候,都是对这英文的翻译书学习的.没有解除到中文编码的相关问题,直到自己用python去做相关的项目的时候才发先中文编码问题真的非常头疼啊.这里分享一下本人所了解的一些经验. ...

  3. Cisco学习笔记

    目录 1. 路由 1.1 静态路由 1.2 动态路由 2. 访问控制列表 2.1 标准访问控制列表 2.2 扩展访问控制列表 2.3 命名访问控制列表 3. VLAN 3.1 基础知识 3.2 配置实 ...

  4. Shell脚本实现SSH免密登录及批量配置管理

    本节索引 场景分析 ssh免密登录 pssh工具批量管理 SHELL自动化脚本 本篇总结 场景分析 作为一个运维工程师,不是每个人工作的环境都想阿里.腾讯那样,动不动就上亿的PV量,上万台服务器.我们 ...

  5. LeetCode——max-points-on-a-line

    Question Given n points on a 2D plane, find the maximum number of points that lie on the same straig ...

  6. [转载]ORA-00313:无法打开日志组1(线程 1)的成员_ORA-00312:

    原文地址:1)的成员_ORA-00312:">ORA-00313:无法打开日志组1(线程 1)的成员_ORA-00312:作者:Sweet_薇薇毅 今天用系统清理工具把系统垃圾清理了一 ...

  7. Solr新建collection时报错 Caused by: Direct buffer memory

    错误如下 [root@192.168.1.235 conf]# curl "http://192.168.1.235:8983/solr/admin/collections ?action= ...

  8. QT 学习记录:渐变-QLinearGradient,QRadialGradient,QConicalGradient)

    http://blog.csdn.net/wangwei890702/article/details/8552482 QT:渐变 渐变,是指逐渐的,有规律性的变化,是一种规律性很强的现象.Qt提供了一 ...

  9. Linux ls命令参数详解

    -a -- 全部(all).列举目录中的全部文件,包括隐藏文件(.filename).位于这个列表的起首处的 .. 和 . 依次是指父目录和你的当前目录.      -l -- 长(long).列举目 ...

  10. 使用BeanUtils方法拷贝不上问题

    最近在项目中,发现BeanUtils.copyProperties方法拷贝bean属性时候,有的时候会失效.最后发现是由于项目中引用了spring和common两个包,都有BeanUtils方法,错误 ...