DOM

DOM 的全称是document object model 文档对象模型;

js中通过dom来对HTML文档进行操作,只要理解了dom就可以随心所欲的操作web了;

1.获取子元素对象及修改Html中内容:

	<body>
		<button id="btn">button</button>
		<button>button02</button>
		<input class="inputclass" type="radio" name="radio01" value="input-radio" />
		<script type="text/javascript">
//			"[object HTMLDocument]"  document其实也是html的一个元素节点,只不过浏览器啊已经将其转化成了对象document
//			console.log(document);
//			通过id找子元素对象
			var btn = document.getElementById("btn");
//			修改button的内部内容
			btn.innerHTML="I am a button";
			//			点击事件的回调函数
			btn.onclick=function(){
				alert("点击了");
			}

			//通过标签找对象,找出了同标签的所有对象;
			var btn02 =document.getElementsByTagName("button");
			console.log(btn02.length);//其实btn02是以数组,因为有两个button标签,长度为2;
			var btn03 = btn02[1];
			btn03.innerHTML="hhh";

//			通过name属性查找对象
			var radio = document.getElementsByName("radio01")[0];
			console.log(radio.name);//name属性
			console.log(radio.value);//value属性
			console.log(radio.className);//class属性;

		</script>
	</body>

2.给view设置点击事件的回调函数:

//			点击事件的回调函数
			btn.onclick=function(){
				alert("点击了");
			}

3.通过标签查找子标签对象;

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			window.onload=function(){
				var div = document.getElementById("div");
				//获取div下的所有子节点;
				var nodes  =  div.childNodes;
				// 结果是3;但是明明只有ul一个啊;其实childNodes把空白页算成一个节点了;
				console.log(nodes.length);

				//获取div下的所有的子标签;这个就不算空白了;
				var ch = div.children;
				console.log(ch.length);

				//firstChild是算空白的,所有有空格的话,第一child就是text;
				//同理lastChild也是一样的;
				var firstch = div.firstChild;
				alert(firstch);
			};
		</script>
	</head>
	<body>
		<div id="div">
			<ul>
				<li>北京</li>
				<li>上海</li>
				<li>广州</li>
				<li>深圳</li>
				<li>西安</li>
			</ul>
		</div>
	</body>
</html>

4.input的checkbox类型

设置选择checkbox的状态:

checkboxobjecl.checked=false|true;

 

5.Dom通过css选择器查找标签对象:

这个方法是很好用的,在ie8以上;

但是class属性有多个,满足条件的有多个,只会返回第一个;

var div = document.querySelector(.box div);

 

也可以全部返回符合条件的:返回一个数组;

var divs = document.querySelectorAll(.box);

查找class为box下的div标签;

 

6.添加,删除一个标签对象:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">
			window.onload=function(){
				//获取div对象;
				var div = document.getElementById("div");
				//回去div下面的ul对象;
				//第一种方式;
				var ul = div.firstElementChild;
				//第二种方式;这种方式只能获取div下面的第一个ul;
//				var ul2 = document.querySelector(".div ul");

				//创建一个li标签对象;
				var li = document.createElement("li");
				//创建一个文本节点;
//				var tn= document.createTextNode("中国");
				//在li中添加文本节点;
//				li.appendChild(tn);

				//当然也可以这么做,就不用创建文本节点了;
				li.innerHTML="美国";

				//在ul中末尾的添加一个li;
//				ul.appendChild(li);

				//在北极的前面添加了一个li;
				var firstli = ul.firstElementChild;
				ul.insertBefore(li,firstli);

				//删除某个节点;
				ul.removeChild(li);
			};
		</script>

	</head>
	<body>
		<div id="div">
			<ul>
				<li>北极</li>
				<li>南极</li>
				<li>冬季</li>
				<li>西吉</li>
			</ul>
		</div>
	</body>
</html>

 

7.获取标签的style

做了一点兼容性处理:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			#div{
				width: 100px;
				height: 100px;
				background-color: yellow;
			}
		</style>
		<script type="text/javascript">
			window.onload = function(){
				var div = document.getElementById("div");

				//div.style.width 获取的是内联样式中设置的属性宽;css中设置的是获取不到的;
//				console.log(div.style.width);

				//修改内联样式中的属性宽:因为内联样式权重比较高,所以可以覆盖css中样式;
				div.style.width="200px";

				//div.currentStyle 只要ie浏览器,并且在ie8以上才有这个api,其他浏览器没有这个方法;并且是只能读取不能修改;
//				console.log(div.currentStyle.width);

				//getComputedStyle(div,null);这个api是window的,只读不能修改;
				//这个api除了ie8以外,其他都支持的;
//				var sty = getComputedStyle(div,null);
//				console.log(sty.width);

//				所以这里要所兼容模式处理:
				var width = getSty(div,"width");
				console.log(width);

				//自定义了一个获取style的函数,兼容了ie和其他浏览器;
				function getSty(obj,name){
					if(window.getComputedStyle){
						return window.getComputedStyle(obj,null)[name];
					}else{
						return obj.currentStyle[name];
					}
				}
			};


		</script>
	</head>
	<body>
		<div id="div" style="width: 120px;">

		</div>
	</body>
</html>

 

8.获取元素的属性的其他方法:

1.div.clientWidth;

获取元素的可见宽度,就是盒子的真是大小,包括padding在内;不包含border;

2.div.offsetWidth;

获取元素的宽度,保活padding,border;

3.div.offsetParent;

