Javascript知识点总结(二)

五、深入了解JSON

(一)初识

  • JSON是JavaScript Object Notation的缩写,它是一种数据交换格式
  • JSON基于文本,优于轻量,用于交换数据
  • JSON主要用于前后端交互时数据的传输,JSON简单易用,是ECMA的一个标准,几乎所有的编程语言都有解析JSON的库,所以我们可以放⼼大胆的在前后端交互里直接使用JSON
  • JSON跟XML的比较
    在可读性上面JSON是简易的写法,XML是规范的标签写法形式
    使用层面,由于JSON是我们ECMA的一个标准,所以在我们JS 上面使用有着天然的主场优势,对于存储我们JS的各种格式的数据都比XML有优势 轻量级是JSON最大的优势,在数据交换这一块轻量就代表着速度要比别人快

(二)JSON字符串、对象和数组

JSON的语法规定JSON字符串必须为双引号("")包着而不是单引号(’’),
同时JSON对象内的键也是必须为双引号("")包着而不是单引号 (’’)
实例

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
		<script type="text/javascript">
			//json对象
			var jsonObj={"name":"tim","age":28}
			console.log(jsonObj,typeof(jsonObj))

			//json数组
			var  jsonarr=[
				{"name":"tim","age":28},
				{"name":"tim","age":28},
			]
			console.log(jsonarr,typeof(jsonarr))

			//json字符串
			var jsonString='{"name":"tim","age":28}'
			console.log(jsonString,typeof(jsonString))
		</script>
</body>
</html>

(三)序列化和反序列化

  • 序列化 JSON.stringify()
    把js对象转JSON字符串
  • 反序列化 JSON.parse()
    把JSON字符串转js对象
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
		//序列化,js对象转换成json字符串
		var obj={'name':'tim','age':16}
		console.log(obj,typeof(obj))
		console.log(JSON.stringify(obj),typeof(JSON.stringify(obj)))

		//反序列化   json字符串转换成js对象
		console.log('********反序列化*********')
		var jsonString='{"name":"tim","age":18}'
		console.log(jsonString,typeof(jsonString))
		console.log(JSON.parse(jsonString),typeof(JSON.parse(jsonString)))
	</script>
</body>
</html>

(四)JSON的使用

实例

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
		<script type="text/javascript">
			//对于json对象的操作
			var obj={"name":"tim","age":18}
			// console.log(obj)
			//对象增加一个属性
			obj.height="180cm"		
			//删除一个属性  删除年龄
			delete obj.age
			//更改一个属性的值  把名字改成tom
			obj.name="tom"
			//查找名字是什么  obj.name
			console.log(obj.name)

			var  arr=[
				{"name":"tim","age":18},
				{"name":"tony","age":20},
				{"name":"jerry","age":23}
			]
			for(var i=0;i<arr.length;i++){
				console.log(arr[i])
			}
		</script>
</body>
</html>

(五)数组常见操作

实例1(操作元素)

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
		//创建数组
		var arr=["篮球","足球","乒乓球","羽毛球"]
		//删除数组第一个元素   返回值为被删除的元素
		// var first=arr.shift()
		// console.log(first)
		// console.log(arr)

		//删除数组最后一个元素  返回值为被删除的元素
		// var end=arr.pop()
		// console.log(end)
		// console.log(arr)

		//向我们的数组的第一个元素前面添加元素,返回添加后数组长度
		// var arrLength=arr.unshift('排球')
		// console.log(arrLength)
		// console.log(arr)

		//向我们数组最后一个元素后面添加元素,返回添加后数组长度
		var arrLength=arr.push("排球")
		console.log(arrLength)
		console.log(arr)
	</script>
</body>
</html>

