首页

JavaScript自己整理的基础-01

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

1.JavaScript 简介:

JavaScript是互联网上最流行的脚本语言,所有现代的HTML都使用JavaScript。既然是脚本语言,那么它的特点就有一下三种:

    (1)弱类型;

    (2)解释型语言(不需要编译);

    (3)逐行执行,一行代码错误,其后的代码块都不会继续执行;

    (4)<script>标签可直接嵌入到HTML文件中,位置是任意的,通常放在被修饰内容下面或者head标签中,但写成单独的js文件有利于结构和行为的分离

2.JavaScript 内容(附图):

    

       其中ECMAScript是JavaScript的核心;

       DOM是文档对象模型(使用js操作网页);

       BOM是浏览器对象模型(使用js操作浏览器)

3.JavaScript 信息的输出:

    (1)alert( )方法:以提示框的形式在页面输出 ,例;

[javascript] view plain copy
  1. <script>  
  2.     alert("hello,javascript")  
  3. </script>  

    (2)console.log( )方法:在控制台输出信息,例:

[javascript] view plain copy
  1. console.log("hello,javascript")  

    (3)document.write( ):将内容直接写在HTML页面中,例:

[javascript] view plain copy
  1. document.write("hello,javascript")  

4.JavaScript 变量:

    与 Java不同,ECMAScript 中的变量无特定的类型,定义变量时只用 var 运算符,可以将它初始化为任意值,变量的初始化格式:var 变量名 = 变量值;例:

[javascript] view plain copy
  1. var a = "hello";  
  2. var b = 123;  

    如果要定义多个变量,那么可以用将多个变量写在一行,用逗号进行分隔;例:

[javascript] view plain copy
  1. var a = "你好",  
  2.     b = 123,  
  3.     c = "hello";  

    变量名字的变量规则:    

    (1)由字母、数字、下划线、$符号构成

    (2)不可以以数字开头,不建议以下划线开头;

    (3) 严格区分大小写;

    (4)不可以是关键字和保留字

5.JavaScript 数据类型:

    JavaScript可以分为原始数据类型,引用数据类型两种:

    (1)原始数据类型:Number,String,Boolean,undefined,null

    Number:数值型,就是数字,包含正数、负数、整数、小数、0、NaN、Infinity(正无穷)、-Infinity(负无穷);

    注意:NaN:not  a  number的缩写,表示该值不是一个数值(也属于Number)

    String字符串:用双引号""或单引号''包起来的0个或多个字符,如果引号中什么也没有,那么这个字符串被称为空字符串

    Boolean布尔型:包含true:表示真(成立)和false:表示假(不成立)两个值

    undefined表示变量未定义,或变量被定义出来,但是没有被赋值

    null表示一个变量没有指向任何一片存储空间,即变量存在,但是里面是空的,类似于Undefined

    (小提示:在Chrome浏览器控制台输出时,会发现Number类型为深蓝色,String为黑色,Boolean为浅蓝色,undefined和null都为浅灰色)

    (2)引用数据类型:

    Object(对象),Array(数组),Date(日期),RegExp(正则)。。等等

    (3)如何查看一个变量的数据类型(typeof 运算符):        

             数值型数据:返回值为number   

[javascript] view plain copy
  1. console.log(typeof 123)   //输出number  

             字符串型数据:返回值为string

[javascript] view plain copy
  1. console.log(typeof "你好")  //输出string  

             布尔型数据:返回值为boolean

[javascript] view plain copy
  1. console.log(typeof true/false)    //输出boolean  

             Undefined:返回值为undefined

[javascript] view plain copy
  1. console.log(typeof undefined)   //输出undefined  

             Null:返回值为Object(历史遗留问题,说明null也是一个对象)

[javascript] view plain copy
  1. console.log(typeof null)     //输出object  

             NaN:返回值为number

[javascript] view plain copy
  1. console.log(typeof NaN)    //输出number  

6.JavaScript 数据类型的转换:

    (1)在使用加法(+)运算符时,任何数据与字符串类型数据相加都为字符串类型数据;

[javascript] view plain copy
  1. console.log("你好" + 123)    //输出"你好123"  

        注(简单理解): 在JavaScript 中空字符串""转换为false,非空字符串转换为true(除“0”,“1”外);

                false转换为 0 或“0”,true转换为 1 或“1”;

                做逻辑判断的时候,null,undefined,""(空字符串),0,NaN都默认为false;

                ==在比较的时候可以转换数据类型,===是严格比较,只要类型不匹配就返回false;

                    其实 == 的比较确实是转换成字符串来比较但,但是在布尔型转换为字符串之前,要先转换成 Number

[javascript] view plain copy
  1. console.log("123" == true)    //输出false  
  2. console.log("1" == true)     //输出true  
  3. console.log("" == true)     //输出false  
  4. console.log(1 == true)     //输出true  
  5.   
  6. console.log("" == false)    //输出true  
  7. console.log('123' == false)   //输出fasle  
  8. console.log('0' == false)    //输出true  
  9. console.log(0 == false)    //输出true  
  10.   
  11. console.log('1' == 1)     //输出true  
  12. console.log('0' == 0)     //输出true  
  13. console.log(-true)     //输出-1  

(2)parseInt:将字符串转换成整数(只识别字符串中的数值):

        注:会忽略字符串中的前后空格(当数值后的空格后面还有数值时,将不会再识别);

               能够正确识别正负号,即保留正负号;

               在转换时,遇到非数值型的字符就会停止转换;

               如果字符串的第一个字符是非数值型的,那么转换的结果为NaN;

[javascript] view plain copy
  1. console.log(parseInt("123"))    //输出123  
  2. console.log(parseInt(" 1 2"))    //只会输出1  
  3. console.log(parseInt(-123))     //输出-123  
  4. console.log(parseInt("hello"))    //输出NaN  
  5. console.log(parseInt(true))       //输出NaN  
  6. console.log(parseInt("123hello"))    //输出123,后面非数值型不会识别  
  7. console.log(parseInt(" 1 "))     //输出1,忽略空格  

