使用js的三种方式
<button onclick="alert('弹框测试')">点我一下</button>
<body> <script> alert("弹框"); </script> </body>
<script src="js/xx.js"></script>
以上使用脚本的三种方式的优先级,谁在上,谁先执行。因为是解释性语言。
var aa="欢迎来到\"JavaScript世界";
数字 + 字符串:数字转换为字符串 10+’a’ -> 10a 数字 + 布尔值:true转换为1,false转换为0 true+5->6 字符串 + 布尔值:布尔值转换为字符串true或false true+’a’->truea 布尔值 + 布尔值:布尔值转换为数值1或0 true+true->2
var a = "10"; var b = 10; if (a == b) alert("equal"); if (a === b) alert("same");
if(关系表达式) { // 语句块 1 }else { // 语句块 2 }
if (表达式1) { // 语句1; }else if (表达式2){ // 语句2; }else if (表达式3){ // 语句3; } else{ // 语句4; }
switch (表达式) { case 值1: // 语句1; break; case 值2: // 语句2; break; default: // 语句4; }
for (var i=1 ; i<=5 ; i++){ alert(i); }
while (条件){ // 语句1; ... }
var str = "hello"; console.log( str.length );
var name = "AngierSun"; console.log( "大写:"+name.toUpperCase() ); console.log( "小写:"+name.toLowerCase() );
var str1 = "javascript网页教程"; var str2 = str1.charAt(12); // 下标12上的字符 console.log(str2); //教 var str3 = str1.charCodeAt(12); console.log(str3); //25945:(汉字“教”在unicode编码中的编号)
var str1 = "javascript网页教程"; var str2 = str1.indexOf("a"); console.log(str2); // 1 , a字符在str1中第一次出现的下标 var str3 = str1.lastIndexOf("a"); //3,a字符在str1中最后一次出现的下标 console.log(str3);
var str1 = "abcdefgh"; var str2 = str1.substring(2,4); console.log(str2); //cd,从2开始(包含),4结束(不包含)
var str1 = "abcde"; var str2 = str1.replace("cd","XXX"); console.log(str2); // abXXXe,将str1中的cd替换成XXX
var str1 = "一,二,三,四,五"; // 将str1 以逗号进行分割,分割成N份,所以返回的结果一定 是数组结构 var arr = str1.split(","); console.log( "共分割成:"+arr.length+"份" ); console.log( "第三份是:" + arr[2] ); // 三
var arr1 = new Array();
// 第一种 var arr1 = new Array(); arr1[0] = 110; arr1[1] = 119; arr1[2] = 120; // 第二种 var arr1 = new Array(10,"a",true); // 第三种 var arr1 = [10,"a",true]; for (var i = 0; i < arr1.length; i++) { console.log(arr1[i]); }
var arr = [1,2,3,4]; console.log("类型为:" + typeof( arr ) ); var str = arr.toString(); // 将数组转换成字符串 console.log( str +",类型为:" + typeof( str ) );
var arr = [1,2,3,4]; // 将数组中每个元素用-进行连接,并形成一个全新的字符串 var str = arr.join("-"); console.log( str +",类型为:" + typeof( str ) );
var arr = [1,2,3,4]; // 在arr数组的后面添加新的元素,形成一个新数组,但是 原数组是不变的 var arrnew = arr.concat(5,6); console.log( arrnew +",类型为:" + typeof( arrnew ) ); console.log("原数组:" + arr);
var arr = ['a','b','c','d','e','f','g','h']; var arrnew = arr.slice( 2,4 ); // 在arr数组中截取,从2开始(包含),4结束(不包含) console.log( arrnew ); // cd
var arr = [31,12,111,444]; console.log( arr.toString() ); arr.reverse(); // 将数组中的元素倒置 console.log( arr.toString() );
var arr = [31,12,111,444]; arr.sort(); // 字符排序(不会按照字面量的大小) console.log( arr );
var arr = [31,12,111,444]; arr.sort( fun1 ); // 数字排序(会按照字面量的大小) console.log( arr ); // 定义排序函数 function fun1(a,b){ return a-b; }
// 返回0-9之间任意一个随机数字 var i = Math.random() * 10; var j = Math.floor(i); console.log(j);
Number.fixed(2); 自带四舍五入技能
var n = new Number( 12.345 ); var n1 = n.toFixed(2); // 12.35,固定两位小数,第三位小数四舍五入 console.log( n1 ); var x = new Number( 12.3 ); var n2 = x.toFixed(2); // 12.30,固定两位小数,位数不够,0来补齐 console.log( n2 );
对字符串执行模式匹配的强大工具
var reg1 = /^\d{3,6}$/; // 匹配纯数字3-6个 var reg2 = new RegExp(“^\\d{3,6}$");
正则表达式手册
// 方式1 var age = "18"; // 判断:1-3位纯数字 var reg = /^\d{1,3}$/; // 以/^开始,中间写正则内容,以$/结束 var b = reg.test(age); // 验证age变量的是否符合reg的匹配 if (b == true) { console.log("验证通过!"); } else { console.log("格式错误"); } // 方式2 var name = "abc123"; // 大小写字母和数字的组合(特殊字符不能出现), 5~8位 var reg = new RegExp("^[a-zA-Z0-9]{5,8}$"); // 以^开始,中间写正则内容,以$结束 if (reg.test(name)) { console.log("验证通过!"); } else { console.log("格式错误"); }
var time = new Date(); console.log( time ); // Tue Jul 14 2020 11:09:46 GMT+0800 (中国标准时间) var year = time.getFullYear(); // 年份 var month = time.getMonth() + 1; //月份从0开始,11结束,所以国内习惯要+1 var day = time.getDate(); // 几号 var hour = time.getHours(); // 几点 var mm = time.getMinutes(); // 分钟 var s = time.getSeconds(); //秒 var ms = time.getMilliseconds(); // 毫秒, 1000毫秒 = 1秒 var timestr = year+"年"+month+"月"+day+"号 "+hour+"点"+mm+"分"+s+"秒"+ms+"毫秒"; console.log( timestr );
function 函数名( 形参列表 ){ // 函数体 return 返回值; }
function qiuhe(a, b) { var he = a + b; console.log("两数之和:" + he); } qiuhe(3,4);
function qiuhe(a, b) { var he = a + b; return "两数之和:" + he; } var s = qiuhe(3,4); console.log( s );
在函数内部,调用参数列表的属性
function func(a,b,c){ console.log( arguments.length ); // 获得参数的个数 console.log( arguments[1] ); // 获得下标为1的参数 }
函数同样可以通过内置的 JavaScript 函数构造器(Function())定义
var myFunction = new Function("a", "b", "return a * b"); var x = myFunction(4, 3); console.log(x);
注: 上述函数以分号结尾,因为它是一个执行语句。
没有名称的函数
var fn = function(a, b) {// 没有名字的函数,应该用一个变量来接收 return a * 10 + b; }; console.log( fn(3, 4) );
console.log( isNaN( 123 ) ); // 数字,false console.log( isNaN( "hello" ) ); // 非数字,true console.log( isNaN( 4-1 ) ); // 数字,false console.log( isNaN( 123 ) ); // 数字,false console.log( isNaN( -10 ) ); // 数字,false console.log( isNaN( "123" ) ); // 数字,false console.log( isNaN( "1a23" ) ); // 非数字,true
var str = "1+3"; console.log( str ); // 1+3 , +会认定为一种字符符号而已,没有加法的作用 console.log( eval( str ) ); // 让字符串中的运算符号生效
var name = "排骨玉米汤"; console.log( "转码前:" + name ); name = encodeURI(name); console.log( "转码后:" + name ); name = decodeURI(name); console.log( "解码后:" + name );
1、闭包的概念:指有权访问另一个函数作用域中的变量的函数,一般情况就是在一个函数中包含另一个函数。
2、闭包的作用:访问函数内部变量、保持函数在环境中一直存在,不会被垃圾回收机制处理;
简单地说:就是在函数的局部范围内声明一个封闭的环境,此环境不会被垃圾回收探测到。保证了数据的安全唯一性
想了解闭包,首先要了解什么是全局变量,什么是局部变量
a = 10; // 全局变量,声明的时候可以不使用 var function test1(){ b = 20; // 不适用var声明的变量,就是全局变量 var c = 30; // 用var声明,并且在函数的内部。这样的变量叫做局部变量,有效范围只能 在其声明的函数内部 console.log(c); } function test2(){ console.log(c); //c is not defined (c变量没有定义) } test1(); test2();
需求:统计方法执行了多少次
var count = 0; // 总次数 function test1(){ count++; // 自增+1 } test1(); test1(); test1(); console.log( count );
谁都可以访问count,所以count变量并不安全,因为是全局变量。
如何才能安全呢?将count声明为局部变量
function test1(){ var count = 0; //局部变量 return count++; //外部无法访问count,只能通过return才能将count变量返回,并输出 } test1(); test1(); test1(); console.log( test1() ); // 每次调用方法,首先就是将变量还原为0
结果一直是0,因为每次调用test1(),方法体的第一句代码就是还原,无论曾经的值是多少。
突发奇想,如果在test1()函数里面,再嵌套一个函数,js是支持函数嵌套的
function test1(){ var count = 0; //局部变量 function jia(){ return count++; } jia(); return count; } test1(); test1(); test1(); console.log( test1() ); // 每次调用方法,首先就是将变量还原为0
如果每次只调用test1()里面的jia()就好了。ok,闭包帮你解决此问题!
function test1(){ var count = 0; //局部变量 function jia(){ return count+=1; } return jia; } var fn = test1(); // fn => function jia(){return count+=1; } fn(); fn(); console.log( fn() ); // 每次调用方法,首先就是将变量还原为0
闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不 受外界干扰。
直观的说就是形成一个不销毁的栈环境。
var b = confirm("确定删除吗?"); if(b){ document.write( "<h1>删除成功!</h1>" ); }else{ document.write( "<h1>你取消了操作</h1>" ); }
var name = prompt("请输入你的名字:"); document.write( "<h1>大名:"+name+"!</h1>" );
<html> <head> <meta charset="utf-8"> <title>DOM 教程</title> </head> <body> <h1>第一节:HTML DOM</h1> <p>Hello world!</p> </body> </html>
从上面的 HTML 中:
并且:
并且:
js为我们提供了很多种方法来实现在页面找查找某个元素节点
<body> <form action="xxx" onsubmit="return login()"> <p>帐号:<input id="username"/></p> <p>电话:<input id="phone"/></p> <p><button>登录</button></p> </form> <script> function login() { var name = document.getElementById("username").value ; if(name == ""){ alert("帐号不能为空!"); return false; // 阻止表单的提交 } return true; // 放行,让表单提交 } </script> </body>
<body> <h2>我的购物车</h2> <table border="1" cellspacing="0"> <tr> <td><input type="checkbox" onchange="quan(this)" /> 全选</td> <td>名称</td> <td>单价</td> </tr> <tr> <td><input type="checkbox" name="one" />1</td> <td>功能性饮料-尖叫</td> <td>4.0</td> </tr> <tr> <td><input type="checkbox" name="one" />2</td> <td>火腿肠</td> <td>2.0</td> </tr> <tr> <td><input type="checkbox" name="one" />3</td> <td>包子</td> <td>1.5</td> </tr> </table> <p><button>提交订单</button> </p> <script> function quan(all) { var arr = document.getElementsByName("one"); for (var i = 0; i < arr.length; i++) { arr[i].checked = all.checked; // 将全选框的状态,赋值给每一个复选框 } } </script> </body>
<body> <table border="1" cellspacing="0"> <tr> <td><input type="checkbox" onchange="quan(this)" /> 全选</td> <td>名称</td> <td>单价</td> </tr> <tr> <td><input type="checkbox" name="one" />1</td> <td>功能性饮料-尖叫</td> <td>4.0</td> </tr> <tr> <td><input type="checkbox" name="one" />2</td> <td>火腿肠</td> <td>2.0</td> </tr> <tr> <td><input type="checkbox" name="one" />3</td> <td>包子</td> <td>1.5</td> </tr> </table> <script> var rows = document.getElementsByTagName("tr"); //通过标签名获得元素对象 集合 for (var i = 0; i < rows.length; i++) { if(i % 2 == 1){ // 奇数 rows[i].style.backgroundColor = "pink"; } } </script> </body>
<body> <button onclick="test()">点我试试</button> <script> function test(){ document.getElementById("hello").innerHTML = "走哇,喝点去~!"; } </script> <h2 id="hello">你好!</h2> </body>
<body> <button onclick="chou()">你瞅啥</button> <script> function chou(){ document.getElementById("hello").style.color = "red"; document.getElementById("hello").style.fontFamily = "华文彩云"; } </script> <h2 id="hello">你好!</h2> </body>
<body> <button onclick="add()">添加</button> <div></div> <script> function add(){ var img = document.createElement("img"); // <img> img.setAttribute("src","../img/cat.gif"); // <img src="../img/cat.gif"> img.setAttribute("title","小猫咪"); // <img src="../img/cat.gif" title="小猫咪"> img.setAttribute("id","cat"); // <img src="../img/cat.gif" title="小猫咪" id="cat"> var divs = document.getElementsByTagName("div"); divs[0].appendChild(img); } </scrip>
<body> <button onclick="add()">添加</button> <button onclick="del()">删除</button> <div> </div> <script> function add(){ 。。。略。。。 } function del(){ var img = document.getElementById("cat"); img.parentNode.removeChild(img); // 必须通过父节点,才能删除子节点 } </script> </body>
<body> <button onclick="add()">添加</button> <button onclick="del()">删除</button> <button onclick="rep()">替换</button> <div> </div> <script> function add(){ 。。。略。。。 } function del(){ 。。。略。。。 } function rep(){ // img.setAttribute("src","../img/2.jpg"); var imgold = document.getElementById("cat"); // 通过修改元素的属性,做的替换 var imgnew = document.createElement("img"); imgnew.setAttribute("src","../img/1.jpg"); imgold.parentNode.replaceChild( imgnew, imgold ); } </script> </body>
js捕获某个动作而做出的反馈
HTML 事件的例子:
仅在 body 和 frameset 元素中有效。
<body onl oad="test()"> <script> function test() { document.write("哈哈哈哈"); } </script> </body>
仅在表单元素中有效。
<body> <script> function a() { console.log("获得焦点==被激活"); } function b() { console.log("失去焦点"); } </script> <form action=""> <p>帐号:<input onfocus="a()" onblur="b()" /></p> <p>密码:<input /></p> </form> </body>
<style> img{width: 30%; border: 5px solid white;} </style> <body> <img src="img/logo.png" onm ouseover="shang(this)" onm ouseout="xia(this)" onclick="dan()"> <img src="img/logo.png" onm ouseover="shang(this)" onm ouseout="xia(this)" ondblclick="shuang()"> <img src="img/logo.png" onm ouseover="shang(this)" onm ouseout="xia(this)" > <script> function dan(){ alert("点了一下"); } function shuang(){ alert("连续快读点两下"); } function shang(img){ img.style.border = "5px solid red"; } function xia(img){ img.style.border = "5px solid white"; } </script> </body>
<script> window.onkeydown = function(){ // event:事件源(按键) // console.log( "按键编码:"+event.keyCode ); if(event.keyCode == "13"){ // 回车键 alert("登录成功!"); } } window.onkeyup = function(){ console.log(event.keyCode); // 按住按键不松手是不会触发的。当松手时,按键回弹则 触发 } </script>
<style> #father { width: 200px; height: 200px; background: black; padding: 10px; } #child { width: 100px; height: 100px; background: greenyellow; } </style> <body> <div id="father"> <div id="child"></div> </div> <script> // 代码不重要,重要是知道这个事件发生,是正常现象 document.getElementById("father").addEventListener("click", function() { alert("父级元素的事件被触发:" + this.id); }); document.getElementById("child").addEventListener("click", function(e) { e.stopPropagation() //取消事件的冒泡机制 alert("子级元素的事件被触发:" + this.id); }); </script> </body>
先子,后父。事件的触发顺序自内向外,这就是事件冒泡;
<style> #father { width: 200px; height: 200px; background: black; padding: 10px; } #child { width: 100px; height: 100px; background: greenyellow; } </style> <body> <div id="father"> <div id="child"></div> </div> <script> document.getElementById("father").addEventListener("click",function(){ alert("父级:" + this.id); },true); document.getElementById("child").addEventListener("click",function(){ alert("子级:" + this.id); },true); </script> </body>
先父,后子。事件触发顺序变更为自外向内,这就是事件捕获;
var user = new Object(); user.name = "吕布"; user.age = 21; user.say = function(){ console.log("大家好,我叫:"+this.name+",我今年"+this.age+"岁了!"); } user.say(); var dog = new Object(); dog.nickname = "屎尿多"; dog.wang = function(){ console.log("我饿了,我要拆家了!"); } dog.wang();
function userinfo(name , age){ this.name = name; this.age = age; this.say = function(){ console.log("大家好,我叫:"+this.name+",我今年"+this.age+"岁了!"); } } var user = new userinfo("詹姆斯",35); user.say();
var user = { username : "孙悟空", age : 527, say : function(){ console.log("大家好,我叫:"+this.username+",我今年"+this.age+"岁了!"); } }; user.say();
<script> var json1 = { username: "吕布", age: 31 }; console.log("姓名:" + json1.username + ",年龄:" + json1.age + "岁"); // json数组 var josnarr = [{ name: "貂蝉", age: 18 }, { name: "小乔", age: 17 }]; console.log("貂蝉" + josnarr[0].age + "岁了"); console.log("小乔" + josnarr[1].age + "岁了"); // 复杂的json对象 var long = { name: "赵云", sex: "男", hobby: ["玉兰白龙驹", "龙胆亮银枪", "青釭剑"] }; console.log(long.name + "的主攻武器:" + long.hobby[1]); </script>
就是javascript对浏览器的一些常规操作的方法
<button onclick="kai()">极速入职</button> <script> function kai(){ window.open("http://www.baidu.com" , "百度一下" , "width=500,height=300,left=400"); //window.open("http://www.baidu.com" , "百度一下" , "fullscreen=yes"); // IE才 生效 } </script>
我想知道我的电脑屏幕多大?实际上,得到的就是分辨率
<body> <button onclick="kai()">求大小</button> </body> <script> function kai() { alert(window.screen.width + "|" + window.screen.height); } </script>
包含有关当前 URL 的信息,通常用来做页面跳转
<button onclick="test()">测试</button> <script> function test(){ console.log( "当前页面的URL路径地址:"+ location.href ); location.reload(); // 重新加载当前页面(刷新) location.href = "http://lagou.com"; // 跳转页面 } </script>
history对象会记录浏览器的痕迹
<a href="b.html">去b页面</a>
<button onclick="hui()">返回</button> <script> function hui(){ //history.go(-1); //上一级页面 history.back(); // 与go(-1)是等价的 } </script>
window.navigator 对象包含有关访问者浏览器的信息;
<script> var str = ""; str += "<p>浏览器的代号:"+ navigator.appCodeName +"</p>"; str += "<p>浏览器的名称:"+ navigator.appName+"</p>"; str += "<p>浏览器的版本:"+ navigator.appVersion+"</p>"; str += "<p>硬件平台:"+ navigator.platform+"</p>"; str += "<p>用户代理:"+ navigator.userAgent +"</p>"; str += "<p>启用Cookies:"+navigator.cookieEnabled+"</p>"; document.write(str); </script>
用起来和我们在java中map很相似,都是键值对的方式存数据
在关闭窗口或标签页之后将会删除这些数据
localStorage.setItem("name","curry");
localStorage.getItem("name");
localStorage.removeItem("name");
多样化操作
// 三种方式保存数据 localStorage["a"] = 1; localStorage.b = 2; localStorage.setItem("c",3); // 查看数据类型 console.log( typeof localStorage["a"] ) console.log( typeof localStorage["b"] ) console.log( typeof localStorage["c"] ) // 第一种方式读取 var a = localStorage.a; console.log(a); // 第二种方式读取 var b = localStorage["b"]; console.log(b); // 第三种方式读取 var c = localStorage.getItem("c"); console.log(c);
会话,就是保持浏览器别关闭。
关闭浏览就等于结束了一次会话。
开启浏览器就意味着创建了一次会话。
sessionStorage.setItem("name", "klay");
var lastname = sessionStorage.getItem("name");
sessionStorage.removeItem("name");
sessionStorage.clear();
案例:记录点击了几下按钮
<button onclick="dian()">点我</button> <h3 id="result"></h3> <script> function dian(){ if( sessionStorage.getItem("clickCount") ){ sessionStorage.setItem("clickCount", Number(sessionStorage.getItem("clickCount")) + 1); }else{ sessionStorage.setItem("clickCount", 1); } document.getElementById("result").innerHTML = "已经点击了"+ sessionStorage.getItem("clickCount") +"次!" } </script>
setInterval(1,2):周期性触发代码exp (常用)
1:执行语句
2:时间周期,单位为毫秒
<body> <h1 id="title">拉勾网:极速入职</h1> <script> var colors = ["red","blue","yellow","pink","orange","black"]; var i = 0; function bian(){ document.getElementById("title").style.color = colors[i++]; if(i == colors.length){ i = 0; // 颜色重新开始 } } setInterval(bian,100); // 每隔0.1秒,执行一次bian函数 </script> </body>
<body> <h1 id="title"></h1> <script> var colors = ["red","blue","yellow","pink","orange","black"]; var i = 0; function bian(){ document.getElementById("title").style.color = colors[i++]; if(i == colors.length){ i = 0; // 颜色重新开始 } } function time(){ var d = new Date(); var str = d.getFullYear()+"年"+(d.getMonth()+1)+"月"+d.getDate()+ "号 "+d.getHours()+"点"+d.getMinutes()+"分"+d.getSeconds()+"秒"; document.getElementById("title").innerHTML = str; } setInterval(bian,100); // 每隔1秒,执行一次变色函数bian setInterval(time,1000); // 每隔1秒,执行一次时间函数time </script> </body>
案例:模拟年会抽奖
<body> <img id="tu" src="../img/1.jpg" width="50%" /> <br/> <button onclick="begin()">开始</button> <button onclick="stop()">停止</button> <script> var arr = ["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg"]; function begin() { timer = setInterval(bian, 100); // 没有使用var,所以timer是全局变量 } function stop() { clearInterval(timer); // 停止定时器 } function bian() { var i = Math.floor(Math.random() * arr.length); // 0-4 document.getElementById("tu").src = "../img/" + arr[i]; } </script> </body>
相当于延迟的效果,只执行一次
<script> function bian(){ document.body.style.backgroundColor = "red"; } //3秒之后调用 setTimeout(bian,3000); </script>