实例2

  • concat() 合并两个或多个数组
    不会改变原有数组,返回一个合并完的数组
  • join(separator) 数组转字符串 可传入一个参数用于分隔元素
    separator可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符。
  • split(separator,howmany) 字符串转数组 可传入两个参数
    separator必选,实现方法为将字符串按某个字符切割成若干个字符串,并以数组形式返回
    howmany可选,该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。
  • reverse() 翻转数组 颠倒数组中元素的顺序
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
		//创建数组
		//合并数组,可合并两个或多个
		// var arr=["篮球"]
		// var arr1=["足球"]
		// var arr2=["乒乓球"]
		// console.log(arr.concat(arr1,arr2))
		// console.log(arr)
		//数组转字符串
		// var arr=["篮球","足球","乒乓球"]
		// console.log(arr.join(''))
		//字符串转数组
		// var string1="abcdecefg"
		// console.log(string1.split('c',3))
		//翻转数组,颠倒数组中元素的顺序
		var arr=[1,2,3,4,5]
		console.log(arr.reverse())
	</script>
</body>
</html>

实例3

  • sort(sortfun) 数组排序 可传入一个参数 直接改变原数组
    sortfun可选。规定排序顺序。必须是函数。不传即按照字符编码顺序排序。
  • slice(start,end) 返回数组中被选定的元素,不包含下标为end的元素 可传入两个参数
    start 必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1指最后一个元素,-2指倒数第二个元素,以此类推。
    end可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。
  • splice(index,howmany,x,y,z)可以对数组进行增加,删除,更改的操作。非常灵活。会返回
    被删除的项目index必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。 howmany必需。要删除的项目数量。如果设置为 0,则不会删除项目。
    x,y,z为可选项,为添加的新项目
  • indexOf(item,start)返回元素的索引,即下标,如果没有查找的 元素就返回-1
    item必须,查找的元素。
    start可选,整数,规定在数组中开始检索的位置,如不选则为 第⼀个开始检索
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
		// var arr=[1,3,5,4,2,6,7,7,9,11,8]

		//数组排序  有正向和反向(从大到小或从小到大) 不传参数就是按照字符编码排序
		//sort函数接收的参数也是一个函数,里面接收两个参数,
		// 返回第一个参数减第二个参数(a-b)即按照从小到大排序,
		// 返回第二个参数减第一个参数(b-a)即按照从大到小排序
		// console.log(arr.sort(function(a,b){
		// 	return  b-a
		// }))

		//选定数组里面指定下标的元素  slice
		// var a=arr.slice(6,8)
		// console.log(a)

		//可以对数组进行增删改的方法 splice
		// var arr=["篮球","足球"]
		// //利用splice方法增加
		// // arr.splice(0,0,"排球")
		// // console.log(arr)
		// //利用splice方法删除
		// // arr.splice(0,1)
		// // console.log(arr)
		// //利用splice方法进行更改元素
		// arr.splice(0,1,"排球","乒乓球")
		// console.log(arr)

		//查找元素索引,即下标  indexOf
		var arr=["篮球","足球","乒乓球","排球"]
		console.log(arr.indexOf("棒球"))
	</script>
</body>
</html>

六、定时器

实例1

  • 间隔型定时器 setInterval(fun,time)
    fun为执行的函数
    time为间隔执行的时间,单位为毫秒,每过time时间就执行一 次fun⾥⾯的代码
  • 延时型定时器器 setTimeout(fun,time)
    fun为执行的函数
    time为延时执⾏的时间,单位为毫秒,经过time时间后执行fun代码,只执行一次
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
		//延时型的定时器 setTimeout 只会执行一次
		// setTimeout(function(){
		// 	alert("我是延时三秒执行的弹窗")
		// },3000)
		//间隔型定时器  setInterval   每间隔time的时间就会执行一次
		setInterval(function(){
			console.log(1)
		},2000)

	</script>
</body>
</html>