(3)parseFloat:将字符串转换成小数(识别小数点,注意事项同上)

[javascript] view plain copy
  1. console.log(parseFloat("123.55"))    //输出123.55  
  2. console.log(parseFloat(".1hello"))    //输出0.1  

(4)Number:将其它类型的数据转换成数值型,注意被转换的数据必须是纯数值构成,否则无法转换,其它注意事项同上

[javascript] view plain copy
  1. console.log(Number(true))   //1  
  2. console.log(Number(false))    //0  
  3. console.log(Number(null))    //0  
  4. console.log(Number("123hello"))    //NaN  
  5. console.log(Number("12.22"))    //12.22  
  6. console.log(Number(undefined))    //NaN  

(5)页面中的信息框:

        alert(),弹出个提示框,只有确定;

[javascript] view plain copy
  1. window.alert("今天天气很好")  

        confirm(),弹出个确认框,有确定和取消;

[javascript] view plain copy
  1. window.confirm("今天心情也很好")  

        prompt(),弹出个输入框,可以输入内容;

[javascript] view plain copy
  1. window.prompt("password","请输入密码")  

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

request中跟路径有关的api的分析

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

           最近重在研究struts的源码,其中涉及到了request中的几个api,看了文档后还是觉得不清楚,所以在自己原来的工程中

测试了一下各个api的具体效果。在这里跟大家分享一下。

            这是我具体测试的代码:

           这是我servlet配置的路径:

            以下是访问这个ProductServlet后控制台打印的结果:

            从以上我们可以发现:

    1.getRealPath(....),这个方法是返回给定资源的磁盘绝对路径,简单来说,就是以盘符开头的路径

    2.getRequestURI(....)与getRequestURL(....)这个两个方法,从名字上来说,一个是返回url(统一资源定位器)一个是返回

uri(统一资源标识符,用来唯一的标识一个资源),那么url跟uri有什么区别呢?比较结果后我们就知道,URL中包含URI,URL是

带协议,带端口号的。

    3.getContextPath(....)这个方法,其实就是用来返回工程名,或者说工程路径,看结果我们一目了然

    4.getServletPath(.....)这个方法,从结果中,我们可以分析得出,它其实就是在工程目录下,访问我们servlet的路径,或者说

servlet相对于我们工程的路径,在或者说,它就是我们在配置文件中配置的路径,但是不包括后面具体的请求资源名

    5.getPathInfo(.....),这个方法其实就是返回我们具体请求资源的名称,或者说,相对于我们的servlet而言的请求路径

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

根据json文件生成动态菜单

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

[plain] view plain copy
  1. <span style="font-family:SimSun;font-size:16px;">admin.json</span>  
[plain] view plain copy
  1. <span style="font-family:SimSun;font-size:16px;">[  
  2.     {  
  3.         "image": "glyphicon glyphicon-home",//菜单前的图标  
  4.         "name": "设备管理",  
  5.         "submenu": [  
  6.             {  
  7.                 "image": "glyphicon glyphicon-cloud",  
  8.                 "name": "设备分类",  
  9.                 "submenu": [  
  10.                     {  
  11.                         "image": "glyphicon glyphicon-off",  
  12.                         "name": "电源管理",  
  13.                         "url": "html/Node/creditCardPower.html"  
  14.                     },  
  15.                     {  
  16.                             "image": "glyphicon glyphicon-lock",  
  17.                         "name": "门禁管理",  
  18.                         "url": "html/Guard/guardList.html"  
  19.                     },  
  20.                     {  
  21.                         "image": "glyphicon glyphicon-folder-open",  
  22.                         "name": "物品管理",  
  23.                         "url": "html/goods/goodsList.html"  
  24.                     },  
  25.                     {  
  26.                         "image": "glyphicon glyphicon-facetime-video",  
  27.                         "name": "视频管理",  
  28.                         "url": "html/monitor/monitorList.html"  
  29.                     }  
  30.                 ]  
  31.             }  
  32.         ]  
  33.     },  
  34.     {  
  35.         "image": "glyphicon glyphicon-cog",  
  36.         "name": "系统设置",  
  37.         "submenu": [  
  38.             {  
  39.                 "image": "glyphicon glyphicon-heart",  
  40.                 "name": "用户管理",  
  41.                 "submenu": [  
  42.                     {  
  43.                         "image": "glyphicon glyphicon-align-justify",  
  44.                         "name": "用户列表",  
  45.                         "url": "html/User/userList.html"  
  46.                     },  
  47.                     {  
  48.                         "image": "glyphicon glyphicon-random",  
  49.                         "name": "组织机构",  
  50.                         "url": "html/dept/framework.html"  
  51.                     }  
  52.                 ]  
  53.             },  
  54.             {  
  55.                 "image": "glyphicon glyphicon-wrench",  
  56.                 "name": "设备管理",  
  57.                 "submenu": [  
  58.                     {  
  59.                         "image": "glyphicon glyphicon-edit",  
  60.                         "name": "设备参数",  
  61.                         "url": "html/Device/DeviceList.html"  
  62.                     },  
  63.                     {  
  64.                         "image": "glyphicon glyphicon-edit",  
  65.                         "name": "物品库",  
  66.                         "url": "html/equgoods/equGoodsList.html"  
  67.                     }  
  68.                 ]  
  69.             }  
  70.         ]  
  71.     },  
  72.     {  
  73.         "image": "glyphicon glyphicon-list",  
  74.         "name": "日志管理",  
  75.         "submenu": [  
  76.             {  
  77.                 "image": "glyphicon glyphicon-list-alt",  
  78.                 "name": "登入日志",  
  79.                 "url": "html/Log/loginlog.html"  
  80.             },  
  81.             {  
  82.                 "image": "glyphicon glyphicon-tag",  
  83.                 "name": "设备日志",  
  84.                 "url": "html/Log/hardwarelog.html"  
  85.             }  
  86.         ]  
  87.     },  
  88.     {  
  89.         "image":"glyphicon glyphicon-list",  
  90.         "name":"设备管理",  
  91.         "submenu":[  
  92.             {  
  93.             "image":"glyphicon glyphicon-list-alt",  
  94.             "name":"设备管理",  
  95.             "url":"html/mechanism/mechanism.html"  
  96.             }  
  97.         ]  
  98.     }  
  99. ]</span>  