获取距离元素最近的开启定位模式的祖先元素;如果都没有开启定位,那么会返回body;


9.event的获取和xy的获取

 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			#div1{
				width: 200px;
				height: 100px;
				border: 1px solid black;
			}
			#div2{
				width: 200px;
				height: 20px;
				border: 1px solid black;
			}
		</style>

		<script type="text/javascript">
			window.onload=function(){
				var div1 = document.getElementById("div1");
				var div2 = document.getElementById("div2");
				div1.onmousemove = function(event){
					//这里需要做兼容性:ie是将event放在了window中的;
					//其他浏览器是回调函数调用传进来的;
					if(!event){
						//当event没有传进来的时候,赋值window的event;
						event=window.event;
					}
					var x = event.clientX;
					var y = event.clientY;
					div2.innerHTML=x+","+y;
				};
			};
		</script>
	</head>
	<body>
		<div id="div1">

		</div>
		<div  id="div2">

		</div>
	</body>
</html>

clientx,y是相对于窗口的坐标;

pagex,y是相对于整个页面的坐标;但是在ie8中不支持;真恶心啊;

所以还是用clientx,y  ,在使用的时候要获取滚动条的滚动距离

让div跟随鼠标移动而移动案例:

		<script type="text/javascript">
			window.onload=function(){
				var div = document.getElementById("div1");
				div1.onmousemove = function(event){
					//这里需要做兼容性:ie是将event放在了window中的;
					//其他浏览器是回调函数调用传进来的;
					if(!event){
						//当event没有传进来的时候,赋值window的event;
						event=window.event;
					}
					var x = event.clientX;
					var y = event.clientY;


					var left = document.body.scrollLeft || document.documentElement.scrollLeft;
					var top = document.body.scrollTop || document.documentElement.scrollTop;
					div.style.left=x+left+"px";
					div.style.top=y+top+"px";
				};
			};
		</script>

 

10.事件冒泡:

javascript中的事件冒泡就和android中的事件处理方法一样,默认是向上传递的,只有在返回true的时候消费事件;

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			#div{
				width: 200px;
				height: 200px;
				background-color: yellow;
			}
			#span{
				background-color: red;
			}
		</style>
		<script type="text/javascript">
			window.onload = function(){
				var div =document.getElementById("div");
				var span =document.getElementById("span");
				var body = div.parentElement;

				//给这三个对象都设置点击事件,span的父亲是div,div的父亲是body
				//当你点击span的时候,事件冒泡到div,在到body,会触发三个点击事件;
				//类似于android的onEvnet事件处理方法一样的,不做任何处理会向上级父类返回;
				span.onclick=function(event){
					event = event||window.event;
					alert("我是span");
					//设置取消事件的冒泡;父亲就接受不到事件了
					event.cancelBubble=true;
				};

				div.onclick=function(){
					alert("我是div");
					//设置取消事件的冒泡;父亲就接受不到事件了
					event.cancelBubble=true;
				};

				body.onclick=function(){
					alert("我是body");
					//设置取消事件的冒泡;父亲就接受不到事件了
					event.cancelBubble=true;
				};
			};

		</script>
	</head>
	<body>
		<div id="div">
			我是div
			<span id="span">我是span</span>
		</div>
		我是body;
	</body>
</html>

 

11.事件的委派:

比如一个ul下面有很多个li,如果给每一li设置点击事件的话会很多,而且动态添加 li 标签的时候是不能设置点击事件的;

所以要使用到事件的委派,利用事件的冒泡机制将事件传递给上级父类;

所有将事件的点击绑定给ul,此时你点击li  事件会冒泡到ul中;通过event.target就可以获取到你点击的那个li对象;

ul.onclick = function(event){

       if( event.target.className == " li01" ){

             此时执行li01的事件响应处理;

     }

}

 

12.标签对象多事件的添加:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>

	</head>
	<body>
		<div id="div">
			woshi div
		</div>

		<script type="text/javascript">
			var div = document.getElementById("div");
			//普通的设置点击回到函数的时候,多次设置会覆盖;

			//addEventListener设置是不会覆盖的,但是没办法在ie8以下使用;
//			div.addEventListener("click",function(){
//				console.log("dianjil ");
//			},false);
//
			addEvent(div,"click",function(){
				console.log("dianjil ");
			});

			function addEvent(obj,fname,callback){
				if(obj.addEventListener){
					obj.addEventListener(fname,callback,false);
				}else{
					//这种方式可以兼容到ie8以下;
					obj.attachEvent("on"+fname,function(){
						//修改回调函数中的this,不修改的是window;
						callback.call(obj);
					});
				}
			}

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

12.键盘事件:

onkeydown    按住不松开,一直触发这个事件;

onkeyup

键盘事件一般是绑定给可以获取到焦点的组件;例如input,document;

document.onkeydown = function( event ){

         event= event || document.event;

         console.log(按下触发了);

         //获取按键的编码

//altkey   ctrlkey   shiftkey  判断这三个是否被按下了;

         if(event.keyCode==89  && event.altKey){

               console.log(y和alt同时按下触发了);

         }

};

document.onkeyup = function(){

          console.log(按键松开了);

};

在input中设置onkeydown属性:

input.onkeydown=function(){

event = event || window.event;

if(event.keyCode>=48 && event.keycode <=57){

//在input中输入数字返回false,取消键盘的输入行为,不能输入数字;

return false;

}

}

 

 

 

 

10-06 16:32