实例2

  • clearInterval 清除间隔性定时器
  • clearTimeout 清除延时性定时器
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<script type="text/javascript">
		//清除定时器  
		//创建间隔性定时器
		var timer1=setInterval(function(){
			console.log("我是间隔型定时器")
			// clearTimeout(timer2)
		},1000)
		//创建延时性的定时器
		var timer2=setTimeout(function(){
			console.log("我是延时性定时器")
			clearInterval(timer1)
		},3000)
	</script>
</body>
</html>

实例3
利用延时性定时器器制作延时提示框
描述场景:当我们鼠标移入小div的时候,会有一个弹窗大div显示在隔壁,鼠标离开两个div的时候弹窗div延时消失

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#div1{
			float: left;
			width: 50px;
			height: 50px;
			background: red;
			margin-right: 30px;
		}
		#div2{
			float: left;
			width: 200px;
			height: 200px;
			background: black;
			display: none;
		}

	</style>
</head>
<body>
	<div id="div1"></div>
	<div id="div2"></div>
	<script type="text/javascript">

		window.onload=function(){
			var oDiv1=document.getElementById('div1')
			var oDiv2=document.getElementById('div2')
			var timer=null
			//给div1添加鼠标移入事件
			oDiv2.onmouseover=oDiv1.onmouseover=function(){
				//改变div2的display
				clearTimeout(timer)
				oDiv2.style.display='block'
			}
			//给div1添加鼠标移出事件
			oDiv2.onmouseout=oDiv1.onmouseout=function(){
				//改变div2的display
				timer=setTimeout(function(){
					oDiv2.style.display='none'
				},500)
			}

			//给div2添加鼠标移入事件
			// oDiv2.οnmοuseοver=function(){
			// 	//改变div2的display
			// 	clearTimeout(timer)
			// 	oDiv2.style.display='block'

			// }

			//给div2添加鼠标移出事件
			// oDiv2.οnmοuseοut=function(){
			// 	//改变div2的display
			// 	timer=setTimeout(function(){
			// 		oDiv2.style.display='none'
			// 	},500)
			// }

		}
	</script>
</body>
</html>

实例4(滚动图片展示)

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		*{margin:0;padding: 0;}
		#banner{
			position: relative;
			width: 600px;
			height: 150px;
			margin:100px auto;
			overflow: hidden;
		}
		#banner ul{
			position: absolute;
			left: 0;
			top:0;
		}
		#banner li{
			float: left;
			width: 200px;
			height: 150px;
			list-style: none;
		}
		#banner li img{
			width: 200px;
			height: 150px;
		}
	</style>
</head>
<body>
	<div id="banner">
		<ul>
			<li><img src="img/1.png"></li>
			<li><img src="img/2.png"></li>
			<li><img src="img/3.png"></li>
			<li><img src="img/4.png"></li>
			<li><img src="img/5.png"></li>
			<li><img src="img/6.png"></li>
		</ul>
	</div>
	<script type="text/javascript">
		window.onload=function(){
			var oDiv=document.getElementById('banner')
			var oUl=oDiv.getElementsByTagName('ul')[0]
			var oLi=oUl.getElementsByTagName('li')
			var timer=null
			//拼接多一份ul里面的内容 这两种写法相等
			// oUl.innerHTML=oUl.innerHTML+oUl.innerHTML
			oUl.innerHTML+=oUl.innerHTML
			//计算ul的宽度
			oUl.style.width=oLi[0].offsetWidth*oLi.length+'px'
			function moving(){
				if(oUl.offsetLeft<-oUl.offsetWidth/2){
					oUl.style.left='0'
				}
				oUl.style.left=oUl.offsetLeft-2+'px'
			}
			timer=setInterval(moving,30)
			oDiv.onmouseover=function(){
				clearInterval(timer)
			}
			oDiv.onmouseout=function(){
				timer=setInterval(moving,30)
			}
		}
	</script>
</body>
</html>

七、DOM操作