2、读取json文件的service层实现

[java] view plain copy
  1. <span style="font-size:16px;">package com.dskj.service.impl;  
  2.   
  3. import java.io.File;  
  4. import java.util.Scanner;  
  5. import org.springframework.beans.factory.annotation.Value;  
  6. import org.springframework.core.io.Resource;  
  7. import org.springframework.stereotype.Service;  
  8.   
  9. import com.dskj.common.util.StringUtil;  
  10. import com.dskj.service.ReadJsonService;  
  11.   
  12. @Service  
  13. public class ReadJsonServiceImpl implements ReadJsonService{  
  14.     <span style="color:#ff0000;">@Value(value="classpath:json/admin.json")</span>  
  15.     private Resource dataAdmin;      
  16.     <span style="color:#ff0000;">@Value(value="classpath:json/user.json")</span>  
  17.     private Resource dataUser;    
  18.       
  19.     public String getData(String fileName){       
  20.         if(StringUtil.isEmpty(fileName)){  
  21.             throw new NullPointerException();  
  22.         }  
  23.           
  24.         String jsonData = null;  
  25.           
  26.         try {  
  27.             File file = null;     if(fileName.equals("admin.json")){  
  28.                 file = dataAdmin.getFile();  
  29.             }else{  
  30.                 file = dataUser.getFile();  
  31.             }  
  32.               
  33.             jsonData = this.jsonRead(file);  
  34.               
  35.         } catch (Exception e) {  
  36.            e.printStackTrace();  
  37.         }    
  38.         return jsonData;         
  39.     }  
  40.     /** 
  41.      * 读取文件类容为字符串 
  42.      * @param file 
  43.      * @return 
  44.      */  
  45.       private String jsonRead(File file){  
  46.             Scanner scanner = null;  
  47.             StringBuilder buffer = new StringBuilder();  
  48.             try {  
  49.                 scanner = new Scanner(file, "utf-8");  
  50.                 while (scanner.hasNextLine()) {  
  51.                     buffer.append(scanner.nextLine());  
  52.                 }  
  53.             } catch (Exception e) {  
  54.                   
  55.             } finally {  
  56.                 if (scanner != null) {  
  57.                     scanner.close();  
  58.                 }  
  59.             }  
  60.             return buffer.toString();  
  61.         }  
  62. }</span>  

3、controller对应的代码片段

[java] view plain copy
  1. <span style="font-size:16px;">@RequestMapping("")  
  2.     public ModelAndView main() {  
  3.         ModelAndView model = null;  
  4.         String jsonFileName = null;  
  5.           
  6.         SysUser currentUser = (SysUser) ContextUtil.getSession().getAttribute("currentUser");  
  7.         if ("admin".equals(currentUser.getUsername())) {  
  8.             model = new ModelAndView("header1");  
  9.             jsonFileName = "<span style="color:#ff0000;">admin.json</span>";//根据文件名判断读取具体json文件  
  10.         } else {  
  11.             model = new ModelAndView("headerUser");  
  12.             jsonFileName = "<span style="color:#ff0000;">user.json</span>";</span>/<span style="font-size:16px;">/根据文件名判断读取具体json文件  
  13.   
  14.         }  
  15.           
  16.         String menue = <span style="color:#3333ff;">readJsonServiceImpl.getData</span>(jsonFileName);  
  17.           
  18.         model.addObject("menue", menue);  
  19.         return model;  
  20.   
  21.     }</span>  

4、html页面 将jsonarray转换成js对象

