慕课网js进阶
接上面的js进阶部分课程笔记。
基本语法
变量命名
变量名字可以任意取,只不过取名字要遵循一些规则:
- 必须以字母、下划线或美元符号开头,后面可以跟字母、下划线、美元符号和数字。如下:
1 | 正确: |
变量声明
1 | var 变量名; |
1 | b > a && b < c //“&&”是并且的意思, 读法"b大于a"并且" b小于c " |
&&
是逻辑与操作符,只有 &&
两边值同时为真的时候,整个表达式值才为真。
操作符之间的优先级(高到低):
算术操作符 → 比较操作符 → 逻辑操作符 → “=”赋值符号
如果同级的运算是按从左到右次序进行, 多层括号由里向外。
数组
创建数组语法:
1 | var myarray = new Array(); |
我们创建数组的同时,还可以为数组指定长度,长度可任意指定。
1 | var myarray = new Array(8); //创建数组,存储8个数据。 |
创建数组并赋值
1 | var arr = new Array(); |
1 | var arr = new Array(1, 2, 3, 4); |
数组存储的数据可以是任何类型(数字、字符、布尔值等)
调用数组元素
1 | arr[i]; |
数组长度
1 | var arr = new Array(1, 2, 3, 4); |
改变数组长度
1 | arr.length = 10; |
二维数组
一维数组,我们看成一组盒子,每个盒子只能放一个内容。
1 | 一维数组的表示: myarray[]; |
二维数组,我们看成一组盒子,不过每个盒子里还可以放多个盒子。
1 | 二维数组的表示: myarray[][]; |
注意: 二维数组的两个维度的索引值也是从0开始,两个维度的最后一个索引值为(长度-1)。
二维数组的定义
定义方法1
1 | var myarr = new Array(); //先声明一维 |
定义方法2
1 | var arr = [ |
编程练习
使用js,把下面数组
var arr = [‘‘, ‘##’, “*”, “&&”, “**“, “##“];
arr[7] = “**”;
在页面显示如下图所示的图案:
*
**
第一步:定义一个数组,存储要展示的图形。
1 | 提示: |
第二步:预想一下arr 数组的长度是多少?
1 | 提示: 使用alert弹出数组的长度,看看是否跟自己的答案一样。 |
第三步:将数组内容输出,完成达到的效果。
1 | 提示: 想在不同行显示不同数组内容,别忘记<br/>换行标签。 |
1 | var arr = ['*', '##', "***", "&&", "****", "##*"]; |
if语句
1 | if (condition) { |
if…else
1 | if (condition) { |
if…else嵌套
1 | if () { |
switch语句
1 | switch (表达式) { |
for
1 | for (初始化变量; 循环条件; 循环迭代) { |
while
1 | while (condition) { |
do…while
1 | do { |
好处:至少执行一次代码
break
在while、for、do…while、while循环中使用break语句退出当前循环,直接执行后面的代码。
1 | for (初始条件; 判断条件; 循环后条件值更新) { |
continue
作用:仅仅跳出本次循环,整个循环继续执行
1 | for (初始条件; 判断条件; 循环后条件值更新) { |
编程练习
在一个大学的编程选修课班里,我们得到了一组参加该班级的学生数据,分别是姓名、性别、年龄和年级,接下来呢,我们要利用JavaScript的知识挑出其中所有是大一的女生的的名字哦。
学生信息如下:
(‘小A’, ‘女’, 21, ‘大一’), (‘小B’, ‘男’, 23, ‘大三’),
(‘小C’, ‘男’, 24, ‘大四’), (‘小D’, ‘女’, 21, ‘大一’),
(‘小E’, ‘女’, 22, ‘大四’), (‘小F’, ‘男’, 21, ‘大一’),
(‘小G’, ‘女’, 22, ‘大二’), (‘小H’, ‘女’, 20, ‘大三’),
(‘小I’, ‘女’, 20, ‘大一’), (‘小J’, ‘男’, 20, ‘大三’)
第一步: 把这些数据组成一个数组,方便我们之后操作哦。
1 | 提示: 使用二维数组。 |
第二步: 筛选数据吧,首先找出都是大一的所有信息 ;
第三步: 最后再一次筛选上一步得到的数据,打印出都是女生的姓名 ;
1 | 提示: 可以用switch 或 if 语句进行筛选。 |
1 | var infos = [ |
函数
1 | function add(a, b) { |
add()调用
函数的定义
1 | function 函数名() { |
函数调用
1.script标签内调用
1 | <script type="text/javascript"> |
2.onclick调用
1 | <buttun onclick="func()"> |
有参数的函数
1 | function func(参数1, 参数2, 参数3,......) { |
有返回值的函数
1 | function add(x, y) { |
练习
使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数。
第一步: 编写代码完成一个函数的定义吧。
第二步: 我们来补充函数体中的控制语句,完成函数功能吧。
1 | 提示:再想一想,两个整数比较有三种情况,大于,等于或小于,所以我们需要控制语句判断(if...else if)。 |
第三步: 写好的函数,我们就可以任意调用函数了。通过函数调用实现两组数值中,返回较大值吧。
1 | function com(a, b) { |
事件
JavaScript 创建动态页面。事件是可以被 JavaScript 侦测到的行为。 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件。
比如说,当用户单击按钮或者提交表单数据时,就发生一个鼠标单击(onclick)事件,需要浏览器做出处理,返回给用户一个结果。
主要事件表:
onclick事件
1 | <script type="text/javascript"> |
onmouseover事件
onmouseout事件
onfocus事件
当网页中的对象获得聚点时,执行onfocus调用的程序就会被执行。
onblur失去焦点事件
onselect事件
onchange文本框内容改动事件
onload加载事件
事件会在页面加载完成后,立即发生,同时执行被调用的程序。
注意:
加载页面时,触发
onload
事件,事件写在<body>
标签内。此节的加载页面,可理解为打开一个新页面时。
如下代码, 当加载一个新页面时,弹出对话框“加载中,请稍等…”。
onunload卸载事件
当用户退出页面时(页面关闭、页面刷新等),触发onUnload事件,同时执行被调用的程序。
练习
使用JS完成一个简单的计算器功能。实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除。
提示:获取元素的值设置和获取方法为:例:赋值:document.getElementById(“id”).value = 1; 取值:var = document.getElementById(“id”).value;
任务
第一步: 创建构建运算函数count()。
第二步: 获取两个输入框中的值和获取选择框的值。
1 | 提示:document.getElementById( id名 ).value 获取或设置 id名的值。 |
第三步: 获取通过下拉框来选择的值来改变加减乘除的运算法则。
1 | 提示:使用switch判断运算法则。 |
第四步: 通过 = 按钮来调用创建的函数,得到结果。
注意: 使用parseInt()函数可解析一个字符串, 并返回一个整数。
对象
访问对象属性的语法:
1 | [objectName]. [propertyName] |
访问对象的方法:
1 | [objectName]. [methodName]() |
日期对象
1 | var time_now = new Date(); //获取当前电脑系统时间 |
我们最好使用下面介绍的“方法”来严格定义时间。
访问方法语法: [日期对象].[方法]
Date对象中处理时间和日期的常用方法:
getDay() 返回星期,返回的是0-6的数字,0 表示星期天。如果要返回相对应“星期”,通过数组完成,代码如下:
实例:
1 | var d = new Date(); // Wed Apr 01 2020 22:41:15 GMT+0800 (中国标准时间) |
String对象
toUpperCase(), toLowerCase()
1 | var str = 'sssssssssss'; |
charAt()
charAt() 方法可返回指定位置的字符。返回的字符是长度为 1 的字符串。
1 | var str = 'abcd'; |
作用同 str[index]
还可以使用它取字符串最后一个字符:
1 | var str = 'abcd'; |
indexOf()
用于返回指定子串首次出现的位置
1 | stringObject.indexOf('subString', startPosition); |
1 | var str = 'abcdaddb' |
若找不到符合条件的子串则返回-1
split()字符串分割
1 | stringObject.split(separator, howmany) |
参数 | 描述 |
---|---|
separator | 必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。 |
howmany | 可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。 |
注意:如果把空字符串 (“”) 用作 separator,那么 stringObject 中的每个字符之间都会被分割。
使用指定符号分割字符串,代码如下:
1 | var str = 'www.imooc.com' |
输出:
1 | ["www", "imooc", "com"] |
substring()提取俩下标之间的字符串
1 | stringObject.substring(startPosition, endPosition); |
如果 start 比 stop 大,那么该方法在提取子串之前会先交换这两个参数。
1 | var str = 'www.imooc.com' |
输出:
1 | ".im" |
substr()提取指定数目的字符
1 | stringObject.substr(startPos, length); |
Math()对象
1 | //直接调用,无需创建 |
Math 对象是一个固有的对象,无需创建实例,直接把 Math 作为对象使用就可以调用其所有属性和方法。这是它与Date, String对象的区别。
Math对象的属性(都是大写)
Math对象的方法(都是小写)
编写一个随机数生成器:随机生成一个0-100的随机整数。
1 | function random_int() { |
1 | random_int() |
ceil()向上取整
1 | Math.ceil(x) //x必须是一个数值,它返回的是大于或等于x,并且与x最接近的整数。 |
floor()向下取整
1 | Math.floor(x) //返回的是小于或等于x,并且与 x 最接近的整数。 |
四舍五入round()
1 | Math.round(x) //round() 方法可把一个数字四舍五入为最接近的整数。 |
random()随机数
1 | Math.random() //random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数。 |
Array数组对象
1 | //定义 |
数组方法:
concat()数组连接
concat() 方法用于连接两个或多个数组。此方法返回一个新数组,不改变原来的数组。
1 | arrayObject.concat(array1, array2, ..., arrayN); |
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
1 | var arr = [1, 2, 3, 4]; |
1 | [1, 2, 3, 4, 5, 6] |
1 | var arr = [1, 2, 3, 4] |
1 | [1, 2, 3, 4, 5, 6, 7] |
join()指定分隔符链接数组元素
join()方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。
1 | arrayObject.join('分隔符') //若省略则默认使用逗号 |
1 | var arr = [1, 2, 3, 4]; |
1 | '1-2-3-4' |
reverse()翻转数组元素
1 | arrayObject.reverse() |
1 | var arr = [1, 2, 3, 4]; |
1 | [4, 3, 2, 1] |
slice()选定元素
1 | //slice() 方法可从已有的数组中返回选定的元素。 |
该方法并不会修改数组,而是返回一个子数组。
注意:
可使用负值从数组的尾部选取元素。
- 如果 end 未被规定,那么 slice() 方法会选取从 start 到数组结尾的所有元素。
String.slice() 与 Array.slice() 相似。
数组排序sort()
sort()
会变改原数组,包括const数组。
1 | arrayObject.sort(函数方法) |
如果不指定<方法函数>,则按数组元素的unicode码顺序排列。
1 | var arr = [1, 23, 4, 14]; |
1 | [1, 14, 23, 4] |
window对象
window对象是BOM的核心,window对象指当前的浏览器窗口。
window对象方法:
js计时器
1 | 在JavaScript中,我们可以在设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行。 |
计时器方法:
setInterval()计时器
每隔一段时间执行代码
1 | setInterval(code, time); //time以毫秒计时 |
setInterval()
和 setTimeout()
会返回一个id用于clear。
参数说明:
代码:要调用的函数或要执行的代码串。
交互时间:周期性执行或调用表达式之间的时间间隔,以毫秒计(1s=1000ms)。
返回值:
一个可以传递给 clearInterval() 从而取消对”代码”的周期性执行的值。
调用函数格式(假设有一个clock()函数):
1 | setInterval("clock()", 1000); |
我们设置一个计时器,每隔100毫秒调用clock()函数,并将时间显示出来,代码如下:
1 |
|
clearInterval()取消计时器
1 | clearInterval(idOfSetInterval); |
setTimeout()
在页面载入后一次性计时
1 | setTimeout(code, time); |
clearTimeout()
1 | clearTimeout(id_of_setTimeout); |
history对象
history对象记录了用户曾经浏览过的页面(URL),并可以实现浏览器前进与后退相似导航的功能。
1 | window.history. [属性 / 方法] //window可以不写 |
History 对象属性
History 对象方法
使用length属性,当前窗口的浏览历史总长度,代码如下:
1 | <script type="text/javascript"> |
1 | //后退 |
1 | //前进 |
1 | //指定打开一个历史页面 |
location对象
1 | location. [属性 / 方法] |
location用于获取或设置窗体的URL,并且可以用于解析URL。
location对象属性图示:
location 对象属性:
location 对象方法:
navigator对象
Navigator 对象包含有关浏览器的信息,通常用于检测浏览器与操作系统的版本。
对象属性:
查看浏览器的名称和版本,代码如下:
1 | <script type="text/javascript"> |
userAgent
返回用户代理头的字符串表示(就是包括浏览器版本信息等的字符串)
1 | navigator.userAgent |
使用userAgent判断使用的是什么浏览器(假设使用的是IE8浏览器), 代码如下:
1 | function judgeBrowser() { |
运行结果:
screen对象
1 | window.screen.属性; |
对象属性:
1 | screen.availHeight |
DOM(文档对象模型)
文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法。DOM 将HTML文档呈现为带有元素、属性和文本的树结构(节点树)。
先来看看下面代码:
将HTML代码分解为DOM节点层次图:
HTML文档可以说由节点构成的集合,DOM节点有:
1. 元素节点:上图中 <html>
、 <body>
、 <p>
等都是元素节点,即标签。
2. 文本节点: 向用户展示的内容,如 <li>...</li>
中的JavaScript、DOM、CSS等文本。
3. 属性节点: 元素属性,如 <a>
标签的链接属性 href="http://www.imooc.com"
。
节点属性:
遍历节点树:
以上图ul为例,它的父级节点body, 它的子节点3个li, 它的兄弟结点h2、P。
DOM操作:
注意:前两个是document方法。
getElementsByName()方法
返回带有指定名称的节点对象的集合。
1 | document.getElementsByName(name); |
name属性不唯一,可能返回多个元素组成的数组而不是一个元素
getElementsByTagName()方法
返回带有指定标签名的节点对象的集合。返回元素的顺序是它们在文档中的顺序。
1 | document.getElementsByTagName(tagname) |
说明:
Tagname是标签的名称,如p、a、img等标签名。
和数组类似也有length属性,可以和访问数组一样的方法来访问,所以从0开始。
看看下面代码,通过getElementsByTagName()获取节点。
getElementById, getElementsByName和getElementsByTagName的区别
以人来举例说明,人有能标识身份的身份证,有姓名,有类别(大人、小孩、老人)等。
ID 是一个人的身份证号码,是唯一的。所以通过getElementById获取的是指定的一个人。
Name 是他的名字,可以重复。所以通过getElementsByName获取名字相同的人集合。
TagName可看似某类,getElementsByTagName获取相同类的人集合。如获取小孩这类人,getElementsByTagName(“小孩”)。
把上面的例子转换到HTML中,如下:
1 | <input type="checkbox" name="hobby" id="hobby1"> 音乐 |
input标签就像人的类别。
name属性就像人的姓名。
id属性就像人的身份证。
方法总结如下:
注意:方法区分大小写
通过下面的例子(6个name=”hobby”的复选项,两个按钮)来区分三种方法的不同:
1 | <input type="checkbox" name="hobby" id="hobby1"> 音乐 |
document.getElementsByTagName(“input”),结果为获取所有标签为input的元素,共8个。
document.getElementsByName(“hobby”),结果为获取属性name=”hobby”的元素,共6个。
document.getElementById(“hobby6”),结果为获取属性id=”hobby6”的元素,只有一个,”跑步”这个复选项。
getAttribute()方法
1 | elementNode.getAttribute(name); |
说明:
elementNode:使用getElementById()、getElementsByTagName()等方法,获取到的元素节点。
name:要想查询的元素节点的属性名字
看看下面的代码,获取h1标签的属性值:
运行结果:
h1标签的ID :alink
h1标签的title :getAttribute()获取标签的属值
setArrribute()方法
setAttribute() 方法增加一个指定名称和值的新属性,或者把一个现有的属性设定为指定的值。
语法:
1 | elementNode.setAttribute(name,value) |
说明:
1.name: 要设置的属性名。
2.value: 要设置的属性值。
注意:
把指定的属性设置为指定的值。如果不存在具有指定名称的属性,该方法将创建一个新属性。
类似于getAttribute()方法,setAttribute()方法只能通过元素节点对象调用的函数。
节点属性
在文档对象模型 (DOM) 中,每个节点都是一个对象。DOM 节点有三个重要的属性 :
nodeName : 节点的名称
nodeValue :节点的值
nodeType :节点的类型
一、nodeName 属性: 节点的名称,是只读的。
- 元素节点的 nodeName 与标签名相同
- 属性节点的 nodeName 是属性的名称
- 文本节点的 nodeName 永远是 #text
- 文档节点的 nodeName 永远是 #document
二、nodeValue 属性:节点的值
- 元素节点的 nodeValue 是 undefined 或 null
- 文本节点的 nodeValue 是文本自身
- 属性节点的 nodeValue 是属性的值
三、nodeType 属性: 节点的类型,是只读的。以下常用的几种结点类型:
元素类型 节点类型
元素 1
属性 2
文本 3
注释 8
文档 9
访问子节点childNodes
访问旋顶元素节点下的所有子节点的列表,返回值为一个数组
1 | elementNode.childNodes |
访问子节点的第一项和最后一项
1 | //访问第一个子节点 |
1 | //访问最后一个子节点 |
访问父节点parentNode
1 | elementNode.parentNode |
访问兄弟节点
1 | nodeObject.nextSibling //右兄弟 |
插入节点appendChild()
1 | appendChild(newNode) |
插入节点insertBefore()
1 | insertBefore(newnode, node) |
删除节点removeChild()
1 | nodeObject.removeChild(node) |
替换元素节点replaceChild()
1 | node.replaceChild(newnode, oldnew) |
创建元素节点createElement
1 | document.creatElement(tagName) |
创建文本节点createTextNode
1 | document.createTextNode(data) |
浏览器窗口可视区域大小
获得浏览器窗口的尺寸(浏览器的视口,不包括工具栏和滚动条)的方法:
一、对于IE9+、Chrome、Firefox、Opera 以及 Safari:
• window.innerHeight - 浏览器窗口的内部高度
• window.innerWidth - 浏览器窗口的内部宽度
二、对于 Internet Explorer 8、7、6、5:
• document.documentElement.clientHeight表示HTML文档所在窗口的当前高度。
• document.documentElement.clientWidth表示HTML文档所在窗口的当前宽度。
或者
Document对象的body属性对应HTML文档的 <body>
标签
• document.body.clientHeight
• document.body.clientWidth
在不同浏览器都实用的 JavaScript 方案:
1 | var w = document.documentElement.clientWidth || |
网页尺寸scrollHeight和scrollWidth
获取网页内容高度和宽度
一、针对IE、Opera:
scrollHeight 是网页内容实际高度,可以小于 clientHeight。
二、针对NS、FF:
scrollHeight 是网页内容高度,不过最小值是 clientHeight。也就是说网页内容实际高度小于 clientHeight 时,scrollHeight 返回 clientHeight 。
三、浏览器兼容性
1 | var w=document.documentElement.scrollWidth |
注意: 区分大小写
scrollHeight和scrollWidth还可获取Dom元素中内容实际占用的高度和宽度。
网页尺寸offsetHeight
offsetHeight和offsetWidth,获取网页内容高度和宽度(包括滚动条等边线,会随窗口的显示大小改变)。
一、值
offsetHeight = clientHeight + 滚动条 + 边框。
二、浏览器兼容性
1 | var w = document.documentElement.offsetWidth || |
网页卷去的距离与偏移量
我们先来看看下面的图:
scrollLeft:设置或获取位于给定对象左边界与窗口中目前可见内容的最左端之间的距离 ,即左边灰色的内容。
scrollTop:设置或获取位于对象最顶端与窗口中可见内容的最顶端之间的距离 ,即上边灰色的内容。
offsetLeft:获取指定对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置 。
offsetTop:获取指定对象相对于版面或由 offsetParent 属性指定的父坐标的计算顶端位置 。
注意:
1. 区分大小写
2. offsetParent:布局中设置postion属性(Relative、Absolute、fixed)的父容器,从最近的父节点开始,一层层向上找,直到HTML的body。
编程挑战
现在利用之前我们学过的JavaScript知识,实现选项卡切换的效果。
效果图:
文字素材:
房产:
275万购昌平邻铁三居 总价20万买一居
200万内购五环三居 140万安家东三环
北京首现零首付楼盘 53万购东5环50平
京楼盘直降5000 中信府 公园楼王现房
家居:
40平出租屋大改造 美少女的混搭小窝
经典清新简欧爱家 90平老房焕发新生
新中式的酷色温情 66平撞色活泼家居
瓷砖就像选好老婆 卫生间烟道的设计
二手房:
通州豪华3居260万 二环稀缺2居250w甩
西3环通透2居290万 130万2居限量抢购
黄城根小学学区仅260万 121平70万抛!
独家别墅280万 苏州桥2居优惠价248万
任务
大家先思考和分析实现思路,然后在动手实现
一、HTML页面布局
1 | 提示: |
二、CSS样式制作
1 | 提示: |
三、JS实现选项卡切换
1 | 提示: |