(一)DOM结点获取

  • DOM获取子节点
    • childNodes
      使用childNodes获取子节点的时候,childNodes返回的是子节点的集合,是一个数组的格式。他会把换行和空格也当成是节点信息。
    • children
      children不会返回文本节点,返回的是元素节点
  • DOM获取父节点
    • parentNode
      获取的是当前元素的直接父元素,是w3c的标准
    • parentElement
      获取的是当前元素的直接父元素,是ie的标准
    • offsetParent
      获取离当前节点最近的一个有定位的父节点或祖先节点,如果没有即为获取body
  • 判断节点的类型
    nodeType 1为元素节点 3为文本节点(即空格或换行,字符)
<!DOCTYPE html>
<html>
<head>
	<title></title>
	<style type="text/css">
		#bigdiv{
			position: relative;
		}
	</style>
</head>
<body>
	<div id="bigdiv">
		<div id="div1">
			<div>1111</div>
			<div>2222</div>
		</div>
	</div>
	<script type="text/javascript">
		var oDiv=document.getElementById('div1')
		//childNodes获取子节点会获取到文本节点和元素节点
		var div1=oDiv.childNodes
		console.log(oDiv.childNodes)
		//这种只获取元素节点,不会获取到文本节点 children
		console.log(oDiv.children)
		//获取父节点
		// console.log(oDiv.parentNode)
		// console.log(oDiv.parentElement)
		// console.log(oDiv.offsetParent)
		//判断节点类型  1是元素节点    3是文本节点
		console.log(div1[0].nodeType,'我是第一个,我是文本节点')
		console.log(div1[1].nodeType,'我是第二个,我是元素节点')
	</script>
</body>
</html>
  • 获取第一个子节点
    • firstChild有可能会匹配到是空白或换行的节点信息
    • firstElementChild 不会匹配空白或换行的节点信息(获取到的是元素节点,不会获取到文本节点)
  • 获取最后一个子节点
    • lastChild 有可能会匹配到是空⽩或换行的节点信息
    • lastElementChild 不会匹配空白或换行的节点信息(获取到的是元素节点,不会获取到文本节点)
  • 获取兄弟节点
    • previousSibling和previousElementSibling 获取上⼀个兄弟节点
      previousSibling 有可能会匹配到是空白或换⾏的节点信息
      previousElementSibling 不会匹配空白或换行的节点信息(获取到的是元素节点,不会获取到文本节点)
    • nextSibling和nextElementSibling 获取下一个兄弟节点
      nextSibling 有可能会匹配到是空白或换行的节点信息
      nextElementSibling 不会匹配空白或换行的节点信息(获取到的是元素节点,不会获取到文本节点)
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<div id="div1">
		<div>我是第一个</div>
		<div>我是第二个</div>
		<div id="three">我是第三个</div>
		<div>我是第四个</div>
		<div>我是第五个</div>
	</div>
	<script type="text/javascript">
		var oDiv=document.getElementById('div1')
		var three=document.getElementById('three')
		//获取第一个子节点
		// console.log(oDiv.firstChild)
		// console.log(oDiv.firstElementChild)
		//获取最后一个子节点
		// console.log(oDiv.lastElementChild)
		//获取上一个兄弟节点
		console.log(three.previousElementSibling)
		//获取下一个兄弟节点
		console.log(three.nextElementSibling)
	</script>
</body>
</html>

(二)元素操作

  • 第一种:oDiv.style.display=“block”;
  • 第二种:oDiv.style[“display”]=“block”;
  • 第三种:Dom方式
    • 获取:getAttribute(属性名称)
    • 设置:setAttribute(属性名称, 值)
    • 删除:removeAttribute(属性名称)
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<div id="div1" value="2">123</div>
	<script type="text/javascript">
		var oDiv=document.getElementById('div1')
		//第一种
		// oDiv.style.color='red'
		//第二种
		oDiv.style['color']='red'
		//第三种  dom的方式
		//获取属性
		console.log("我是改变前的id:"+oDiv.getAttribute('id'))
		console.log("我是改变前的value:"+oDiv.getAttribute('value'))
		//改变属性
		oDiv.setAttribute('id','tim')
		oDiv.setAttribute('value','100')

		console.log("我是改变后的id:"+oDiv.getAttribute('id'))
		console.log("我是改变后的value:"+oDiv.getAttribute('value'))
		//删除属性  removeAttribute
		oDiv.removeAttribute('value')
	</script>