[javascript] view plain copy
  1. <span style="font-size:16px;">$(function() {  
  2.     var menue = JSON.parse('<span style="color:#ff0000;"><%=request.getAttribute("menue")%></span>');  
  3.     console.info(menue);  
  4.     createMenu(menue);//调用下边的方法生成动态菜单</span>  

5、对js对象遍历 $.append动态添加到对应页面

[javascript] view plain copy
  1. <span style="font-size:16px;">function createMenu(menue){  
  2.             /* 一级菜单 */  
  3.             $.each(menue,function(i,v){  
  4.                 var menu1 = '<li class="active"><a href="javaScript:;">';  
  5.                 /* menu1 += '<span class="glyphicon glyphicon-home"></span>'; */  
  6.                 menu1 += '<span class=' + '\'' + v.image + '\'' + '>' + '</span>';  
  7.                 menu1 += '<span style="margin-left: 10px;">' + v.name + '</span><span class="fa arrow"></span>';  
  8.                 menu1 += '</a>';  
  9.                 menu1 += '<ul class="nav nav-second-level nps collapse in">';  
  10.                   
  11.                  /* 二级菜单  */  
  12.                     $.each(v.submenu,function(j,vJ){                      
  13.                         var menu2 = '<li class="active">';  
  14.                         menu2 +=        '<a href="javaScript:;" class="">';  
  15.                         /* menu2 +=         '<span class="glyphicon glyphicon-cloud" style="margin-right: 10px;"></span>'; */  
  16.                         menu2 +=            '<span class=' + '\'' + vJ.image + '\'' + 'style=' + '\'' + 'margin-right: 10px;' + '\'' + '>' + '</span>';  
  17.                         menu2 +=             vJ.name + '<span class="fa arrow "></span>';  
  18.                         menu2 +=        '</a>';  
  19.                         menu2 +=                '<ul class="nav nav-third-level nps collapse in">';                             
  20.                               
  21.                         /* 三级菜单 */  
  22.                         if(vJ.submenu){  
  23.                             $.each(vJ.submenu,function(k,vk){  
  24.                                 var menu3 = '<li>';  
  25.                                 menu3 +=        '<a href="javascript:openUrl(\'' + vk.url + '\')">';  
  26.                                 /* menu3 +=             '<span style="margin-right: 10px;" class="glyphicon glyphicon-off">'; */  
  27.                                 menu3 +=            '<span stype=' + '\'' + 'margin-right: 10px;' + '\'' + 'class=' + '\'' + vk.image + '\'' + '';  
  28.                                 menu3 +=            '</span>'+vk.name;  
  29.                                 menu3 +=        '</a>';  
  30.                                 menu3 +=    '</li>';  
  31.                                   
  32.                                 menu2 += menu3;  
  33.                                       
  34.                             });  
  35.                         }else{  
  36.                             $.each(v.submenu,function(j,vJ){  
  37.                                 var menu4 = '<li>';  
  38.                                 menu4 +=        '<a href="javascript:openUrl(\'' + vJ.url + '\')">';  
  39.                                 /* menu3 +=             '<span style="margin-right: 10px;" class="glyphicon glyphicon-off">'; */  
  40.                                 menu4 +=            '<span stype=' + '\'' + 'margin-right: 10px;' + '\'' + 'class=' + '\'' + vJ.image + '\'' + '';  
  41.                                 menu4 +=            '</span>'+vJ.name;  
  42.                                 menu4 +=        '</a>';  
  43.                                 menu4 +=    '</li>';  
  44.                                       
  45.                                  menu2 = menu4;   
  46.                             });  
  47.                         }  
  48.                             menu1 += menu2;  
  49.                     });  
  50.                       
  51.                     $("#side-menu").append(menu1);  
  52.                 });  
  53.                   
  54.             }</span>  

6、效果如下图

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

项目总结关于ionic3中的ion-segment的总结

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里


目前做的项目是ionic3和angular4.0的结合,所以用到了很多关于ionic3中封装好的标签,例如具有轮播效果的ion-slides和ion-slide等。那么这次就要总结一下另外一个标签ion-segment的用法了。 
ion-segment这个标签以前用的很少,几乎没有用过。它主要是一组按钮,有时称为分段控件,之前都是用button按钮,现在知道了,开始用ion-segment,因为它有自带的样式,这样就可节省很多时间,同时呢允许用户与许多控件的紧凑组进行交互。 分段提供与标签相似的功能,选择一个将取消选择所有其他选项。 当您希望让用户在应用程序的不同页面之间来回移动时,应使用选项卡栏而不是分段控件。 您可以使用Angular的ngModel或FormBuilder API。 
下面来看一段代码:

Segment 在头部使用

<ion-header> <ion-toolbar> <ion-segment [(ngModel)]="icons" color="secondary"> <ion-segment-button value="camera"> <ion-icon name="camera">带iocn</ion-icon> </ion-segment-button> <ion-segment-button value="bookmark"> 头部使用Segment <ion-icon name="bookmark"></ion-icon> </ion-segment-button> </ion-segment> </ion-toolbar> </ion-header>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Segment 在内容里面使用

<ion-segment [(ngModel)]="relationship" color="primary" (ionChange)="segmentChanged($event)"> <ion-segment-button value="friends"> Segment 在内容里面使用 </ion-segment-button> <ion-segment-button value="enemies"> 可以绑定一个事件(ionChange) </ion-segment-button> </ion-segment>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Segment 在表单里面使用

<form [formGroup]="myForm"> <ion-segment formControlName="mapStyle" color="danger"> <ion-segment-button value="standard"> Standard </ion-segment-button> <ion-segment-button value="hybrid"> 表单内使用 </ion-segment-button> <ion-segment-button value="sat"> Satellite </ion-segment-button> </ion-segment> </form>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
Segment 配合ngSwitch使用
<ion-segment [(ngModel)]="change"> <ion-segment-button value="apple"> 苹果 </ion-segment-button> <ion-segment-button value="pie"></ion-segment-button> </ion-segment> <div [ngSwitch]="change"> <div *ngSwitchCase="'apple'">
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
苹果显示,如果要默认显示一个就把默认的那个设置一个初始值比如要默认显示苹果就把苹果的value值设置成change也就是说,在定义change变量的时候,需要把哪个设置为默认显示就把哪个的value值赋值给change作为初始值 public change=”pie”;


蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

关于Vuex的全家桶状态管理(一)

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

1:安装

 npm install vuex --save
    
  • 1

2: 在main.js 主入口js里面引用store.js

import Vue from 'vue' import App from './App' import router from './router' import store from './vuex/store' //引用store.js Vue.config.productionTip = false //阻止在启动时生成生产提示 //vue实例 new Vue({
 el: '#app',
 router,
 store, //把store挂在到vue的实例下面 template: '<App/>',
 components: { App }
})
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

3:在store.js里引用Vuex

import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) //注册Vuex // 定义常量  如果访问他的话,就叫访问状态对象 const state = {
  count: 1 } // mutations用来改变store状态, 如果访问他的话,就叫访问触发状态 const mutations = { //这里面的方法是用 this.$store.commit('jia') 来触发 jia(state){
    state.count ++
  },
  jian(state){
    state.count --
  },
} //暴露到外面,让其他地方的引用 export default new Vuex.Store({
  state,
  mutations
})
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

4:在vue组件中使用

使用$store.commit(‘jia’)区触发mutations下面的加减方法

<template> <p class="hello"> <h1>Hello Vuex</h1> <h5>{{$store.state.count}}</h5> <p> <button @click="$store.commit('jia')">+</button> <button @click="$store.commit('jian')">-</button> </p> </p> </template> <!-- 加上scoped是css只在这个组件里面生效,为了不影响全局样式 --> <style scoped> h5{ font-size: 20px; color: red; } </style>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

