首页 文章 精选 留言 我的

精选列表

搜索[javascript库],共10000篇文章
优秀的个人博客,低调大师

Javascript 开启浏览器全屏模式

通常在某些情况下,我们需要让浏览器开启全屏模式,以便获得更好的视觉体验,先看下全屏模式简单的几个API。 浏览器默认绑定 非全屏模式下, document的F11按键绑定开启全屏模式 全屏模式下, document的esc和F11 按键绑定关闭全屏模式 屏幕全屏模式改变事件 当成功进入全屏模式后, document会收到一个fullscreenchange 事件。 当退出全屏状态后, document又会收到fullscreenchange 事件。 varscreenChange='webkitfullscreenchange'||'mozfullscreenchange'||'fullscreenchange' 判断当前是否处于全屏状态 非标准: varisFullScreen=document.fullScreen||document.mozFullScreen||document.webkitIsFullScreen; 标准: varisFullScreen=document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement 开启全屏模式 functionlaunchFullScreen(element){ if(element.requestFullscreen){ element.requestFullscreen(); }elseif(element.mozRequestFullScreen){ element.mozRequestFullScreen(); }elseif(element.webkitRequestFullscreen){ element.webkitRequestFullscreen(); }elseif(element.msRequestFullscreen){ element.msRequestFullscreen(); } } 注意:requestFullscreen是规范的书写模式( s是小写), 但在Gecko内核中仍使用带前缀的大写模式mozRequestFullScreen。 关闭全屏模式 functionexitFullscreen(){ if(document.exitFullscreen){ document.exitFullscreen(); }elseif(document.mozCancelFullScreen){ document.mozCancelFullScreen(); }elseif(document.webkitExitFullscreen){ document.webkitExitFullscreen(); } 全屏模式只能由手势触发 了解API后,假如我们监听window.onload事件执行launchFullScreen方法,Chrome浏览器会提示“开启全屏模式API只能由用户手势触发”。 "Failed to execute 'requestFullScreen' on 'Element': API can only be initiated by a user gesture." 原因是浏览器采用安全的机制, 将这种强制全屏模式意为“恶意行为”,一切非用户主观意愿带来的变化都是不允许的。 因此如果你的应用有全屏需求,有两种方案。 1.页面初始化给用户一个“F11开启全屏” 的提示, 并且在延迟几秒之后消失。 2.页面设置一个全屏按钮,单击全屏按钮进入全屏模式,并且隐藏按钮(视觉效果最佳)。 对于第二种方案,需要监听键盘事件: document.addEventListener("keydown",function(e){ varcurrKey=0 //在FireFox或Opera中,隐藏的变量e是存在的,那么e||event返回e,如果在IE中,隐藏变量e是不存在,则返回event。 vare=e||event; //IE中,只有keyCode属性,而FireFox中有which和charCode属性,Opera中有keyCode和which属性 varcurrKey=e.keyCode||e.which||e.charCode; if(currKey==112){ launchFullScreen(); } },false); 具备了兼容各种浏览器按键模式的监听,但不知道keycode肿么办,112是哪个键? 字母和数字键的键码值(keyCode) 按键 键码 按键 键码 按键 键码 按键 键码 A 65 J 74 S 83 1 49 B 66 K 75 T 84 2 50 C 67 L 76 U 85 3 51 D 68 M 77 V 86 4 52 E 69 N 78 W 87 5 53 F 70 O 79 X 88 6 54 G 71 P 80 Y 89 7 55 H 72 Q 81 Z 90 8 56 I 73 R 82 0 48 9 57 数字键盘上的键的键码值(keyCode) 按键 键码 按键 键码 0 96 8 104 1 97 9 105 2 98 * 106 3 99 + 107 4 100 Enter 108 5 101 – 109 6 102 . 110 7 103 / 111 功能键键码值(keyCode) 按键 键码 按键 键码 F1 112 F7 118 F2 113 F8 119 F3 114 F9 120 F4 115 F10 121 F5 116 F11 122 F6 117 F12 123 控制键键码值(keyCode) 按键 键码 按键 键码 按键 键码 按键 键码 BackSpace 8 Esc 27 Right Arrow 39 -_ 189 Tab 9 Spacebar 32 Dw Arrow 40 .> 190 Clear 12 Page Up 33 Insert 45 /? 191 Enter 13 Page Down 34 Delete 46 `~ 192 Shift 16 End 35 Num Lock 144 [{ 219 Control 17 Home 36 ;: 186 \ 220 Alt 18 Left Arrow 37 =+ 187 ]} 221 Cape Lock 20 Up Arrow 38 ,< 188 ‘“ 222 避免使用非标准化的方法 非标准化的方法指的是进入草案前浏览器实现的一些方法,避免使用。window.fullScreen(Firefox)HTMLMediaElement.webkitDisplayingFullscreenHTMLMediaElement.webkitEnterFullscreenHTMLMediaElement.webkitExitFullscreenHTMLMediaElement.webkitSupportsFullscreen 原文发布时间:2018-6-19 原文作者:伯乐在线 本文来源csdn博客如需转载请紧急联系作者

优秀的个人博客,低调大师

JavaScript 基础 --- (数据类型/循环/条件)

一、js 输出1.window.alert() 警告框 2.document.write() 写到 HTML 文档中 3.innerHTML 写到 HTML 元素 4.console.log() 写到浏览器的控制台 二、js 语句与注释 1. ; (var a = 1;) ;表示语句的结尾 2. 语句标识符:var / if / for 等 3.注释:单行 // 多行 /* */三、数据类型 1.未定义 (undefined) var x; //x 为 undefined(表示变量不含有值) 2.数字 (Number) var y = 5; //y 为数字 3.字符串 (String) var z = "John" // z为字符串 4.布尔 (Boolean) var a = true; //a 为 布尔类型 5.对象 (Object) var person ={firstname:"John",lastname:"Doe",id:5566}; 取值:console.log(person.firstname) console.log(person["firstname"]) 6.数组 (Array) 6-1. var cars = new Array(); //此时 cars 数组的长度为 0 cars[0] = "Saab"; //此时 cars 数组的长度为 1 ,js 数组是动态变化的,即第一个数赋值为 Saab car[1] = "Volvo"; //即第二个数赋值为 Volvo car[1] = "BMW"; //即第三个数赋值为 BMW 6-2. var cars = new Array("Saab","Volvo","bmw") ; 6-3. var cars = ["Saab"."Volvo","BMW"]; 7.空 (Null) var b = null //b为 null(可以用来清空变量) 四、js 变量 1.变量必须以字母开头,(不推荐 $ 和 _)区分大小写 五、js 函数 函数:是由事件驱动的或者当它被调用时执行的可重复使用的代码块 定义方法:1.function a(参数){ } 声明会前置 输出: hello world 输出: hello world 2. var a = function(参数){} 匿名函数 输出:这是一个匿名函数 输出: 1 2 3 (传递参数) return 输出: 六、js 比较与逻辑运算符 1. < 小于 > 大于 2.== 等于(5=="5") === 绝对等于(值和类型均相等 5===5) != 不等于 3.&& 与 || 或 !非 七、js 条件语句 if else if 输出: switch 输出:1 八、js 循环语句 for 输出: for in(循环遍历对象) 输出: while(指定条件为 true 时循环指定的代码块) 输出: break (跳出整个循环) 输出: continue(跳出本次循环) 输出:

优秀的个人博客,低调大师

ES6 javascript 实用开发技巧

ES6 实用开发技巧 本文只罗列出在 ES6 开发过程中相对实用的内容,而非一个高大全的文档,如果希望查阅详细的内容,可购买阮一峰老师所出版的 ES6 相关图书。 定义变量/常量 ES6 中新增加了 let 和 const 两个命令,let 用于定义变量,const 用于定义常量 两个命令与原有的 var 命令所不同的地方在于,let, const 都是块级作用域,其有效范围仅在代码块中,实例如下: //es5 if(1==1){ var b = 'foo'; } console.log(b);//foo //es6 if(1==1){ let b = 'foo'; } console.log(b);//undefined (b is not defined) 定义常量对象 const a = {a:1,b:2}; a.b = 3; console.log(a);//{a:1,b:3} 上例中,常量 a 中的内容在定义后,再进行修改依然有效,原因是对于对象类型的使用是指针式引用,常量只是指向了对象的指针,对象本身的内容却依然可以被修改,注意,数组(Array) 也是对象; 那么如果在定义常量时使用基础数据类型:string, number, boolean 等 const a = 1; a = 2;// Uncaught TypeError: Assignment to constant variable. 在使用中,建议使用 let 与 const 完全代替 var 命令 数值扩展 转换 Number.parseInt - 将字符串或数字转换为整数 Number.parseFloat - 将字符串或数字转换为浮点数 Number.parseInt, Number.parseFloat 与 parseInt, parseFloat 功能一致,在ES6中,推荐使用 Number. 的方式进行调用,这么做的目的是为了让代码的使用方式尽可能减少全局性方法,使用得语言逐步模块化 测试函数 //测试是否整数 Number.isInteger(21)//true Number.isInteger(1.11)//false //测试是否NaN Number.isNaN(Nan)//true Number.isNaN(1)//false 字符串扩展 字符串内容测试 'abcdef'.includes('c');//true 'abcdef'.includes('ye');//false 'abcdef'.startsWith('a');//true 'abcdef'.endsWitch('f');//true //includes(), startsWith(), endsWith() 都支持第二个参数, //类型为数字类型,意为从第 n 个字符开始,endsWith()的第二个参数有点不一样 'abcdef'.includes('c', 4);//false 从第5个字符开始查找是否有 'c' 这个字符 'abcdef'.startsWith('d', 3);//true 从第4个字符开始查找是否是以 'd' 字符为开头 'abcdef'.endsWith('d', 4);//true 前面的4个字符里,是否以 'd' 字符为结尾 字符串内容重复输出 'a'.repeat(5);//aaaaa 重复输出5遍 原生支持模板语言 //es5 $('#result').append( 'There are <b>' + basket.count + '</b> ' + 'items in your basket, ' + '<em>' + basket.onSale + '</em> are on sale!' ); //es6 //在es6中,内容模板,可以定义在 `` 包起来的字符串中,其中的内容会保持原有格式 //另外可以在字符串中直接使用模板语言进行变量填充,优雅而简洁 $('#result').append(` There are <b>${basket.count}</b> items in your basket, <em>${basket.onSale}</em> are on sale! `); 字符串遍历输出 //for ...of 格式为 es6 中的 Iterator 迭代器的输出方式 for(let c of 'abc'){ console.log(c); } //a //b //c 字符串补全 //参数1:[number] 目标字符串长度 //参数2:[string] 进行补全的字符串 '12345'.padStart(7, '0')//0012345 - 字符串不足7位,在头部补充不足长度的目标字符串 '12345'.padEnd(7, '0')//1234500 - 在尾部进行字符串补全 数组扩展 合并数组 let a = [1, 2]; let b = [3]; let c = [2, 4]; let d = [...a, ...b, ...c];//[1, 2, 3, 2, 4] 所有内容合并,但并不会去除重复 快速转换为数组 Array.of(3,4,5)//[3,4,5] 数组内容测试 //判断对象是否为数组 if(Array.isArray(obj)){...} [1,2,3].includes(5);//false,检索数据中是否有5 //找出第一个匹配表达式的结果,注意是只要匹配到一项,函数即会返回 let a = [1, 3, -4, 10].find(function(value, index, arr){ return value < 0; }); console.log(a);//-4 //找出第一个匹配表达式的结果下标 let a = [1, 3, -4, 10].findIndex(function(value, index, arr){ return value < 0; }); console.log(a);//2 内容过滤 //排除负数内容 let a = [1, 3, -4, 10].filter(function(item){ return item > 0; }); console.log(a);//[1, 3, 10] 内容实例 .keys() - 获得数组中所有元素的键名(实际上就是下标索引号) .values() - 获得数组中所有元素的数据 .entries() - 获得数组中所有数据的键名和数据 for (let index of ['a', 'b'].keys()) { console.log(index); } // 0 // 1 for (let elem of ['a', 'b'].values()) { console.log(elem); } // 'a' // 'b' for (let [index, elem] of ['a', 'b'].entries()) { console.log(index, elem); } // 0 "a" // 1 "b" .entries(), .keys(), .values() 功能与 Object 中的几个同名函数功能类似,实际使用中实用性不高,对于数组的操作,直接进行遍历即可 对象扩展 属性的简洁表示 //直接使用变量/常量的名称个为对象属性的名称 let a = 'abc'; let b = {a};//{a: 'abc'} function f(x, y){ return {x, y};} //等效于 function f(x, y){ return {x: x, y: y}} let o = { f(){ return 1; } } //等效于 let o = { f: function(){ return 1; } } 对象内容合并 let a = {a:1,b:2}, b = {b:3}, c = {b:4,c:5}; let d = Object.assign(a, b, c); console.log(d);//{a:1,b:4,c:5} console.log(a);//{a:1,b:4,c:5} //上面的合并方式会同时更新 a 对象的内容,a 的属性如果有多次合并会被更新数据, //参数列中的对象只会影响第一个,后面的参数对象不会被修改数据 //推荐使用这种方式进行对象数据合并 let a = {a:1,b:2}, b = {b:3}, c = {b:4,c:5}; let d = Object.assign({}, a, b, c);//第一个参数增加一个空对象,在合并时让它被更新,不影响实际的对象变量内容 console.log(d);//{a:1,b:4,c:5}//与上面的方式合并结果一致,使用这种方式, a 对象的内容就不会被影响了 对象内容合并的方向是从参数顺序的后向前合并 对象内容集合 Object.keys() - 获得对象中所有的键名,以数组的形式返回 var obj = { a:1,b:2 }; var names = Object.keys(obj);//['a', 'b'] Object.values() - 获得对象中所有的值内容,以数组的形式返回 var obj = { a:1,b:2 }; var values = Object.values(obj);//[1, 2] Object.entries() - 获得对象中所有的成员数据,以数组的形式返回,成员的内容也是数组形式 var obj = { a:1,b:2 }; var values = Object.entries(obj);//[['a',1], ['b',2]] 其实观察可发现,Object.keys(), Object.values(), Object.entries(),与 Java 的 MAP 中的方法是一致的,不论是方法名还是具体的用法,这也可以帮忙理解这些功能 API 对象内容测试 //判断对象是否为数组对象 if(Object.isArray(someobj)){} //判断目标对象是否为空对象 if(someobj && Object.keys(someobj).length) 解构赋值 let [a, b, c] = [1, 2, 3]; //定义了三个变量,并对应赋了值;如果值的个数与变量名个数不匹配,没有对应上的变量值为 undefined let [a, b, c='default'] = [1, 2]; //指定默认值,在定义变量时就指定了默认值,如果赋值时,没有给定内容,则会取默认值 let [a, …b] = [1,2,3]; //这里 b 的值为[2,3],这样可以快速使用剩余的数据赋值给变量, //但实际使用中为了避免代码阅读的歧义,不推荐这么使用,仅作了解即可 let [a,b,c] = 'yes'; console.log(a);//y console.log(b);//e console.log(c);//s 字符串的解构赋值会以单个字符的方式进行赋值 let {length}='yes'; console.log(length);//3 以对象赋值的方式,如果名称是字符串的自带属性,则会获得属性值 let arr = [1,2]; let obj = {a:1,b:2}; function test ({a = 10, b}){ console.log('a:',a); console.log('b:',b); } test(obj); 解构赋值的使用实例,作为函数传参,并使用默认值 对象结构解构 let obj = {a: 1, b: 2}; let {a, b} = obj;//a=1,b=2 使用变量的方式进行结构赋值,需要严格匹配名称,数组的模式是严格匹配下标 let obj = {a: 1, b: 2}; let {a=0, b=5} = obj; 赋值并给定默认值 let obj = {a: 1, b: 2}; let {a:A, b} = obj;//A=1,b=2,a报错,变量未定义 获得内容后,将变量进行改名 let obj = {a: 1, b: 2}; let a = 0; ({a, b} = obj); 对已存在的 a 进行修改值,并生成新的变量 b let obj = { arr: ['aaa',{a:1}] }; let {arr:[b, {a}]} = obj;//这里的arr互相映射 console.log(b); console.log(a); 获得对象的子数据,并映射到相应的变量,这里需要注意的是结构要对应 模块化 最简单实例的使用场景 //a.js let a = {a:1,b:2,c:3}; export default a; //b.js import a from 'a.js';//假设 a.js 与 b.js 同在一个目录中 console.log(a.a);//1 以上简单的实例就两个脚本文件举例说明了两个文件在实际使用,可以进行互相引用,并获得目标文件中的数据;我们可以认为一个脚本文件就是一个 模块,那么在实际开发过程中,可以将业务处理内容,或是数据处理过程 抽象在一个文件中,在需要使用时,由其它模块引入并使用其中的数据 箭头函数 箭头函数的基本语法 (参数1, 参数2, …, 参数N) => { 函数声明 } (参数1, 参数2, …, 参数N) => 表达式(单一) //相当于:(参数1, 参数2, …, 参数N) =>{ return 表达式; } // 当只有一个参数时,圆括号是可选的: (单一参数) => {函数声明} 单一参数 => {函数声明} // 没有参数的函数应该写成一对圆括号。 () => {函数声明} //箭头函数的内容不能用于构造函数,即声明的内容,不能通过 new 一个对象来使用 看一个简单的例子 let count = function(num){ return num + 1; }; //使用箭头函数重构 let count = num => num + 1; 上面的例子在重构后,给人最直观的感受就是 function 关键字 {}、() 和 return 等关键字不再需要书写,对于简单的函数体,可简化不少代码 let count = num => { let base = 50; let step = 10; return base + step + 1; }; 在函数体一行代码不能完成时,就不能省略 {} 和 return 关键字 //多个入参 let count = (num, step) => num + step + 1; //没有入参 let count = () => 3.1415926; 当入参不止一个或是没有入参时,需使用小括号包裹 返回一个对象 //错误,会报 SyntaxError let count = num => { base: 50, total: num + 100 }; //正常返回对象 let count = num => ({ base: 50, total: num + 100 }); 封闭上下文的 this 通过上面的例子可以看得出,箭头函数很像匿名函数((function(args){...}(val))),但又不完全一样,主要的区别在于 this 的使用结果 let goods = { price: 5, total: function(quantity){ console.log(this.price);//5 - this 指向了 goods 对象 let calc = function(){ return quantity * this.price;//这里的 this 指向了window } return calc(); } }; console.log(goods.total(5));//Nan 上面的例子当然可以使用传参或在函数外定义一个变量 that 来接收外部的 this(即函数内第一句),并在函数内部使用 that 来解决问题,但这不在当前话题的讨论范围内 let goods = { price: 5, total: function(quantity){ console.log(this.price);//5 - this 指向了 goods 对象 let calc = () => quantity * this.price; //这里的 this 同样指向了goods对象 return calc(); } }; console.log(goods.total(5));//25 总结箭头函数的特点就是 更短的函数 和 封闭上下文的 this,也许更短的函数才是我们使用最多的地方 原文发布时间:04/12 原文作者:TerryZ 本文来源开源中国如需转载请紧急联系作者

优秀的个人博客,低调大师

JavaScript 原始数据类型转换

Js基础数据类型有7种: 原始数据类型(6种) number (数值) string (字符串) boolean (布尔) null (空对象, typeof 检测为object) undefine(未定义) symbol (符号类型) 对象数据类型(1种) object(对象类型) 补充: NaN表示 not a number; function本质为 object, 但由于其特殊的地位, typeof会检测为 function; symbol 为ECMAScript6 新定义的数据类型, 符号类型是唯一的并且是不可修改的, 并且也可以用来作为Object的key的值 转换为字符串 .toString() 无法将null, undefine转为字符串 String() 可以将null, undefine转为字符串 // 变量已经被赋值 console.log("变量已经被赋值的情况:"); (function test01(){ var name = "zhaozhao"; console.log(String(name)) console.log(name.toString()) })(); // 变量没有被赋值 console.log("变量没有被赋值的情况:"); (function test02(){ var name; console.log(String(name)) console.log(name.toString()) })(); 运行结果 转换为数值 parseInt()强转为整数 // 强转为整数 console.log("====") console.log(parseInt("100")); // 100 console.log(parseInt("100zhaozhao")); // 100 console.log(parseInt("zhaozhao100")); // NaN console.log(parseInt("100zhaozhao100")); // 100 console.log(parseInt("100.18zhaozhao")); // 100 parseFloat()转为浮点数(不会把整数转换为浮点数) // 转为浮点数(不会把整数转换为浮点数) console.log("====") console.log(parseFloat("100")); // 100 console.log(parseFloat("100zhaozhao")); // 100 console.log(parseFloat("zhaozhao100")); // NaN console.log(parseFloat("100zhaozhao100")); // 100 console.log(parseFloat("100.18")); // 100.18 console.log(parseFloat("100.18zhaozhao")); // 100.18 Number()转换为数值, 较严格 // 转换为数值 console.log("====") console.log(Number("100")); // 100 console.log(Number("100zhaozhao")); // NaN console.log(Number("zhaozhao100")); // NaN console.log(Number("100zhaozhao100")); // NaN console.log(Number("100.18")); // 100.18 console.log(Number("100.18zhaozhao")); // NaN 运行结果 转换为布尔 // 布尔类型的转换 // 除零以外的数字, 非空字符串 都为 true console.log(Boolean(1)) console.log(Boolean(-1)) console.log(Boolean("哈哈")) // 0 ,空字符串, null, undefined都为false console.log("====") console.log(Boolean(0)) console.log(Boolean("")) console.log(Boolean(null)) console.log(Boolean(undefined)) 转换为布尔 快速获取boolean值的小技巧: 在变量前添加2个!,示例!!("zhaozhao") === true; 和 !!("") === false 快速获取boolean Chrome控制台字体大小控制: - 字体变大: command + +- 字体变小: command + - (windows把command转为ctrl即可)

优秀的个人博客,低调大师

JavaScript之图片的放大和还原

一个简单的功能,鼠标放在图片上在该图片的上层显示放大后的图片,浮出的效果 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 $( "ul.thumbli" ).hover( function (){ $( this ).css({ 'z-index' : '10' }); var _width=$( this ).find( "img" ).width()*1.5, _height=$( this ).find( "img" ).height()*1.5, _top=_height/2, _left=_width/2; $( this ).find( 'img' ).addClass( "hover" ).stop() .animate({ marginTop: '-' +_top+ 'px' , marginLeft: '-' +_left+ 'px' , top: '50%' , left: '50%' , width:_width+ 'px' , height:_height+ 'px' , padding: '10px' },200); }, function (){ $( this ).css({ 'z-index' : '0' }); $( this ).find( 'img' ).removeClass( "hover" ).stop() .animate({ marginTop: '0' , marginLeft: '0' , top: '0' , left: '0' , width: '100%' , height: '165px' , padding: '5px' },400); }); 本文转自 爱笑嘚蛋蛋 51CTO博客,原文链接:http://blog.51cto.com/dd118/1976800,如需转载请自行联系原作者

优秀的个人博客,低调大师

JavaScript-手机中访问页面判断

最近在做微信服务号开发,其中遇到一个问题是微信服务号查看的个人的消息,如果点击在浏览器中查看(iOS中是在Safari中打开)应该是跳转到登录页面,因为页面需要从后台获取,因为需要服务端判断,如果是存页面不需要后台数据可以在前台进行判断,因为后台是NodeJS,所以给出客户端和服务端两个版本的代码供参考。 客户端判断 方法很简单,就是通过userAgent去判断,先判断是否为移动端,可以判断是iOS终端和Android终端,也可以具体到应用进行判断微信,微博,qq访问: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var browser = { versions: function() { var u = navigator.userAgent, ua = navigator.userAgent.toLowerCase(); return { //移动终端浏览器版本信息 trident: u.indexOf('Trident') > -1, //IE内核 presto: u.indexOf('Presto') > -1, //opera内核 webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核 mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或uc浏览器 iPhone: u.indexOf('iPhone') > -1, //是否为iPhone或者QQHD浏览器 iPad: u.indexOf('iPad') > -1, //是否iPad webApp: u.indexOf('Safari') == -1 ,//是否web应该程序,没有头部与底部 wechat:ua.match(/MicroMessenger/i) == "micromessenger",//微信 weibo:ua.match(/WeiBo/i) == "weibo",//微博 qq:ua.match(/QQ/i) == "qq"//qq }; }(), language: (navigator.browserLanguage || navigator.language).toLowerCase() }; console.log(navigator.userAgent); 服务端判断 NodeJS同样也是通过userAgent判断,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 var browser= function(req) { var u = req.headers['user-agent']; var ua = u.toLowerCase(); //移动终端浏览器版本信息 return { trident: u.indexOf('Trident') > -1, //IE内核 presto: u.indexOf('Presto') > -1, //opera内核 webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核 mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或uc浏览器 iPhone: u.indexOf('iPhone') > -1, //是否为iPhone或者QQHD浏览器 iPad: u.indexOf('iPad') > -1, //是否iPad webApp: u.indexOf('Safari') == -1, //是否web应该程序,没有头部与底部 wechat: ua.match(/MicroMessenger/i) == "micromessenger",//微信 weibo: ua.match(/WeiBo/i) == "weibo",//微博 qq: ua.match(/QQ/i) == "qq"//QQ空间 }; }; exports.browser=browser; 基本的判断都有,可以根据判断的结果给出不同的响应~ 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/5013028.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册