</body>
</html>

(三)DOM节点的创建、插入和删除

  • 创建并添加DOM元素
    document.createElement(‘标签名’) 创建一个DOM节点
    appendChild(DOM节点) 为某个DOM添加一个子节点,在最后面添加
  • 插⼊入元素
    insertBefore(节点, 原有节点) 在已有元素前插入
  • 删除DOM元素
    removeChild(节点) 删除一个节点
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<ul id="ullist">
		<li>我是第一个</li>
		<li>我是第二个</li>
		<li>我是第三个</li>
		<li>我是第四个</li>
	</ul>
	<script type="text/javascript">
		var oUl=document.getElementById('ullist')
		var oLi=oUl.getElementsByTagName('li')
		//创建dom节点
		var li=document.createElement('li')
		li.innerHTML='我是新创建的li'
		// oUl.appendChild(li)
		//我们要在指定的位置插入新创建的li
		// oUl.insertBefore(li,oLi[2])

		//删除节点
		oUl.removeChild(oLi[3])
	</script>
</body>
</html>

(四)文档碎片

  • document.createDocumentFragment() 创建文档碎片节点(是一个虚拟的节点对象)
  • 文档碎片存在的意义就是减少页面渲染DOM的次数
  • 文档碎片可以提高DOM操作性能(理论上)
    现在的硬件已经足够强大了,不像以前的硬件水平了
<ul id="ul1"></ul>
//不使⽤⽂档碎片,每次插入li到ul都会造成页⾯重新渲染
var oUl=document.getElementById('ul1');
for(var i=0;i<100;i++){
	var oLi=document.createElement('li');
	oUl.appendChild(oLi);
}

//使⽤文档碎片,每次把li先插入虚拟的节点文档碎片节点,最后只插入一次即可,只会重新渲染一次⻚面
var oUl=document.getElementById('ul1');
var oFrag=document.createDocumentFragment(); for(var i=0;i<100;i++)
for(var i=0;i<100;i++){
	var oLi=document.createElement('li');
	oFrag.appendChild(oLi);
}
oUl.appendChild(oFrag);

(五)操作表格元素

  • 首先获取到我们的表格,暂时用table1代表整个表格
  • DOM来获取表头表尾、
    因为表头表尾只能存在一个,获取表头table1.tHead 获取表尾table1.tFoot
  • DOM获取表体即
    table1.tBodies获取到的是一个集合,因为可以存在多个tbody
  • 获取行数的集合,即需要获取表格对象里的tr行数的集合
    rows
  • 获取行⾥⾯单元格td的数量 是一个集合,所以获取内部第⼀个需要cells[0]获取
    cells
<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
	<table id="table1" border="1">
		<thead>
			<td>姓名</td>
			<td>年龄</td>
			<td>身高</td>
		</thead>
		<tbody>
			<tr>
				<td>张三</td>
				<td>18</td>
				<td>180cm</td>
			</tr>
			<tr>
				<td>李四</td>
				<td>19</td>
				<td>190cm</td>
			</tr>
			<tr>
				<td>王五</td>
				<td>20</td>
				<td>170cm</td>
			</tr>
		</tbody>
	</table>
	<script type="text/javascript">
		var table1=document.getElementById('table1')
		// alert(table1.getElementsByTagName('tbody')[0].getElementsByTagName('tr')[0].getElementsByTagName('td')[0].innerHTML)
		// alert(table1.tBodies[0].rows[0].cells[0].innerHTML)
		table1.tBodies[0].rows[0].cells[0].innerHTML='tim'
	</script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值