这里写图片描述

5:state访问状态对象

使用computed计算

<template> <p class="hello"> <h1>Hello Vuex</h1> <h5>{{count}}</h5> <p> <button @click="$store.commit('jia')">+</button> <button @click="$store.commit('jian')">-</button> </p> </p> </template> <script> import {mapState} from 'vuex' export default{
  name:'hello', //写上name的作用是,如果你页面报错了,他会提示你是那个页面报的错,很实用 // 方法一 // computed: { //  count(){ //   return this.$store.state.count + 6 //  } // } // 方法二 需要引入外部 mapState computed:mapState({
   count:state => state.count + 10 }) // ECMA5用法 // computed:mapState({ //  count:function(state){ //   return state.count //  } // }) //方法三 // computed: mapState([ //  'count' // ]) } </script>
蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

关于Vuex的全家桶状态管理(二)

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

1:mutations触发状态 (同步状态)

<template> <p class="hello"> <h1>Hello Vuex</h1> <h5>{{count}}</h5> <p> <button @click="jia">+</button> <button @click="jian">-</button> </p> </p> </template> <script> import {mapState,mapMutations} from 'vuex' export default{
  name:'hello', //写上name的作用是,如果你页面报错了,他会提示你是那个页面报的错,很实用 //方法三 computed: mapState([ 'count' ]),
  methods:{
   ...mapMutations([ 'jia', 'jian' ])
  }
 } </script>
    
  • 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

2:getters计算属性

getter不能使用箭头函数,会改变this的指向

在store.js添加getters

 // 计算 const getters = {
  count(state){ return state.count + 66 }
} export default new Vuex.Store({
  state,
  mutations,
  getters
})
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

//count的参数就是上面定义的state对象 
//getters中定义的方法名称和组件中使用的时候一定是一致的,定义的是count方法,使用的时候也用count,保持一致。 
组件中使用

<script> import {mapState,mapMutations,mapGetters} from 'vuex' export default{
  name:'hello',
  computed: {
   ...mapState([ 'count' ]),
   ...mapGetters([ 'count' ])
  },
  methods:{
   ...mapMutations([ 'jia', 'jian' ])
  }
 } </script>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

3:actions (异步状态)

在store.js添加actions

import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) // 定义常量 const state = { count: 1 } // mutations用来改变store状态 同步状态 const mutations = {
  jia(state){
    state.count ++
  },
  jian(state){
    state.count --
  },
} // 计算属性 const getters = {
  count(state){ return state.count + 66 }
} // 异步状态 const actions = {
  jiaplus(context){
    context.commit('jia') //调用mutations下面的方法
    setTimeout(()=>{
      context.commit('jian')
    },2000) alert('我先被执行了,然后两秒后调用jian的方法') }, jianplus(context){ context.commit('jian') }
} export default new Vuex.Store({
  state,
  mutations,
  getters,
  actions
})
    
  • 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

在组件中使用

<template> <p class="hello"> <h1>Hello Vuex</h1> <h5>{{count}}</h5> <p> <button @click="jia">+</button> <button @click="jian">-</button> </p> <p> <button @click="jiaplus">+plus</button> <button @click="jianplus">-plus</button> </p> </p> </template> <script> import {mapState,mapMutations,mapGetters,mapActions} from 'vuex' export default{
  name:'hello',
  computed: {
   ...mapState([ 'count' ]),
   ...mapGetters([ 'count' ])
  },
  methods:{ // 这里是数组的方式触发方法 ...mapMutations([ 'jia', 'jian' ]), // 换一中方式触发方法 用对象的方式 ...mapActions({
    jiaplus: 'jiaplus',
    jianplus: 'jianplus' })
  }
 } </script> <style scoped> h5{ font-size: 20px; color: red; } </style>
    
  • 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

4:modules 模块

适用于非常大的项目,且状态很多的情况下使用,便于管理

修改store.js

import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const state = { count: 1 } const mutations = {
  jia(state){
    state.count ++
  },
  jian(state){
    state.count --
  },
} const getters = {
  count(state){ return state.count + 66 }
} const actions = {
  jiaplus(context){
    context.commit('jia') //调用mutations下面的方法
    setTimeout(()=>{
      context.commit('jian')
    },2000) alert('我先被执行了,然后两秒后调用jian的方法') }, jianplus(context){ context.commit('jian') }
}

//module使用模块组的方式 moduleA const moduleA = { state, mutations, getters, actions }

// 模块B moduleB const moduleB = { state: { count:108
  }
} export default new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB,
  }
})
蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

JS中作用域的销毁和不销毁的情况总结

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

window全局作用域->页面关掉才销毁
函数执行会形成私有的作用域

1)作用域的销毁
一般情况下,函数执行形成一个私有的作用域,当执行完成后就销毁了->节省内存空间

2)作用域的不立即销毁
function fn(){
var i=10;
return function(n){
console.log(n+i++);
}
}
fn()(15);//->先执行fn,有一个私有的变量i=10,返回一个堆内存地址 xxxfff111,我们发现这个地址还用到了一次,那么当前的这个fn形成私有作用域(A)就不能立即销毁了,xxxfff111(15)->输出25,A中的i变为11;当xxxfff111执行完了,发现这个地址没用了,浏览器就把A、xxxfff111都释放了

fn()(20);//->在执行fn的时候一切都从新开始了,和上面的步骤是一样的->输出30

3)作用域的不销毁:形成一个私有作用域,里面的内容被外面占用了
function fn(){
var i=10;
return function(n){
console.log(n+i++);
}
}
var f=fn();//->fn执行形成一个私有的作用域A,A中有一个私有的变量i=10,A中返回一个地址xxxfff11,被外面的f占用了,那么当前的A就不能销毁了
f(15);//->输出25,让A中的i=11
f(20);//->输出31,让A中的i=12

