1、什么是 js JS: JavaScript -> java 脚本语言 JavaScript 是网景(Netscape)公司开发的一种基于客户端浏览器、面向(基于)对象、事件驱动式的网页脚本语言。
JS的特点:
基于客户端浏览器 : js的运行环境是浏览器,无需下载任何jar和插件,浏览器自带对js运行环境的支持
面向(基于)对象 : js是面向对象的语言 , 我们开发中对js代码的使用 对象.属性 对象.方法()
事件驱动式 : js是基于事件实现大多数功能的, 什么叫做事件,事件类似于css中的伪类的概念
脚本语言 : 脚本语言无需编译,可以直接被解释执行,所以源代码可以直接看到
2、js与用户的交互方式 交互方式: 1.警示框 语法:alert(message) 作用:弹出一个警示框,并给出提示信息
2.对话输入框 语法:result prompt(messsge , value) message:提示信息 value:输入框的默认值 result:返回值,就是用户在输入框输入的内容
注意: 1) 返回值是字符串,如果需要其他数据类型,需要强制类型转换 3) 函数定义了两个输入参数,但是根据需要传入需要的实参,不用的参数可以不传参
3.控制台输入(打印输出语句) 语法:console.log(msg) 作用:在控制台输出信息(可以是字符串,也可以是其他数据类型,包括对象) 注意:该方法一般用于调试程序
4.页面输出(在浏览器网页上打印) 语法:document.write(markup) 作用:向浏览器页面输出内容 注意:主要用于输出html代码字符串
上面将的交互方式都是函数(方法),在面向对象语言中方法一定属于某个对象,正确的调用方式是对象.方法()
在调用alert()或者prompt()函数的时候没有指定对象,是因为这些函数属于window对象
在js中,window对象方法成员可以省略window 类似于window.alert() –> alert()
3、js的组成 js的内容由3部分组成:
ECMAScript : 语法部分,类似于javaSE数组之前的内容,所以最近规范叫做ES6->ECMAScript 6
DOM : document object model 文档对象模型 , 让我们使用js代码去操作页面元素,实现动态添加,删除,修改,获取页面元素
BOM : 浏览器对象模型 , 让我们使用js代码去操作浏览器,上一页,下一页,修改地址栏直接访问页面,刷新页面等等
4、变量 学习一门语言,首先学习语法 语法中学习顺序: 变量 -> 数据类型 ->运算符 ->流程控制语句 ->对象
变量: 内存中划定一块区域,保存值,值可以变化,用来表示这块内存的量就是变量
4.1、JavaScript 的变量类型
数值类型: number (包含了java中的整数以及浮点数) 此类型用来表示整数和浮点数(小数)值。 比如: 数字 10、10.01、100 、 -100 等等都是 注意: 数值型除了常见的值之外还有一个特殊的值:NaN
字符串类型: string (字符串和字符) 此类型用来表示字符串。字符串可以由单引号(‘)或双引号(“)表示
对象类型: object
布尔类型: boolean
函数类型: function
判断数据类型的方式: typeof 运算符
4.2、JavaScript 里特殊的值 undefined 未定义,所有js变量未赋于初始值的时候,默认值都是undefined
null 空值
NAN 全称是:Not a Number。 非数字。非数值。
4.3、JS中定义变量格式 语法: 1. java 声明变量 : 数据类型 变量名 = 初始化值; 2.js 声明变量: var 变量名 = 初始化值;
注意:
变量可以声明的时候直接进行初始化,也可以先只声明,在使用前进行初始化
如果变量没有初始化,可以访问值,值是undefined(undefined:只声明没有初始化的状态)
js是弱类型语言,变量声明的时候无需指定数据类型,但是赋值的时候可以指定不同数据类型的值 原因: java声明变量的时候必须指定数据类型,js声明变量的时候,所有数据类型的内存大小都是2个字节
变量声明的时候没有指定数据类型,变量的数据类型一直在变化,所以数据类型就是最后一次赋值,值的类型
总结: java中变量一旦声明,值可以变化但是数据类型不可变,js中变量值和数据类型都是可变的
<!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > var i; i=12 ; i="abc" ; var a = 12 ; var b ="abc" ; alert (a*b); </script > </head > <body > </body > </html >
5、关系(比较)运算 等于: == 等于是简单的做字面值的比较 全等于: === 除了做字面值的比较之外,还会比较两个变量的数据类型
<!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > var a = "12" ; var b = 12 ; alert (a==b); alert (a===b); </script > </head > <body > </body > </html >
6、逻辑运算 且运算: && 或运算: || 取反运算: !
在JavaScript 语言中,所有的变量,都可以作为一个boolean类型的变量去使用。0、null、undefined、""(空串)都认为是false;
<!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > var a = 0 ; if (a){ alert ("0为真" ) }else { alert ("0为假" ) } var b = null ; if (b){ alert ("null为真" ) }else { alert ("null为假" ) } var c = undefined ; if (c){ alert ("undefined为真" ) }else { alert ("undefined为假" ) } var d = "" ; if (d){ alert ("空串为真" ) }else { alert ("空串为假" ) } var a = "abc" ; var b = true ; var d = false ; var c = null ; alert (a && b) alert (b && a) alert (a && d) alert (a && c) alert (a && d && c) alert (d || c) alert (c || d) alert (a || c) </script > </head > <body > </body > </html >
7、数组(重点) 7.1、数组定义方式 JS 中 数组的定义 格式: var 数组名 = [] // 空数组 var 数组名 = [1,’abc’,true]; // 定义数组同时赋值元素
<!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > var arr = [true ,1 ]; arr[0 ] = 12 ; arr[2 ] = "abc" ; alert (arr.length ) for (var i = 0 ;i<arr.length ;i++){ alert (arr[i]) } </script > </head > <body > </body > </html >
8、函数(重点) 8.1、函数的两种定义方式
第一种,可以使用function关键字来定义函数
使用的格式: function 函数名(形参列表){ 函数体 }
在JavaScript 语言中,如何定义带有返回值的函数? 只需要在函数体内直接使用 return 语句返回值即可
<!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function fun ( ){ alert ("无参函数fun()被调用了" ) } fun () function fun2 (a,b ){ alert ("有参函数fun2()被调用了" +"a=" +a+" b=" +b) } fun2 (12 ,"abc" ) function sum (sum1,sum2 ){ var result = sum1+sum2; return result; } alert (sum (130 ,20 )) </script > </head > <body > </body > </html >
第二种定义方式
使用格式: var 函数名 = function(形参列表){ 函数体 }
<!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > var fun = function ( ){ alert ("无参函数" ) } fun () var fun2 = function (a,b ){ alert ("有参函数a" +a+" b=" +b) } fun2 (200 ,300 ) var sum = function (sum1,sum2 ){ return sum1+sum2; } alert (sum (160 ,200 )) </script > </head > <body > </body > </html >
注:在Java中函数允许重载。但是在JS中函数的重载会直接覆盖掉上一次的定义
<!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function fun ( ) { alert ("无参函数fun()" ) } function fun (a, b ) { alert ("有参函数fun(a,b)" ) } fun () </script > </head > <body > </body > </html >
8.2、函数的 arguments 隐形参数(只在function函数内) 隐形参数:就是在function函数中不需要定义,但却可以直接用来获取所有参数的变量。
隐形参数特别像 java基础的可变长参数一样。 public void fun(Object …args); 可变长参数其实是一个数组
js中的隐性参数也跟 java的可变长参数一样,操作类似数组。
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8" > <title>Title</title> <script type="text/javascript" > function fun (a) { alert(arguments.length) alert(arguments[0 ]) alert(arguments[1 ]) alert(arguments[2 ]) alert("a=" +a) for (var i=0 ;i<arguments.length;i++){ alert(arguments[i]); } alert("无参函数fun()" ) } function sum (num1,num2) { var result = 0 ; for (var i=0 ;i<arguments.length;i++){ result += arguments[i]; } return result; } alert(sum(1 ,2 ,3 ,"abc" ,4 ,5 ,6 ,7 ,8 )); </script> </head> <body> </body> </html>
9、数值转换字符串 浏览器接收的数据和发送的数据都是字符串,所以经常需要将字符串转数值,数值转字符串
9.1、数值转字符串的实现方式:
隐式转换 使用运算符进行隐式转换
显示转换 使用String()构造函数进行显示转换
9.2、字符串转数值
隐式转换 使用运算符进行隐式转换
显示转换 使用Number()构造函数进行显示转换
以下值转换布尔
结果为
false、undefined 、null、0、 “”
false
true、 1、 “somestring”
true
其他数据类型转换为布尔:
!!运算符进行隐式转换
使用Boolean()构造方法进行显式转换
10、JS 中的自定义对象(扩展内容) 10.1、Object 形式的自定义对象 对象的定义: var 变量名= new Object(); // 对象实例(空对象) 变量名.属性名= 值; // 定义一个属性 变量名.函数名= function(){} // 定义一个函数
对象的访问: 变量名.属性/ 函数名();
<!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > var obj = new Object (); alert (typeof (obj)) obj.name ="张三" ; obj.age =18 ; obj.fun =function ( ){ alert ("姓名:" +this .name +"年龄:" +this .age ) } alert (obj.name ) obj.fun (); </script > </head > <body > </body > </html >
10.2、花括号形式的自定义对象 对象的定义: var 变量名 = { // 空对象 属性值: 值 //定义一个对象 属性值: 值 //定义一个对象 函数名: function //定义一个函数 };
对象的访问: 变量名.属性/ 函数名();
<!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > var obj = { name : "李四" , age : 18 , fun : function ( ){ alert ("姓名:" +this .name +" 年龄:" +this .age ) } } alert (obj.name ) obj.fun (); </script > </head > <body > </body > </html >
11、js 中的事件 11.1、什么是事件? 事件是电脑设备与页面进行交互的响应,称之为事件
常用的事件: onload 加载完成事件: 页面加载完成之后,常用于做页面 js 代码初始化操作 onclick 单击事件: 常用于按钮的点击响应操作 onblur 失去焦点事件: 常用于输入框失去焦点后验证其输入内容是否合法 onchange 内容发生改变事件: 常用于下拉输入框失去焦点后验证其输入内容是否合法 onsubmit 表单提交事件: 常用于表单提交前,验证所有表单项是否合法
事件的注册分为静态注册和动态注册两种:
什么是事件的注册(绑定)? 就是告诉浏览器,当事件响应后要执行哪些操作代码,叫事件注册或事件绑定。
静态注册事件: 通过html 标签的事件属性直接赋于事件响应后的代码,这种方式我们叫静态注册。
动态注册事件: 是指先通过js 代码得到标签的dom 对象,然后再通过dom 对象.事件名= function(){} 这种形式赋于事件响应后的代码,叫动态注册。
动态注册基本步骤: 1、获取标签对象 2、标签对象.事件名= fucntion(){}
11.2、onload 加载完成事件 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function onloadFun ( ){ alert ('静态注册onload事件,所有代码' ) } window .onload = function ( ){ alert ("动态注册的onload事件" ) } </script > </head > <body > </body > </html >
11.4、onclik 单击事件 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function onloadFun ( ){ alert ("静态注册onclick" ); } window .onload =function ( ){ var btnObj = document .getElementById ("btn01" ); btnObj.onclick = function ( ){ alert ("动态注册的onclick事件" ) } } </script > </head > <body > <button onclick ="onloadFun()" > 按钮1</button > <button id ="btn01" > 按钮2</button > </body > </html >
11.5、onblur 失去焦点事件 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function onblurFun ( ){ console .log ("静态注册失去焦点事件" ) } window .onblur = function ( ){ var passOjb = document .getElementById ("password" ) passOjb.onblur = function ( ){ console .log ("动态注册 onblur事件" ) } } </script > </head > <body > 用户名:<input type ="text" onblur ="onblurFun()" > <br /> 密码:<input id ="password" type ="password" > </body > </html >
11.6、onchange 内容发生改变事件 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function onchangeFun ( ) { alert ("女神已经改变" ) } window .onload = function ( ) { var selObj = document .getElementById ("sel" ) selObj.onchange = function ( ) { alert ("男神已经改变" ) } } </script > </head > <body > 请选择你心中的女神: <select onchange ="onchangeFun()" > <option > --女神--</option > <option > 芳芳</option > <option > 佳佳</option > <option > 红红</option > </select > <br /> 请选择你心中的男神: <select id ="sel" > <option > --男神--</option > <option > 德华</option > <option > 华仔</option > <option > 富城</option > </select > </body > </html >
11.7、onsubmit 表单提交事件 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function onsubmitFun ( ){ alert ("静态注册表单提交---发现不合法" ) return false ; } window .onload = function ( ){ var formo1Obj= document .getElementById ("form01" ) formo1Obj.onsubmit = function ( ){ alert ("静态注册表单提交---发现不合法" ) return false ; } } </script > </head > <body > <form action ="http://localhost:8080" method ="get" onsubmit ="return onsubmitFun()" > <input type ="submit" value ="静态注册" /> </form > <form action ="http://localhost:8080" id ="form01" > <input type ="submit" value ="动态注册" /> </form > </body > </html >
12、正则表达式 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > var patt = /^\w{5,12}$/ ; var str = "xhg168" ; alert (patt.test (str)) </script > </head > <body > </body > </html >
13、DOM 模型 DOM 全称是Document Object Model 文档对象模型 大白话,就是把文档中的标签,属性,文本,转换成为对象来管理。
13.1、Document 对象(重点)
13.2、Document 对象的理解: 第一点:Document 它管理了所有的HTML 文档内容。 第二点:document 它是一种树结构的文档,有层级关系。 第三点:它让我们把所有的标签都对象化。 第四点:我们可以通过document 访问所有的标签对象。
什么是对象化??
举例: 有一个人有年龄:18 岁,性别:女,名字:张某某 我们要把这个人的信息对象化怎么办!
Class Person { private int age; private String sex; private String name; }
那么html 标签要对象化怎么办?
<body > <div id ="div01" > div01</div > </body >
模拟对象化,相当于:
class Dom{ private String id; // id 属性 private String tagName; //表示标签名 private Dom parentNode; //父亲 private List<Dom> children; // 孩子结点 private String innerHTML; // 起始标签和结束标签中间的内容 }
13.3、Document 对象中的方法介绍(重点) document.getElementById(elementId) 通过标签的id 属性查找标签dom 对象,elementId 是标签的id 属性值
document.getElementsByName(elementName) 通过标签的name 属性查找标签dom 对象,elementName 标签的name 属性值
document.getElementsByTagName(tagname) 通过标签名查找标签dom 对象。tagname 是标签名
document.createElement( tagName) 方法,通过给定的标签名,创建一个标签对象。tagName 是要创建的标签名
注意: document 对象的三个查询方法,如果有id属性,如果有id 属性,优先使用getElementById 方法来进行查询 如果没有id 属性,则优先使用getElementsByName 方法来进行查询 如果id 属性和name 属性都没有最后再按标签名查getElementsByTagName 以上三个方法,一定要在页面加载完成之后执行,才能查询到标签对象。
1. document.getElementById 方法代码 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function onclickFun ( ) { var usernameObj = document .getElementById ("username" ); var userText = usernameObj.value ; var patt = /^\w{5,12}$/ ; var usernameSpanObj = document .getElementById ("usernameSpan" ); if (patt.test (userText)) { usernameSpanObj.innerHTML = "<img src=\"right.png\" width=\"18\" height=\"18\">" ; } else { usernameSpanObj.innerHTML = "<img src=\"wrong.png\" width=\"18\" height=\"18\">" ; } } </script > </head > <body > 用户名:<input type ="text" id ="username" value ="xhg" > <span style ="color: red" id ="usernameSpan" > 用户名不合法</span > <button onclick ="onclickFun()" > 校验</button > </body > </html >
2. document.getElementsByName 方法代码 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function checkAll ( ) { var hobbies = document .getElementsByName ("hobby" ); for (var i = 0 ; i < hobbies.length ; i++) { hobbies[i].checked = true ; } } function checkNo ( ) { var hobbies = document .getElementsByName ("hobby" ); for (var i = 0 ; i < hobbies.length ; i++) { hobbies[i].checked = false ; } } function checkReverse ( ) { var hobbies = document .getElementsByName ("hobby" ); for (var i = 0 ; i < hobbies.length ; i++) { hobbies[i].checked = !hobbies[i].checked ; } } </script > </head > <body > 兴趣爱好: <input type ="checkbox" name ="hobby" value ="cpp" checked ="checked" > C++ <input type ="checkbox" name ="hobby" value ="java" > Java <input type ="checkbox" name ="hobby" value ="js" > JavaScript <br /> <button onclick ="checkAll()" > 全选</button > <button onclick ="checkNo()" > 全不选</button > <button onclick ="checkReverse()" > 反选</button > </body > </html >
3. document.getElementsByTagName 方法代码 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > function checkAll ( ) { var inputs = document .getElementsByTagName ("input" ) for (var i = 0 ; i < inputs.length ; i++) { inputs[i].checked = true ; } } </script > </head > <body > 兴趣爱好: <input type ="checkbox" value ="cpp" checked ="checked" > C++ <input type ="checkbox" value ="java" > Java <input type ="checkbox" value ="js" > JavaScript <br /> <button onclick ="checkAll()" > 全选</button > </body > </html >
4. document.createElement 方法代码 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script type ="text/javascript" > window .onload = function ( ){ var divObj = document .createElement ("div" ); var textNodeObj = document .createTextNode ("哈哈😊" ); divObj.appendChild (textNodeObj); document .body .appendChild (divObj) } </script > </head > <body > </body > </html >
13.4、节点的常用属性和方法 节点就是标签对象
方法: 通过具体的元素节点调用
getElementsByTagName() 方法,获取当前节点的指定标签名孩子节点
appendChild( oChildNode ) 方法,可以添加一个子节点,oChildNode 是要添加的孩子节点
属性: childNodes 属性,获取当前节点的所有子节点
firstChild 属性,获取当前节点的第一个子节点
lastChild 属性,获取当前节点的最后一个子节点
parentNode 属性,获取当前节点的父节点
nextSibling 属性,获取当前节点的下一个节点
previousSibling 属性,获取当前节点的上一个节点
className 用于获取或设置标签的class 属性值
innerHTML 属性,表示获取/设置起始标签和结束标签中的内容
innerText 属性,表示获取/设置起始标签和结束标签中的文本
13.5、DOM 查询练习
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" > <title>dom查询</title> <link rel="stylesheet" type="text/css" href="style/css.css" /> <script type="text/javascript" > window.onload = function () { document.getElementById("btn01" ).onclick = function () { var bjObj = document.getElementById("bj" ); alert(bjObj.innerHTML) } var btn02Ele = document.getElementById("btn02" ); btn02Ele.onclick = function () { var lis = document.getElementsByTagName("li" ); alert(lis.length) }; var btn03Ele = document.getElementById("btn03" ); btn03Ele.onclick = function () { var gender = document.getElementsByName("gender" ); alert(gender.length) }; var btn04Ele = document.getElementById("btn04" ); btn04Ele.onclick = function () { var lis = document.getElementById("city" ).getElementsByTagName("li" ) alert(lis.length) }; var btn05Ele = document.getElementById("btn05" ); btn05Ele.onclick = function () { alert(document.getElementById("city" ).childNodes.length) }; var btn06Ele = document.getElementById("btn06" ); btn06Ele.onclick = function () { alert(document.getElementById("phone" ).firstChild.innerHTML) }; var btn07Ele = document.getElementById("btn07" ); btn07Ele.onclick = function () { var bjObj = document.getElementById("bj" ); alert(bjObj.parentNode.innerHTML) }; var btn08Ele = document.getElementById("btn08" ); btn08Ele.onclick = function () { alert(document.getElementById("android" ).previousSibling.innerHTML) }; var btn09Ele = document.getElementById("btn09" ); btn09Ele.onclick = function () { alert(document.getElementById("username" ).value) }; var btn10Ele = document.getElementById("btn10" ); btn10Ele.onclick = function () { document.getElementById("username" ).value = "哈喽!" }; var btn11Ele = document.getElementById("btn11" ); btn11Ele.onclick = function () { alert(document.getElementById("city" ).innerHTML) }; }; </script> </head> <body> <div id="total" > <div class="inner" > <p> 你喜欢哪个城市? </p> <ul id="city" > <li id="bj" >北京</li> <li>上海</li> <li>东京</li> <li>首尔</li> </ul> <br> <br> <p> 你喜欢哪款单机游戏? </p> <ul id="game" > <li id="rl" >红警</li> <li>实况</li> <li>极品飞车</li> <li>魔兽</li> </ul> <br/> <br/> <p> 你手机的操作系统是? </p> <ul id="phone" > <li>IOS</li> <li id="android" >Android</li> <li>Windows Phone</li> </ul> </div> <div class="inner" > gender: <input type="radio" name="gender" value="male" /> Male <input type="radio" name="gender" value="female" /> Female <br> <br> name: <input type="text" name="name" id="username" value="abcde" /> </div> </div> <div id="btnList" > <div> <button id="btn01" >查找#bj节点</button> </div> <div> <button id="btn02" >查找所有li节点</button> </div> <div> <button id="btn03" >查找name=gender的所有节点</button> </div> <div> <button id="btn04" >查找#city下所有li节点</button> </div> <div> <button id="btn05" >返回#city的所有子节点</button> </div> <div> <button id="btn06" >返回#phone的第一个子节点</button> </div> <div> <button id="btn07" >返回#bj的父节点</button> </div> <div> <button id="btn08" >返回#android的前一个兄弟节点</button> </div> <div> <button id="btn09" >返回#username的value属性值</button> </div> <div> <button id="btn10" >设置#username的value属性值</button> </div> <div> <button id="btn11" >返回#bj的文本值</button> </div> </div> </body> </html>