Web APIs:
特点:
作用:
JavaScript 中的全局函数:
Javascript的14个全局函数
(1)decodeURI()
参数:string
功能:对encodeURI()编码过的URI进行解码
(2)decodeURIComponent()
参数:string
功能:对encodeURIComponent()编码过的URI进行解码
(3)encodeURI()
参数:string
功能:字符串某些字符将被十六进制的转义序列进行替换
(4)encodeURIComponent()
参数:string
功能:可把字符串作为URI组件进行编码
(5)escape()
参数:string
功能:escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串
(6)unescape()
参数:string
功能:可以使用 unescape() 对 escape() 编码的字符串进行解码
(7)eval()
参数:string
功能:eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
(8)getClass()
参数:javaobj
功能:返回一个 JavaObject 的 JavaClass。
(9)isFinite()
参数:number
功能:检查其参数是否是无穷大
(10)isNaN()
参数:x
功能:用于检查其参数是否是非数字值
(11)Number()
参数:object
功能:把对象的值转换为数字
(12)parseInt()
参数:string(必写) radix(可选)表示要解析的数字的基数。该值介于 2 ~ 36 之间。如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。
功能:解析一个字符串,并返回一个整数
返回值:返回解析后的数字
(13)parseFloat()
参数:string
功能:可解析一个字符串,并返回一个浮点数。
parseFloat 是全局函数,不属于任何对象。
(14)String()
参数:object
功能:把对象的值转换为字符串
JavaScript 关键字:
break、else、new、var、case、finally、return、void、catch、for、switch、while、continue、function、this、with、default、if、throw、delete、in、try、do、instranceof、typeof。
<script type="text/javascript">
<script type="text/javascript"> alert("Hello"); console.log("Hello javascript") </script>
<script src="js/index.js" type="text/javascript"></script>
index.js 文件
function al(){ alert("提交成功"); console.log("提交成功!") }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <!-- 引用外部的文件 --> <script src="js/index.js" type="text/javascript"></script> </head> <body> <!-- 引用外部的文件 --> <input type="button" value="按钮" onclick="al()"> </body> </html>
<body> <input type="button" value="按钮" onclick="javaScript:alert('行内代码')"> </body>
标识符指变量、函数、属性的名字或函数的参数。
标识符可以是按照下列格式规则组合起来的一或多个字符:
变量的声明:
var 标识符=值;
<script type="text/javascript"> var a = 10; var b = true; console.log(a + b); </script>
JS 中的六大数据类型
1. 字符串型( String)
2. 数值型( Number)
3. 布尔型( Boolean)
4. null型( Null)
5. undefined型( Undefined)
6. 一种复杂数据类型(Object)。这5种之外的类型都称为Object
检测当前变量的数据类型, typeof 关键字
<script type="text/javascript"> var a = "aaa"; var b = 10; var c = false; console.log(typeof a); console.log(typeof b); console.log(typeof c); console.log(typeof null); console.log(typeof undefined); console.log(typeof { }); </script>
string js1.html:13 number js1.html:14 boolean js1.html:15 object js1.html:16 undefined js1.html:17 object
NaN:非数字类型
特点:
isNaN() 函数用于检查其参数是否是非数字值,若是则返回 false,若不是则返回 true
<script type="text/javascript"> var a = "aaa"; var b = 10; var c = false; // isNaN() 函数 console.log(isNaN(a)); //true console.log(isNaN(b)); //false console.log(isNaN(c)); //false </script>
将非数值转化为数值:
<script type="text/javascript"> var a = "aaa"; var b = 10; var c = "10.112"; console.log(Number(a)); //NaN console.log(Number(b)); //10 console.log(Number(c)); //10.112 console.log(parseInt(c)); //10 console.log(parseFloat(c)); //10.112 </script>
表示一个字符序列,即字符串,需要用" ’ " 或 " " " 引起来。
转义字符:
将其他数值转换为字符串的方式:toString() String() 拼串
<script type="text/javascript"> //将其他数值转换为字符串 var a = true; var b = 10; console.log(b.toString()); //10 console.log(String(a)); //true console.log(b + ""); //10 console.log(typeof(b + "")); //string </script>
length 属性获取字符串的长度
console.log((a + b).length);
也被称为逻辑值或真假值类型,只能取true 或 false。其他的数据类型可以通过 Boolean() 函数转换为布尔类型。
转换规则:
<script type="text/javascript"> // 布尔型 console.log(Boolean("aa")); //true console.log(Boolean("")); //false console.log(Boolean(1)); //true console.log(Boolean(0)); //false console.log(Boolean(NaN)); //false console.log(Boolean(undefined)); //false </script>
Underfined 类型只有一个值,即特殊的 underfined
对于声明但未初始化的变量,或者未声明的变量在使用 typeof 时,返回 underfined
js 是一门解释型语言,当其中一句出错时,不再执行后面的代码
<script type="text/javascript"> var s; console.log(typeof s); //undefined console.log(typeof b); //undefined </script>
<script type="text/javascript"> console.log(null == undefined); //true 两个等号,只比较值 console.log(null === undefined); //false 三个等号,比较类型和值 </script> </head>
js中对象是一组属性与方法的集合。这里就要说到引用类型了,引用类型是一种数据结构,用于将数据和功能组织在一起。引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。
var 函数名 = new Object(); 函数名.属性名1 = 属性1; 函数名.属性名2 = 属性2; //输出 console.log(函数名.属性名1 + 函数名.属性名2)
var 函数名 = { // 属性类型为字符串要加引号 属性名1 : "属性1", 属性名2 : 属性2 } // 输出 console.log(函数名.属性名1 + 函数名.属性名2)
实例:
语法一:
<script type="text/javascript"> var stu = new Object(); stu.name = "张三"; stu.age = 18; console.log(stu.name + "-" + stu.age); </script>
语法二:
<script type="text/javascript"> var stu = { name : "张三", age : 12 } console.log(stu.name + "-" + stu.age); </script>
数组的每一个位置都可以用来保存任何类型的数据,数组的大小是可以动态调整的。
<script type="text/javascript"> //数组的动态初始化 var arr = new Array(); arr[0] = 10; arr[1] = true; arr[2] = "abc"; arr[3] = null; for(var i = 0 ; i < arr.length ; i++){ console.log(arr[i]); } </script>
<script type="text/javascript"> //数组的静态初始化 var arr1 = ["java",1,true,null]; for(var i = 0 ; i < arr1.length ; i++){ console.log(arr1[i]); } </script>
格式:
function 函数名称(参数列表) 方法体; 若有返回值,retur返回;
实例:
// 函数的定义与使用,无返回值 <script type="text/javascript"> function sum(a,b){ var s = a + b; console.log(s); } // 调用函数 sum(1,2); </script>
//函数的定义与使用,有返回值 <script type="text/javascript"> function sum(a,b){ var s = a + b; return s; } // 调用函数 var su = sum(1,2); console.log(su); </script>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script type="text/javascript"> function sum(a,b){ var s = a + b; console.log(s); } </script> </head> <body> <!-- 通过按钮调用函数 --> <input type="button" value="求和" onclick="sum(1,3)"> </body> </html>
<!-- 将函数定义为一个 var 类型 --> <script type="text/javascript"> var sum = function(a,b){ return a + b; } // 调用函数 var s = sum(1,2); console.log(s); </script>
例题:
题目1: var a = 100; var b = a; a = 200; console.log (b);//100
a 为一个var类型,将a 的值赋值给 b ,所以 b 的结果为 100。
题目2: var a = {age : 20}; var b = a; b.age = 21; console.log (a.age);//21
a 为一个对象,将 a 指向 b 后,a 与 b 的指向的对象相同,所以改变 b 的值,a 也会发生变化。
console.log():将语句输出到浏览器控制台
alert():将内容作为警告框的形式弹出
decument.write():将内容写出到页面的body
null表示"没有对象",即该处不应该有值。典型用法是:
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:
Java中的语句:
js中的语句:
switch 语句和 java 中的一样。 注意 switch 所支持的数据类型。
js 支持所有 for 循环也和 java 中的一样,但是要注意定义变量时使用 var,不要写成 java 的 int。
关系运算符:
运算符 | 说明 |
---|---|
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
注:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script type="text/javascript"> var a = 10; var b = 3; document.write(a/b); //3.3333333 document.write("<br/>"); var c = true; document.write(a + c); //11 boolean与数字相加 document.write("<br/>"); var d = "a"; document.write(d + a); //a10 字符串+数字 document.write("<br/>"); document.write(d - a); //NaN 字符串-数字 document.write("<br/>"); var e = "b"; document.write(d - e); //NaN 字符串相减 document.write("<br/>"); document.write(d + e); //ab 字符串拼接 document.write("<br/>"); //比较==与=== var t = 11; var p = "11"; document.write(t == p); //true 比较内容是否相同 document.write("<br/>"); document.write(t === p); //false 先比较类型,若相同,再比较内容 document.write("<br/>"); //条件运算符 document.write(-1>0?1:-1); //-1 </script> </head> <body> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script type="text/javascript"> //警告框 alert("这是一个弹出框"); // 确认框 该确认框会有确定和取消按钮 当点击确定按钮 返回true 点击取消 返回false var c = confirm("你确定要删除吗?"); alert(c); //提问 var p = prompt("请输入成绩"); console.log(p); </script> </head> <body> </body> </html>
点击确定后即可关闭
方法:
<script type="text/javascript"> eval("x = 3;y = 5; alert(x + 5)"); eval("document.write(1 + 6)"); document.write(eval("1 + 1")); </script>
Math对象属性:Math对象的属性表示只读的数学常数
Math对象的方法
Math.round(0.1) // 0 Math.round(0.5) // 1 Math.round(-1.1) // -1 Math.round(-1.6) // -2
Math.floor(3.9) // 3 Math.floor(-3.2) // -4
Math.ceil(3.2) // 4 Math.ceil(-3.9) // -3
Math.random() // 0.7151307314634323
生成指定范围的随机数(min~max):
function getRandomNumber(min, max) { return Math.random() * (max - min) + min; } function getRandomIntNumber(min, max) { return Math.floor(Math.random() * (max - min + 1) + min);
Date对象是JavaScript提供的日期和时间的操作接口。
在JavaScript内部,所有日期和时间都储存为一个整数。
这个整数是当前时间距离1970年1月1日00:00:00的毫秒数,正负的范围为基准时间前后各1亿天。同Math对象一样,javascript也为 Date 对象提供了很多内置的方法。
Date()函数
Date(日期字符串|日期参数)构造函数
语法: var date1 = new Date(); var today = new Date(); // "Fri Nov 7 2014 14:52:00 GMT+0800 (中国标准时间)"
语法: var date2 = new Date("January 6, 2013"); // Sun Jan 06 2013 00:00:00 GMT+0800 (中国标准时间)
<script type="text/javascript"> document.write(new Date(2020,2,28)); </script>
new Date(datestring) new Date("2013-2-15") new Date('2013/2/15') new Date("2013-FEB-15") new Date("FEB, 15, 2013") new Date("FEB 15, 2013") new Date("Feberuary, 15, 2013") new Date("Feberuary 15, 2013") new Date("15, Feberuary, 2013") Sun Jan 06 2013 00:00:00 GMT+0800 (中国标准时间)
之前提到过,javascript内部存储日期类型的时候等于距离1970年1月1日零点的毫秒数。而显示给用户的时候是转换为字符串显示的。因此:
两个日期对象进行减法运算,返回的就是它们间隔的毫秒数。
两个日期对象进行加法运算,返回的就是连接后的两个字符串。
var d1 = new Date(2000, 2, 1); var d2 = new Date(2000, 3, 1); console.log(d2-d1);//2678400000 console.log(d2+d1);//Sat Apr 01 2000 00:00:00 GMT+0800 (中国标准时间)Wed Mar 01 2000 00:00:00 GMT+0800 (中国标准时间)
getTime():返回实例对象距离1970年1月1日00:00:00对应的毫秒数,等同于valueOf方法。 getDate():返回实例对象对应每个月的几号(从1开始)。 getDay():返回星期几,星期日为0,星期一为1,以此类推。 getYear():返回距离1900的年数。 getFullYear():返回四位的年份。 getMonth():返回月份(0表示1月,11表示12月)。 getHours():返回小时(0-23)。 getMilliseconds():返回毫秒(0-999)。 getMinutes():返回分钟(0-59)。 getSeconds():返回秒(0-59)。
进行日期的格式化:
var d = new Date(); document.write(d.getFullYear() + "-" + d.getMonth() + 1 + "-" + d.getDate() + " " + d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds());
方法:
构造函数的特点:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script type="text/javascript"> //方式一:使用object创建一个对象 var p1 = new Object(); p1.name = "Tom"; p1.age = 12; console.log(p1.name + " " + p1.age); //Tom 12 //方式二:通过对象的声明 var p2 = { name : "Mike", age : 15, say : function(){ console.log("Hello"); } } console.log(p2.name + " " + p2.age); // Mike 15 p2.say(); //Hello //方式三:工厂函数 function people(name,age,msg){ return{ name:name, age:age, say:function(){ console.log(msg); } } } //使用工厂函数创建对象 var p3 = people("aaa",11,"java"); var p4 = people("bbb",13,"python"); console.log(p3.name + " " + p3.age); //aaa 11 p3.say(); //java console.log(p4.name + " " + p4.age); //bbb 13 p4.say(); //python //方式四:使用构造函数 function student(name,age,msg){ this.name = name; this.age = age; this.say = function(){ console.log(msg); } } //使用构造函数创建对象 var p5 = new student("Jum",18,"Hello html"); console.log(p5.name + " " + p5.age); //Jum 18 p5.say(); //Hello html </script> </head> <body> </body> </html>
构造函数和实例函数的关系:
javascript为对象提供了一系列内置的方法,方便我们更好的操作对象。
//获取对象的所有属性 var k = Object.keys(p5); console.log(k); //["name", "age", "say"] //删除对象的一个属性 console.log(delete p5.age); //true console.log(Object.keys(p5)); //["name", "say"]
js中给函数提供了一个对象类型的属性,叫做prototype(原型)。
原型归函数所有,他不用创建,是默认存在的。
结构:原型是一个对象,在原型中通常拥有两个属性:
console.log(p5.__proto__);
原型链构成:
原型链的作用 : 访问对象的属性或方法的时候,首先在本身中查找是否拥有这个属性或方法。如果没有找到那么就沿着原型链向上逐级查找直到Object为止,在任何一级寻找到这个属性或方法都视为对象拥有这个属性或方法。
原型链的创建 : 原型链是依靠__proto___属性将对象和原型连接起来
原型说的是构造函数的prototype所对应的对象的构造函数的constructor属性;
原型链说的是对象的__proto__的属性,它获取到的是通过构造函数的prototype绑定的属性和默认的constructor属性
Object构造函数有prototype属性
s1.proto.proto.__proto__返回null 说明object对象没有__proto__属性
console.log(p5.__proto__); //构造函数 console.log(student.prototype); //object 的一个实例化对象 console.log(p5.__proto__.__proto__); //object console.log(p5.__proto__.__proto__.__proto__); //null console.log(Object.prototype); //object
<script type="text/javascript"> function show(f) { console.log(f.name); } function S(name){ this.name = name; } var son = new S("王五"); show(son); </script>
多个方法存在相同的属性和方法时,将相同的属性 和方法提取到一个公共的方法中,通过原型 prototype 或 call 或 apply 继承。
每一个对象都有一个 __ proto __ 指向它的原型,这里的原型可以理解为它的父类,在没有指定每一个对象的原型之前,该对象的原型默认为 Ojbject 的一个实例对象。
<script type="text/javascript"> function Person(name,age,sex){ this.name = name; this.age = age; this.sex = sex; this.show = function(){ console.log("name = " + name + " age = " + age + " sex = " + sex); } } //继承People的方法和属性 function Stu(name,age,sex,grade){ this.grade = grade; Person.apply(this,[name,age,sex]); } function Tea(name,age,sex,job){ this.job = job; Person.call(this,name,age,sex); } var stu1 = new Stu("李四",30,"女","一年级"); stu1.show(); console.log(stu1.grade) var tea1 = new Tea("张三",25,"男","教导主任"); console.log(tea1.name + " " + tea1.age + " " + tea1.sex + " " + tea1.job); M.prototype = new Person("赵六",22,"男"); function M(height){ this.height = height; } var m = new M(172); m.show(); console.log(m) </script>
JS 封装就是向要隐藏一些属性和方法时,将属性和方法封装起来,通过一个外部可调用的方法调用,其中私有变量用var,共有变量用this
<script type="text/javascript"> function student(name,age,sex){ this.name = name; var age = age; var sex = sex; this.show = function(){ console.log("age = " + age + " sex = " + sex); } } var s1 = new student("张三",18,"女"); console.log(s1.name); //张三 console.log(s1.age); //undefined console.log(s1.sex); //undefined s1.show(); //age = 18 sex = 女 </script>
ECMAScript部分 :
js的核心语法部分:
基础部分(变量 语句 数据类型 运算符 面向对象 原型 原型链)
WEBAPI:DOM + BOM
DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Object Model)。它的作用是将网页转为一个 JavaScript 对象,从而可以用脚本进行各种操作(比如增删内容)。
浏览器会根据 DOM 模型,将结构化文档(比如 HTML 和 XML)解析成一系列的节点,再由这些节点组成一个树状结构(DOM Tree)。所有的节点和最终的树状结构,都有规范的对外接口。
DOM 只是一个接口规范,可以用各种语言实现。所以严格地说,DOM 不是 JavaScript 语法的一部分,但是 DOM 操作是 JavaScript 最常见的任务,离开了 DOM,JavaScript 就无法控制网页。另一方面,JavaScript 也是最常用于 DOM 操作的语言。
OM 的最小组成单位叫做节点(node)。
文档的树形结构(DOM 树),就是由各种不同类型的节点组成。每个节点可以看作是文档树的一片叶子。
节点的类型有七种。
浏览器提供一个原生的节点对象Node,上面这七种节点都继承了Node,因此具有一些共同的属性和方法。
常用节点分为四类
<script type="text/javascript"> console.log(document.nodeName); console.log(document.nodeType); console.log(document.nodeValue); </script>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script type="text/javascript"> window.onload = function(){ var d = document.getElementById("d"); console.log(d.firstChild.nodeValue); console.log(d.getAttributeNode("id")); //获取属性节点 } </script> </head> <body> <div id="d"> 我是文本内容 </div> </body> </html>
返回节点的名称
console.log(d.nodeName);//返回标签名称并大写
<script type="text/javascript"> window.onload = function(){ console.log(d.nodeName); console.log(f.nodeName); } </script>
返回一个整数值,表示节点的类型。
节点名称 | 对应常量 |
---|---|
文档节点(document):9 | 对应常量Node.DOCUMENT_NODE |
元素节点(element):1 | 对应常量Node.ELEMENT_NODE |
属性节点(attr):2 | 对应常量Node.ATTRIBUTE_NODE |
文本节点(text):3 | 对应常量Node.TEXT_NODE |
文档片断节点(DocumentFragment):11 | 对应常量Node.DOCUMENT_FRAGMENT_NODE |
文档类型节点(DocumentType):10 | 对应常量Node.DOCUMENT_TYPE_NODE |
注释节点(Comment):8 | 对应常量Node.COMMENT_NODE |
nodeValue属性返回一个字符串,表示当前节点本身的文本值,该属性可读写。
只有文本节点(text)、注释节点(comment)和属性节点(attr)有文本值,因此这三类节点的nodeValue可以返回结果,其他类型的节点一律返回null。同样的,也只有这三类节点可以设置nodeValue属性的值,其他类型的节点设置无效
<script type="text/javascript"> window.onload = function(){ console.log(d.nodeType); //1 console.log(d.nodeType == Node.ELEMENT_NODE); //true 元素节点对应的常量 } </script>
返回当前节点和它的所有后代节点的文本内容
textContent属性自动忽略当前节点内部的 HTML 标签,返回所有文本内容。
该属性是可读写的,设置该属性的值,会用一个新的文本节点,替换所有原来的子节点。它还有一个好处,就是自动对 HTML 标签转义。这很适合用于用户提供的内容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script type="text/javascript"> window.onload = function(){ var a = document.getElementById("d"); console.log(a.textContent); } </script> </head> <body> <div id="d"> 我是文本内容 <span>今天天气很好</span> <div>今天是晴天</div> <a href="http://www.baidu.com">百度</a> </div> <p id="f"> 文本 </p> </body> </html>
是文档或浏览器窗口中发生的一些特定的交互瞬间。
JavaScript 与 HTML 之间的交互是通过事件实现的。
对于 Web 应用来说,有下面这些代表性的事件:点击某个元素、将鼠标移动至某个元素上方、 按下键盘上某个键等。
所有的选择器都是 document 对象的方法
在 html 中,所有的标签都具有 id 属性,且不能重复
document.getElementById("d")
<script type="text/javascript"> window.onload = function(){ // id选择器 var d = document.getElementById("d"); console.log(d); } </script> <body> <div id="d"> id 选择器的使用 </div> </body>
得到的结果是所有相同标签的元素组成的数组
document.getElementsByTagName("标签名");
<script type="text/javascript"> window.onload = function(){ // 标签名选择器 var divs = document.getElementsByTagName("div"); for(var i = 0 ; i < divs.length ; i++){ console.log(divs[i]); } } </script> <body> <div id="d"> id 选择器的使用 </div> <div> 今天天气很好 </div> </body>
html 中所有的元素都具有 name 属性,可以重复,得到的结果为一个数组
document.getElementsByName("name")
<script type="text/javascript"> window.onload = function(){ // name 获取元素 var divs = document.getElementsByName("a"); for(var i = 0 ; i < divs.length ; i++){ console.log(divs[i]); } } </script> <body> <div id="d" name="a"> id 选择器的使用 </div> <div name="a"> 今天天气很好 </div> </body>
所有元素都有 class 属性,class 属性用来绑定样式,可重复使用,结果为一个数组
document.getElementsByClassName("类名");
<script type="text/javascript"> window.onload = function(){ // name 获取元素 var divs = document.getElementsByClassName("red"); for(var i = 0 ; i < divs.length ; i++){ console.log(divs[i]); } } </script> <body> <div class="red"> id 选择器的使用 </div> <div name="a"> 今天天气很好 </div> </body>
querySelector和querySelectorAll的使用的区别:
掌握
<script type="text/javascript"> window.onload = function(){ var d1 = document.querySelector("#d1"); //使用 id 选择 console.log(d1); var divClass = document.querySelectorAll(".sty"); //使用类名选择 for(var i = 0 ; i < divClass.length ; i++){ console.log(divClass[i]); } } </script> <style> .sty{ font-size: 50px; } </style> </head> <body> <div id="d1"> id 选择器 </div> <div class="sty"> 类名选择器 </div> <div class="sty"> 我也是 </div> </body>
案例:点击按钮,切换图片
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script type="text/javascript"> window.onload = function(){ //选择a标签 var a = document.getElementById("btn"); console.log(a); // 定义一个值 var flag = true; //给a标签绑定事件 btn.onclick = function(){ if(flag){ // 改变 img 的 src 属性的值 document.getElementsByClassName("pic")[0].src = "images/b.jpg"; flag = false; }else{ document.getElementsByClassName("pic")[0].src = "images/a.jpg"; flag = true; } } } </script> </head> <body> <!-- 设置按钮 --> <a id="btn" href="javascript:void(0)">切换图片</a> <div> <img src="images/a.jpg" alt="" class="pic"> </div> </body> </html>
点击切换图片(按钮)即可切换
href、title、id、src、className(对应class属性)
innerHTML和innerText 区别
即 innerHTML 在获取值与设置值时,会对 html 文本进行编译与解析;innerText 则完全按照文本输出。注意字母大小写格式。
<script type="text/javascript"> window.onload = function(){ // name 获取元素 var divs = document.getElementsByTagName("div"); console.log(divs[0].innerHTML); console.log(divs[0].innerText); } </script> <body> <div> id 选择器的使用 <div> 子标签 </div> <a href="#">百度</a> </div> </body>
案例1:检验输入的用户名是否为3 ~ 6位,密码是否为6 ~ 8 位,若不满足将边框颜色设置为红色,并适当加粗。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script type="text/javascript"> window.onload = function(){ // 给按钮绑定点击事件 document.getElementById("confirm").onclick = function(){ // 检验输入的用户名是否为3 ~ 6位,密码是否为6 ~ 8 位, // 若不满足将边框颜色设置为红色,并适当加粗。 var user = document.getElementById("user").value; var psw = document.getElementById("psw").value; if(user.length < 3 || user.length > 6){ document.getElementById("user").style.border="3px solid red"; document.getElementById("usernamemsg").innerText = " 用户名的长度必须是3-6位"; }else{ //如果用户名格式正确,将格式还原,提示文字还原 document.getElementById("user").style.border=""; document.getElementById("usernamemsg").innerText = ""; } if(psw.length < 6 || psw.length > 8){ document.getElementById("psw").style.border="3px solid red"; document.getElementById("pswmsg").innerText = " 用户名的长度必须是6-8位"; }else{ //如果用户名格式正确,将格式还原,提示文字还原 document.getElementById("psw").style.border=""; document.getElementById("pswmsg").innerText = ""; } } } </script> </head> <body> <form action="javascript:void(0)"></form> 用户名:<input type="text" name="username" id="user"><span id="usernamemsg"></span><br/><br/> 密 码:<input type="password" name="password" id="psw"><span id="pswmsg"></span> <br><br/> <input type="button" value="确认" id="confirm"> </body> </html>
案例2:全选与反选
这里是引用
使用 style 设置的样式显示在标签行
修改标签的 className 属性相当于直接修改标签的类名
// 修改className属性 选择到的元素.className = "新的className"
document.write() document.write('新设置的内容<p>标签也可以生成</p>'); innerHTML var box = document.getElementById('box'); box.innerHTML = '新内容<p>新标签</p>'; document.createElement() var div = document.createElement('div'); document.body.appendChild(div);
性能问题
childNodes和children的区别:
JavaScript 是浏览器的内置脚本语言。也就是说,浏览器内置了 JavaScript 引擎,并且提供各种接口,让 JavaScript 脚本可以控制浏览器的各种功能。一旦网页内嵌了 JavaScript 脚本,浏览器加载网页,就会去执行脚本,从而达到操作浏览器的目的,实现网页的各种动态效果。
<script>元素内部可以直接写入 JavaScript 代码。
<script> var x = 1 + 5; console.log(x); </script>
<script>标签也可以指定加载外部的脚本文件。
<script>src="https://www.example.com/script.js"></script>
如果脚本文件使用了非英语字符,还应该注明字符的编码。
<script charset="utf-8" src="https://www.example.com/script.js"></script>
所加载的脚本必须是纯的 JavaScript 代码,不能有HTML代码和<script>标签。
加载外部脚本和直接添加代码块,这两种方法不能混用。下面代码的console.log语句直接被忽略。
<script charset="utf-8" src="example.js"> console.log('Hello World!'); </script>
网页元素的事件属性(比如onclick和onmouseover),可以写入 JavaScript 代码。当指定事件发生时,就会调用这些代码。
<button id="myBtn" onclick="console.log(this.id)">点击</button>
上面的事件属性代码只有一个语句。如果有多个语句,使用分号分隔即可。
URL 支持 javascript: 协议,即在 URL 的位置写入代码,使用这个 URL 的时候就会执行 JavaScript 代码。
<a href="javascript:console.log('Hello')">点击</a>
如果 JavaScript 代码返回一个字符串,浏览器就会新建一个文档,展示这个字符串的内容,原有文档的内容都会消失。
<a href="javascript: new Date().toLocaleTimeString();">点击</a
上面代码中,用户点击链接以后,会打开一个新文档,里面有当前时间。
如果返回的不是字符串,那么浏览器不会新建文档,也不会跳转。
<a href="javascript: void new Date().toLocaleTimeString();">点击</a> <a href="javascript: new Date().toLocaleTimeString();void 0;">点击</a>
为了解决脚本文件下载阻塞网页渲染的问题,一个方法是对 <script> 元素加入 defer 属性。它的作用是延迟脚本的执行,等到 DOM 加载生成后,再执行脚本。
<script src="a.js" defer></script> <script src="b.js" defer></script>
上面代码中,只有等到 DOM 加载完成后,才会执行 a.js 和 b.js。
defer属性的运行流程如下:
解决“阻塞效应”的另一个方法是对
<script src="a.js" async></script> <script src="b.js" async></script>
async 属性的作用是,使用另一个进程下载脚本,下载时不会阻塞渲染。
运行流程:
浏览器的核心是两部分:渲染引擎和 JavaScript 解释器(又称 JavaScript 引擎)。
作用:将网页代码渲染为用户视觉可以感知的平面文档
不同的浏览器有不同的渲染引擎:
渲染引擎处理网页,通常分成四个阶段:
主要作用:读取网页中的 JavaScript 代码,对其处理后运行。
JavaScript 是一种解释型语言,也就是说,它不需要编译,由解释器实时运行。
这样的好处是运行和修改都比较方便,刷新页面就可以重新解释;缺点是每次运行都要调用解释器,系统开销较大,运行速度慢于编译型语言。
为了提高运行速度,目前的浏览器都将 JavaScript 进行一定程度的编译,生成类似字节码(bytecode)的中间代码,以提高运行速度。
逐行解释将字节码转为机器码,是很低效的。为了提高运行速度,现代浏览器改为采用“即时编译”(Just In Time compiler,缩写 JIT),即字节码只在运行时编译,用到哪一行就编译哪一行,并且把编译结果缓存(inline cache)。
通常,一个程序被经常用到的,只是其中一小部分代码,有了缓存的编译结果,整个程序的运行速度就会显著提升。
字节码不能直接运行,而是运行在一个虚拟机(Virtual Machine)之上,一般也把虚拟机称为 JavaScript 引擎。
并非所有的 JavaScript 虚拟机运行时都有字节码,有的 JavaScript 虚拟机基于源码,即只要有可能,就通过 JIT(just in time)编译器直接把源码编译成机器码运行,省略字节码步骤。这一点与其他采用虚拟机(比如 Java)的语言不尽相同。
这样做的目的,是为了尽可能地优化代码、提高性能。
目前最常见的一些 JavaScript 虚拟机:
浏览器里面,window对象(注意,w为小写)指当前的浏览器窗口。它也是当前页面的顶层对象,即最高一层的对象,所有其他对象都是它的下属。一个变量如果未声明,那么默认就是顶层对象的属性。
<script type="text/javascript"> a = 10;//变量未声明 但是可以直接使用 此时的变量就类似于 window.a = 20; console.log(a); </script>
<script type="text/javascript"> // 返回(当前可以看到的窗口)宽度,高度,可缩放 console.log(window.innerHeight + " " + window.innerWidth); // 返回宽度,高度 console.log(window.screenX + " " + window.screenY); </script>
组件属性返回浏览器的组件对象。这样的属性有下面几个:
<script type="text/javascript"> // 地址栏对象 console.log(window.locationbar.visible); // 菜单栏对象 console.log(window.menubar.visible); // 窗口的滚动条对象 console.log(window.scrollbars.visible); // 工具栏对象 console.log(window.toolbar.visible); </script>
全局对象属性指向一些浏览器原生的全局对象。
<script type="text/javascript"> console.log(window.location); console.log(window.navigator); console.log(window.Screen); </script>
window.alert()、window.prompt()、window.confirm()都是浏览器与用户互动的全局方法。它们会弹出不同的对话框,要求用户做出回应。注意,这三个方法弹出的对话框,都是浏览器统一规定的式样,无法定制。
<script type="text/javascript"> var input = window.prompt(); console.log(input); </script>
<script type="text/javascript"> var input = window.confirm("确定删除吗?") console.log(input); //返回一个false类型 </script>
window.open方法用于新建另一个浏览器窗口,类似于浏览器菜单的新建窗口选项。
它会返回新窗口的引用,如果无法新建窗口,则返回null。
var popup = window.open('somefile.html');
上面代码会让浏览器弹出一个新建窗口,网址是当前域名下的somefile.html。
open方法一共可以接受三个参数:window.open(url, windowName, [windowFeatures])
var popup = window.open( 'somepage.html', 'DefinitionsWindows', 'height=200,width=200,location=no,status=yes,resizable=yes,scrollbars=yes' );
<script type="text/javascript"> function op(){ window.open("yilanwang.html"); window.close("window.html") } </script> <body> <div> <input type="button" value="百度" onclick="op()"> </div> </body>
点击按钮即可打开新页面
<script type="text/javascript"> window.onload = function(){ var element = document.getElementsByClassName("p"); for(var i = 0 ; i < element.length ; i++){ console.log(element[i]); } } </script> <body> <div class="p"> <span>代码块</span> <p>aaa</p> </div> </body>
返回浏览器的 User Agent 字符串,表示浏览器的厂商和版本信息。
由于有种种缺点,现在一般不再通过它识别浏览器了,而是使用“功能识别”方法,即逐一测试当前浏览器是否支持要用到的 JavaScript 功能。
通过 userAgent 可以大致准确地识别手机浏览器,方法就是测试是否包含mobi字符串。
var ua = navigator.userAgent.toLowerCase(); if (/mobi/i.test(ua)) { console.log("手机浏览器") } else { console.log("PC浏览器") }
返回一个类似数组的对象,成员是 Plugin 实例对象,表示浏览器安装的插件,比如 Flash、ActiveX 等。
<script type="text/javascript"> var pluginsLength = navigator.plugins.length; for (var i = 0; i < pluginsLength; i++) { console.log(navigator.plugins[i].name); console.log(navigator.plugins[i].filename); console.log(navigator.plugins[i].description); console.log(navigator.plugins[i].version); console.log(""); } </script>
返回用户的操作系统信息,比如 MacIntel 、Win32、Linux x86_64等 。
<script type="text/javascript"> console.log(navigator.platform) </script>
返回一个布尔值,表示用户当前在线还是离线(浏览器断线)。
navigator.onLine // true
有时,浏览器可以连接局域网,但是局域网不能连通外网。这时,有的浏览器的 onLine 属性会返回true,所以不能认为只要为 true,用户就一定能访问互联网。不过,如果是false,可以断定用户一定离线。
用户变成在线会触发online事件,变成离线会触发offline事件,可以通过window.ononline和window.onoffline指定这两个事件的回调函数。
window.addEventListener('offline', function(e) { console.log('offline'); }); window.addEventListener('online', function(e) { console.log('online'); });
Navigator.language属性返回一个字符串,表示浏览器的首选语言。该属性只读。
navigator.language // zh-CN
Navigator.languages属性返回一个数组,表示用户可以接受的语言。Navigator.language总是这个数组的第一个成员。HTTP 请求头信息的 Accept-Language字段,就来自这个数组。
<script type="text/javascript"> console.log(navigator.languages) </script>
如果这个属性发生变化,就会在window对象上触发languagechange事件。
返回一个布尔值,表示浏览器的 Cookie 功能是否打开。
navigator.cookieEnabled // true
注意,这个属性反映的是浏览器总的特性,与是否储存某个具体的网站的 Cookie 无关。用户可以设置某个网站不得储存 Cookie,这时cookieEnabled返回的还是true
表示当前窗口所在的屏幕,提供显示设备的信息。window.screen属性指向这个对象。
<script type="text/javascript"> console.log(window.screen) </script>
对象的属性:
使用(通过检验不同的分辨库,将用户导向不同的网站):
if ((screen.width <= 800) && (screen.height <= 600)) { window.location.replace('small.html'); } else { window.location.replace('wide.html'); }