当我们知道f用完的时候,为了优化性能,我们让f=null,这样的话A中的xxxfff111没人占用了,浏览器会把A和xxxfff111都释放了


几种不销毁常用到的形式:
1)函数执行,返回一个引用数据类型的值,并且在函数的外面被别人接收了,那么当前函数形成的私有作用域就不在销毁了–>例如上面的案例

2)在函数执行的时候,里面的一个小函数的地址赋值给了我们的外面元素的点击事件,那么当前小函数也相当于被外面占用了,大函数执行形成的私有的作用域也不销毁了
//每一次循环都执行自执行函数形成一个私有的作用域(循环三次就有三个作用域,每一个作用域中都有一个i,第一个存储的是0,第二个存数的是1..),在每一个私有的作用域中都把里面的函数绑定给了外面元素的点击事件,这样的话每一次形成的作用域都不销毁了(三个不销毁的作用域)
var oLis=document.getElementsByTagName(“li”);
for(var i=0;i<oLis.length;i++){
~function(i){
oLis[i].onclick=function(){
tabChange(i);
}
}(i);
}

3)在使用setTimeout实现轮询动画的时候,我们如果move需要传递参数值,那么像下面这样的写法会行成很多的不销毁的作用域,非常的耗性能
function move(tar){
<js code>

//window.setTimeout(move,10); ->第二次执行move的时候我们没有给它传值(这样写不行)
window.setTimeout(function(){
move(tar);
},10);//->这样写实现了,但是每一次执行定时器都会形成一个私有的所用域(匿名函数形成的)A,在A中使用了上级作用域中的tar的值,而且执行了move又形成了一个小的作用域(而在小的作用域中会使用tar的值),这样每一次定时器形成的A都不能销毁了
}
move(100);//->第一次这样执行传递100

//解决办法:
function move(tar){
~function _move(){
<js code>
window.setTimeout(_move,10);
}();
}
move(100);//->第一次这样执行传递100


JS中内存空间释放的问题(堆内存、栈内存)
[谷歌浏览器]
我们开辟一个内存,可能或有一些其他的变量等占用了这个内存,谷歌浏览器都会间隔一段时间看这个内存还有没有被占用,如果发现有没有被占用的内存了,就自己帮我们回收了(内存释放)

[火狐和IE]
我们开个内存,当我们引用了它,就在内存中记录一个数,增加一个引用浏览器就把这个数+1,减少一个引用,浏览器就把这个数-1…当减到零的时候浏览器就把这个内存释放了;但是有些情况下(尤其是IE)记着记着就弄乱了,内存就不能释放了–>浏览器的内存泄露

var obj={};
我们养成一个好的习惯,当我们obj这个对象使用完成了,我们手动的obj=null (null空对象指针),浏览器会自己把刚才的堆内存释放掉


蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

前端js中动态添加的元素不能触发绑定事件解决方法

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

问题描述:在页面选择关键词时,需要将关键词元素绑定点击事件使同一类型的关键词只有一个固定class,使其随点击更换,目的是为了让这一类型的关键词的值可以由class获取。在原本写死的关键词上绑定的事件是可用的,但是换成动态加载后发现只能适用于写死的情况。很无奈,在网上搜索一番后花了点时间终于解决了,下面奉上。  

参考文章:https://blog.csdn.net/qq_35129893/article/details/78363211?locationNum=2&fps=1

原本绑定事件如下:

[javascript] view plain copy
  1. //查询条件class的加载和移除(不能绑定动态加载的标签)  
  2. $('.value_list').children.click(function(){     
  3.     $(this).addClass('a-time').siblings().removeClass('a-time');  

针对的HTML元素如下:

[html] view plain copy
  1. <div class="value_list value_list1" style="width: 80%;" id="subject">  
  2.     <span class="mr36" onclick="selectTopic(0)" value="0">全部</span>  
  3.     <a href="javascript:;" onclick="selectTopic("6eac9783353d40bba49e6b253e73f285")" value="dayu" types="subject" class="a-time">dayu</a>  
  4.     <a href="javascript:;" onclick="selectTopic("f9cbaa888cf34a99b6c50bf393e1a859")" value="天下会" types="subject" class="">天下会</a>  
  5.     <a href="javascript:;" onclick="selectTopic("3f4aa8924c88466dafc63d52aa57e7a6")" value="大雨" types="subject">大雨</a>  
  6.     <a href="javascript:;" onclick="selectTopic("87259765e9174a3b9d97f00a461e90bd")" value="士大夫" types="subject" class="">士大夫</a>  
  7. </div>  

但是发现,原先的事件不能用于动态加载的元素,如上面加载的,加载形式如下:

[javascript] view plain copy
  1. //获取关键词列表  
  2. function getlist(){  
  3.     $("#subject").html("");  
  4.     $.ajax({  
  5.         type: "POST",  
  6.         url:path+"/key/queryKeys.php",  
  7.         dataType : "json",  
  8.         success: function(result) {  
  9.             var data = result.data;  
  10.             console.log(data+" 888");  
  11.             if(data!=''){  
  12.                 var html='<span class="a-time mr36" onclick="selectTopic(0)" value="0">全部</span>';  
  13.                 for(var i=0;i<data.length;i++){//如果不加"则只能传递数字变量而不能传递带有字母的变量,加上"则无影响  
  14.                 //  html+='<li class="fl"><i class="iconfont close" onclick="del("'+data[i].kw_id+'")"></i>'+data[i].kw_word+'</li>';  
  15.                     html+='<a href="javascript:;" onclick="selectTopic("'+data[i].kw_id+'")" value="'+data[i].kw_word+'" types="subject">'+data[i].kw_word+'</a>'  
  16.                 }                             
  17.                 $("#subject").html(html);  
  18.             }else{  
  19.                 alert("请先登陆!");   
  20.             }  
  21.         }  
  22.          });   
  23. }  

无奈,只能上网寻求万能的大神了。

基本上提供的解决方案就两个,使用

$('element').live('click',function(){})

或者

$('父元素').on('click', '子元素', function(){})

我先是使用.live尝试了下,发现gg,心灰意冷ing;本着试一试不要钱的心态又用.on试了下,结果令人惊喜啊!可以使用了,哎,这鬼玩意坑死人。

下面上针对我加载的界面元素写的绑定事件:

[javascript] view plain copy
  1. //查询条件class的加载和移除(适用于动态加载标签的情况--on事件需要jquery在1.6以上)  
  2. $('.value_list').on('click','a,span',function(){  
  3.     $(this).addClass('a-time').siblings().removeClass('a-time');  
  4. ;  

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

1.把wxParse文件全部放入项目。

2.在wxml中import wxParse.wxml,并把template插入到到对应的位置上

[html] view plain copy
  1. <!--wxml-->  
  2. <import src="../../../wxParse/wxParse.wxml"/>  
  3. <view class="view-title">{{title}}</view>  
  4. <view class="view-time-box">  
  5.   <text class="view-date">{{date}}</text>  
  6.   <text class="view-time">{{time}}</text>  
  7. </view>  
  8. <template is="wxParse" data="{{wxParseData:article.nodes}}"/>  

3.在wxss中import wxParse.wxss,并设置样式;比如‘wxParse-image’是富文本图片转化成image组件之后的类名,‘wxParse-p’是p标签转化成view组件后设置的类名

[css] view plain copy
  1. <!--wxss-->  
  2. @import "../../../wxParse/wxParse.wxss";  
  3. page{  
  4.   background#fff;  
  5. }  
  6. .view-title{  
  7.   line-height80rpx;  
  8.   font-size48rpx;  
  9.   color:#0C0C0C;  
  10.   overflowhidden;  
  11.   text-overflow: ellipsis;  
  12.   display: -webkit-box;  
  13.   -webkit-line-clamp: 2;  
  14.   -webkit-box-orient: vertical;  
  15.   max-height190rpx;  
  16.   min-height80rpx;  
  17.   width:690rpx;  
  18.   padding:30rpx 30rpx 0;  
  19. }  
  20. .view-time-box{  
  21.   height66rpx;  
  22.   line-height66rpx;  
  23.   font-size30rpx;  
  24.   color:#999999;  
  25.   margin-bottom40rpx;  
  26.   padding:0 30rpx;  
  27. }  
  28. .view-date{  
  29.   margin-right20rpx;  
  30. }  
  31. .wxParse-img{  
  32.   margin-top:20rpx;  
  33.   displayblock;  
  34.   position:relative;  
  35.   top:0;  
  36.   left:50%;  
  37.   transform: translateX(-50%);  
  38. }  
  39. .wxParse-p{  
  40.   text-indent2em;  
  41.   margin-top:20rpx;  
  42.   color:#0C0C0C;  
  43.   line-height:50rpx;  
  44.   font-size:34rpx;  
  45.   padding:0 30rpx 30rpx;  
  46.   text-alignjustify;  
  47. }  

4.js

[javascript] view plain copy
  1. var WxParse = require('../../../wxParse/wxParse.js');  
  2. Page({  
  3.   
  4.   /** 
  5.    * 页面的初始数据 
  6.    */  
  7.   data: {  
  8.     title: '',  
  9.     date: "",  
  10.     time: "",  
  11.     id: ''  
  12.   },  
  13.   
  14.   /** 
  15.    * 生命周期函数--监听页面加载 
  16.    */  
  17.   onLoad: function (options) {  
  18.     this.setData({  
  19.       id:options.id  
  20.     })  
  21.   },  
  22.   onShow: function () {  
  23.     wx.showLoading({  
  24.       title: '加载中...',  
  25.     })  
  26.     var that = this;  
  27.   
  28.     // 模拟获取数据  
  29.     setTimeout(function () {  
  30.       that.setData({  
  31.         title:'侨宝柑普茶新会陈皮侨宝柑',  
  32.         date:"2018-03-01",  
  33.         time:"13:20:53"  
  34.       })  
  35.       var article = `  
  36.         <img src="../../../imgs/index/s.png"></img>  
  37.     <p>微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)</p>  
  38.     <p>微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)微信小程序如何解析HTML富文本(使用wxParse解析富文本的demo)</p>  
  39.         <img src="../../../imgs/index/s.png"></img>  
  40.     <p>近两年,小青柑的火爆有目共睹,娇小玲珑的产品形态、便携式的消费场景、柑与茶结合的时尚方式以及独特的口感和养生功效,都在顺应着目前年轻化、多元化、便携化的茶叶消费市场需求,让它成为了一大爆品。</p>  
  41.       `;  
  42.       /** 
  43.       * WxParse.wxParse(bindName , type, data, target,imagePadding) 
  44.       * 1.bindName绑定的数据名(必填) 
  45.       * 2.type可以为html或者md(必填) 
  46.       * 3.data为传入的具体数据(必填) 
  47.       * 4.target为Page对象,一般为this(必填) 
  48.       * 5.imagePadding为当图片自适应是左右的单一padding(默认为0,可选) 
  49.       */  
  50.       WxParse.wxParse('article''html', article, that, 20);  
  51.         
  52.       // 更改数据、获取新数据完成  
  53.       wx.hideLoading();  
  54.     }, 500)  
  55.   }  
  56. })  
具体的API可以去GitHub上查看:https://github.com/icindy/wxParse








蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务


HTML5网页扫描二维码

seo达人

如果您想订阅本博客内容,每天自动发到您的邮箱中, 请点这里

[HTML]代码

<!DOCTYPE html>
<html>
<head>
    <title>二维码扫描测试</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<style type="text/css">
    html, body {
        height: 100%;
        width: 100%;
        text-align: center;
    }
</style>
<script src="../js/jquery-1.11.1.min.js"></script>
<script>
    //这段代 主要是获取摄像头的视频流并显示在Video 签中
    var canvas = null, context = null, video = null;
    window.addEventListener("DOMContentLoaded", function () {
        try {
            canvas = document.getElementById("canvas");
            context = canvas.getContext("2d");
            video = document.getElementById("video");
            var videoObj = { "video": true, audio: false },
                flag = true,
                MediaErr = function (error) {
                    flag = false;
                    if (error.PERMISSION_DENIED) {
                        alert('用户拒绝了浏览器请求媒体的权限', '提示');
                    } else if (error.NOT_SUPPORTED_ERROR) {
                        alert('对不起,您的浏览器不支持拍照功能,请使用其他浏览器', '提示');
                    } else if (error.MANDATORY_UNSATISFIED_ERROR) {
                        alert('指定的媒体类型未接收到媒体流', '提示');
                    } else {
                        alert('系统未能获取到摄像头,请确保摄像头已正确安装。或尝试刷新页面,重试', '提示');
                    }
                };
            //获取媒体的兼容代码,目前只支持(Firefox,Chrome,Opera)
            if (navigator.getUserMedia) {
                //qq浏览器不支持
                if (navigator.userAgent.indexOf('MQQBrowser') > -1) {
                    alert('对不起,您的浏览器不支持拍照功能,请使用其他浏览器', '提示');
                    return false;
                }
                navigator.getUserMedia(videoObj, function (stream) {
                    video.src = stream;
                    video.play();
                }, MediaErr);
            }
            else if (navigator.webkitGetUserMedia) {
                navigator.webkitGetUserMedia(videoObj, function (stream) {
                    video.src = window.webkitURL.createObjectURL(stream);
                    video.play();
                }, MediaErr);
            }
            else if (navigator.mozGetUserMedia) {
                navigator.mozGetUserMedia(videoObj, function (stream) {
                    video.src = window.URL.createObjectURL(stream);
                    video.play();
                }, MediaErr);
            }
            else if (navigator.msGetUserMedia) {
                navigator.msGetUserMedia(videoObj, function (stream) {
                    $(document).scrollTop($(window).height());
                    video.src = window.URL.createObjectURL(stream);
                    video.play();
                }, MediaErr);
            } else {
                alert('对不起,您的浏览器不支持拍照功能,请使用其他浏览器');
                return false;
            }
            if (flag) {
                //alert('为了获得更准确的测试结果,请尽量将二维码置于框中,然后进行拍摄、扫描。 请确保浏览器有权限使用摄像功能');
            }
            //这个是拍照按钮的事件,
            $("#snap").click(function () { startPat(); }).show();
        } catch (e) {
            printHtml("浏览器不支持HTML5 CANVAS");
        }
    }, false);
    //打印内容到页面
    function printHtml(content) {
        $(window.document.body).append(content + "<br/>");
    }
    //开始拍照
    function startPat() {
        setTimeout(function () {//防止调用过快
            if (context) {
                context.drawImage(video, 0, 0, 320, 320);
                CatchCode();
            }
        }, 200);
    }
    //抓屏获取图像流,并上传到服务器
    function CatchCode() {
        if (canvas != null) {
            //以下开始编 数据
            var imgData = canvas.toDataURL("image/jpeg");
            //将图像转换为base64数据
            var base64Data = imgData; //在前端截取22位之后的字符串作为图像数据
            $.ajax({
                type: 'post',
                url: '../ashx/HandlerScan.ashx?method=ParseImage',
                data: 'ImgData=' + base64Data,
                dataType: "json",
                cache: false,
                timeout: 10000,
                success: function (mes) {
                    if (mes.code == '1') {
                        alert('未识别二维码,请重新扫描!');
                    }
                    else {
                        alert(mes.name);
                    }
                },
                error: function (err) {
                    alert('扫描失败' + err);
                }
            });
        }
    }
</script>
<body>
    <div id="support"></div>
    <div id="contentHolder">
        <video id="video" width="320" height="320" autoplay></video>
        <canvas id="canvas" style="display:none; background-color:#F00;" width="320" height="320"></canvas><br/>
        <button id="snap" style="display:none; height:50px; width:120px;">开始扫描</button>
    </div>
</body>
</html>  

[C#后台]

    public class HandlerScan : IHttpHandler
    {
        private JsonResult js = new JsonResult();
        public void ProcessRequest(HttpContext context)
        {
            string result = string.Empty;
            string method = context.Request.QueryString.ToString();//获取想要做的操作
            switch (method)
            {
                case "method=ParseImage":
                    result = ParseImage(context);
                    break;
                default:
                    break;
            }
            context.Response.ContentType = "text/json";
            context.Response.Write(result);
        }
        private string ParseImage(HttpContext context)
        {
            try
            {
                string imgStr = context.Request.Params["ImgData"].ToString();
                imgStr = imgStr.Replace("data:image/jpeg;base64,", "");
                //整理字符串
                imgStr = imgStr.Replace(" ", "+");
                byte[] arr = Convert.FromBase64String(imgStr);
                MemoryStream ms = new MemoryStream(arr, 0, arr.Length);
                Bitmap bmp = new Bitmap(ms);
                //解析图片
                Result result = new BarcodeReader().Decode(bmp);
                if(result == null)
                {
                    return "{\"code\":1,\"name\":\"\"}";
                }
                else
                {
                    string[] a = result.Text.Split(','); 
                    string str = "{\"code\":0,\"name\":\"" + a[0] + "\"}";
                    return str; 
                }
            }
            catch (Exception ex)
            {
                return "{\"code\":1,\"msg\":\"" + ex.Message + "\",\"userName\":\"\"}";
            }
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

日历

链接

个人资料

蓝蓝设计的小编 http://www.lanlanwork.com

存档