JavaScript BOM DOM 对象

browser object model
document onject model

BOM对象

window对象

所有浏览器都支持 window 对象。
概念上讲.一个html文档对应一个window对象.
功能上讲: 控制浏览器窗口的.
使用上讲: window对象不需要创建对象,直接使用即可.

Window 对象方法

  • alert() 显示带有一段消息和一个确认按钮的警告框。

  • confirm() 显示带有一段消息以及确认按钮和取消按钮的对话框。

  • prompt() 显示可提示用户输入的对话框。

  • open() 打开一个新的浏览器窗口或查找一个已命名的窗口。

  • close() 关闭浏览器窗口。

  • setInterval() 按照指定的周期(以毫秒计)来调用函数或计算表达式。

  • clearInterval() 取消由 setInterval() 设置的 timeout。

  • setTimeout() 在指定的毫秒数后调用函数或计算表达式。

  • clearTimeout() 取消由 setTimeout() 方法设置的 timeout。

  • scrollTo() 把内容滚动到指定的坐标。

//----------alert confirm prompt----------------------------
    //alert('aaa');
    
    
    /* var result = confirm("您确定要删除吗?");
    alert(result); */

    //prompt 参数1 : 提示信息.   参数2:输入框的默认值. 返回值是用户输入的内容.

    // var result = prompt("请输入一个数字!","haha");
    // alert(result);


    方法讲解:    
        //open方法 打开和一个新的窗口 并 进入指定网址.参数1 : 网址.
        //调用方式1
            //open("http://www.baidu.com");
        //参数1 什么都不填 就是打开一个新窗口.  参数2.填入新窗口的名字(一般可以不填). 参数3: 新打开窗口的参数.
            open('','','width=200,resizable=no,height=100'); // 新打开一个宽为200 高为100的窗口
        //close方法  将当前文档窗口关闭.
            //close();

setInterval,clearInterval

setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数

秒表练习

语法:<br>     setInterval(code,millisec)
其中,code为要调用的函数或要执行的代码串。millisec周期性执行或调用 code 之间的时间间隔,以毫秒计。
 <!--onfocus 获取光标事件  绑定了一个事件-->
    <input type="text" id="timer" onfocus="start()">
    <button onclick="stop()">stop</button>

    <script>

        //js 是事件驱动编程  由用户的行为触发
        function bar() {
            var current_time =new Date();
            var s_time=current_time.toLocaleString();
            var ele = document.getElementById("timer");//找到id=timer的标签

            //现在ele是一个对象了,有标签input的属性
            ele.value  = s_time;//input是通过value显示内容的额
        }

        var ID;
        function start() {
            if(ID == undefined){
                bar();
                ID = setInterval(bar,1000);  /*注意这里的bar是函数名,不能加括号 是通过ID获得函数的运行的*/
            }

        }

        function stop(){
            clearInterval(ID);
            ID  = undefined;/*清除ID 的之后就是undefined*/
        }
    </script>

DOM 对象

  • HTML Document Object Model(文档对象模型)
  • HTML DOM 定义了访问和操作HTML文档的标准方法
  • HTML DOM 把 HTML 文档呈现为带有元素、属性和文本的树结构(节点树)

DOM节点

节点类型

  • 整个文档是一个文档节点
  • 每个 HTML 标签是一个元素节点
  • 包含在 HTML 元素中的文本是文本节点
  • 每一个 HTML 属性是一个属性节点

节点关系

节点树中的节点彼此拥有层级关系。
(parent),(child)和同胞(sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。

  • 在节点树中,顶端节点被称为根(root)
  • 每个节点都有父节点、除了根(它没有父节点)
  • 一个节点可拥有任意数量的子
  • 同胞是拥有相同父节点的节点

节点查找

document是全局查找,是直接查找

涉及到寻找元素,注意script标签的位置!

document.getElementById(“idname”)  //获得是一个
document.getElementsByTagName(“tagname”)//获得是一个数组
document.getElementsByName(“name”)
document.getElementsByClassName(“name”)

应用

<div id="div1">

    <div class="div2">i am div2</div>
    <div name="yuan">i am div2</div>
    <div id="div3">i am div2</div>
    <p>hello p</p>
</div>

<script>

   var div1=document.getElementById("div1");

////支持;
//   var ele= div1.getElementsByTagName("p");
//   alert(ele.length);
////支持
//   var ele2=div1.getElementsByClassName("div2");
//   alert(ele2.length);
////不支持
//   var ele3=div1.getElementById("div3");
//   alert(ele3.length);
////不支持
//   var ele4=div1.getElementsByName("yuan");
//   alert(ele4.length)

</script>

先找到了父亲,通过父亲可以找tagname ,classname ,但是直接找name,id是找不到的

所以用到了下面的导航查找

导航查找

  • parentElement // 父节点标签元素
  • children // 所有子标签
  • firstElementChild // 第一个子标签元素
  • lastElementChild // 最后一个子标签元素
  • nextElementtSibling // 下一个兄弟标签元素
  • previousElementSibling // 上一个兄弟标签元素

注意,js中没有办法找到所有的兄弟标签!

节点操作

节点的增删改查

  • 创建节点
    createElement(标签名) :创建一个指定名称的元素。

    • 添加节点
      追加一个子节点(作为最后的子节点)
      somenode.appendChild(newnode)

把增加的节点放到某个节点的前边
somenode.insertBefore(newnode,某个节点);

  • 删除节点

removeChild():获得要删除的元素,通过父元素调用删除

节点属性操作

获取文本节点的值:innerText innerHTML

attribute操作

  • elementNode.setAttribute(name,value) ;
  • elementNode.getAttribute(属性名)
  • elementNode.removeAttribute(“属性名”);

value获取当前选中的value值

1.input
2.select (selectedIndex)
3.textarea

innerHTML 给节点添加html代码:

 tag.innerHTML = “<p>要显示内容</p>”;

关于class的操作

  • elementNode.className
  • elementNode.classList.add
  • elementNode.classList.remove

改变css样式:

<p id="p2">Hello world!</p>
document.getElementById("p2").style.color="blue";
                             .style.fontSize=48px

style在这里用的时候不同于css中的有-,这里没有了

DOM Event(事件)

事件类型

onclick        当用户点击某个对象时调用的事件句柄。
ondblclick     当用户双击某个对象时调用的事件句柄。

onfocus        元素获得焦点。               练习:输入框
onblur         元素失去焦点。               应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证.
onchange       域的内容被改变。             应用场景:通常用于表单元素,当元素内容被改变时触发.(三级联动)

onkeydown      某个键盘按键被按下。          应用场景: 当用户在最后一个输入框按下回车按键时,表单提交.
onkeypress     某个键盘按键被按下并松开。
onkeyup        某个键盘按键被松开。

onload         一张页面或一幅图像完成加载。

onmousedown    鼠标按钮被按下。
onmousemove    鼠标被移动。
onmouseout     鼠标从某元素移开。
onmouseover    鼠标移到某元素之上。
onmouseleave   鼠标从元素离开

onselect       文本被选中。
onsubmit       确认按钮被点击。

绑定事件方式

绑定方式1

<div id="div" onclick="foo(this)">点我呀</div>

<script>
    function foo(self){           // 形参不能是this;
        console.log("点你大爷!");
        console.log(self);   
    }
</script>

绑定方式2

//绑定方式2 标签对象 可以使用this
    var ele= document.getElementsByTagName("p")[0];

    //标签对象  事件=function(){}
    ele.onclick = function () {
        console.log(this);//直接就是这个标签
//        alert(12);
       alert(this.innerText);//直接使用this
    };

3绑定多个对象

多个对象
   var eles= document.getElementsByTagName("p");
   for (var i=0;i<eles.length;i++){
       eles[i].onclick=function () {
           alert(34)
       }
   }

<input type="text" onfocus="enter(this)" value="请输入内容" onblur="exit(this)">

<script>
    function enter(self) {
        //
        if (self.value=="请输入内容") {
            self.value = "";//进入之后把内容删除
        }
    }

    function exit(self) {
        //trim去除空格
        if (self.value.trim() == ""){
            self.value = "请输入内容"
        }

    }
</script>

事件介绍

1、onload:如果想把script中js文件写到HTML的前面的部分,就能先加载这一部分非内容。

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

    <script>
    
    //使用window.onload能获得全局的 会首先加载
         /*
              window.onload=function(){
                   var ele=document.getElementById("ppp");
                   ele.onclick=function(){
                   alert(123)
                };
             };
         
         */



          function fun() {
              var ele=document.getElementById("ppp");
               ele.onclick=function(){
                alert(123)
            };
          }

    </script>
</head>
<body onload="fun()">

<p id="ppp">hello p</p>

</body>
</html>

2、onsubmit

有的内容可以只在前端就进行判断,如密码的格式,电话号码的格式等,输入错误,重新输入。这样就不用后端进行判断。

当表单在提交时触发. 该属性也只能给form元素使用.应用场景: 在表单提交前验证用户输入是否正确.如果验证失败.在该方法中我们应该阻止表单的提交.

最后一定是form表单提交的
提交后,输入框内的内容会清空,这是如果输入错入,想要阻止向服务端提交,用到了return false 和e

<!-- 最后一定是form表单提交的 -->
<form action=""  id="form">
    用户名:<p><input type="text" name="user"></p>
    密码:<p><input type="text" name="pwd"></p>
    <p><input type="submit" value="sub1"></p>
</form>

这种没有method的方式会通过get的方式发送文件 会在地址栏中出现内容
这种情况是下回通过地址栏进行发送内容
file:///D:xxx/onsubmit.html?user=sdfs&pwd=sdfsd

为了避免上面的情况:method="post"

<!-- 最后一定是form表单提交的 -->
<form action="" method="post" id="form">
    用户名:<p><input type="text" name="user"></p>
    密码:<p><input type="text" name="pwd"></p>
    <p><input type="submit" value="sub1"></p>
</form>

只要向服务端进行了提交,输入框的内容就会清空:
为了避免一些输入格式的错误,一些内容会在起前端就进行判断,如果错误,就阻止提交。用到了两种方法:

  • return false
  • e.preventDefault(); ** 用到了event对象**
<script>
    var ele = document.getElementById("form");
    ele.onsubmit = function (e) {
        alert(123);//这个会执行,通过阻止默认事件,就不会向服务端发送
        return false;//阻止默认事件  默认发送完会清空
        // e.preventDefault();//阻止默认事件 用到了e  e是封装了当前状态的对象
    }
</script>

3、Event 对象:

Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。
事件通常与函数结合使用,函数不会在事件发生前被执行!event对象在事件发生时系统已经创建好了,并且会在事件函数被调用时传给事件函数.我们获得仅仅需要接收一下即可.
比如onkeydown,我们想知道哪个键被按下了,需要问下event对象的属性,这里就时KeyCode

4、事件传播:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>

		.div1{
			width: 100px;
			height: 100px;
			background-color: red;

		}
		.div2{
			width: 50px;
			height: 50px;
			background-color: green;
			
		}
	</style>	

</head>
<body>

<div class="div1">
	<div class="div2">
	</div>

</div>

	<script>
		var ele=document.getElementsByClassName("div1")[0];
		ele.onclick = function(){
			alert(111);
		}
		// var ele2 = document.getElementsByClassName("div2")[0];
		// ele2.onclick = function(){
		// 	alert(222);
		// }

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

这种情况的结果是,在div1 和div2的部分点击的时候,都会显示alert(111) 中的内容,这种特点就叫做实践传播

<script>
		var ele=document.getElementsByClassName("div1")[0];
		ele.onclick = function(){
			alert(111);
		}
		 var ele2 = document.getElementsByClassName("div2")[0];
		 ele2.onclick = function(){
	 	alert(222);
		 }

	</script>

这种情况下,点击div2的时候。会先显示111 然后显示222

阻止内部事件向外部传播
e.stopPropagation();

<script>
		var ele=document.getElementsByClassName("div1")[0];
		ele.onclick = function(){
			alert(111);
		}
		var ele2 = document.getElementsByClassName("div2")[0];
		ele2.onclick = function(e){
			alert(222);
			e.stopPropagation();//使用了event对象
		}

	</script>

4、onselect:

onselect是选择文字内容的时候触发的事件

5、onchange:

<select name="" id="">
    <option value="">111</option>
    <option value="">222</option>
    <option value="">333</option>
</select>

<script>
    var ele=document.getElementsByTagName("select")[0];

    ele.onchange=function(){
          alert(123);
    }

</script>

标签的二级联动

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	
	<select name="" id="" class="select">

		<option value="1">河南省</option>
		<option value="2">湖南省</option>
		<option value="3">云南省</option>
		

	</select>
	<select class="cities" name="" id=""></select>

	<script>
	var info = {"河南省":["郑州","洛阳"],"湖南省":["湘潭","长沙","岳阳"],"云南省":["大理","昆明"]};

	var ele = document.getElementsByClassName("select")[0];
	var ele_cites = document.getElementsByClassName("cities")[0];
	ele.onchange = function(){
		var arrs = ele.children;//获得select子标签,是一个数组
		// console.log(arrs);
		// console.log(this);//this 就代表这个标签
		// console.log(this.selectedIndex);//this.selectedIndex 是选择的标签的索引值
		// 
		var sindex = this.selectedIndex;//获得选择的省的索引值
		var province = arrs[sindex].innerText;//从数组中获得省的名字
		var cities_arry = info[province];//获得城市名字
		// console.log(cities_arry);
		
		// 清空操作1 在下一个for循环之情清空,删除子节点
		var ele_children = ele_cites.children;
		for (var j=0;j<ele_cites.children.length;j++ ) {
			ele_cites.removeChild(ele_cites.children[j]);
			j--;
		}
		// ele_cites.options.length=0;//清空操作2
		for (var i = 0; i < cities_arry.length; i++) {
			var option =document.createElement("option");
			option.innerText = cities_arry[i];
			// console.log(option);
			ele_cites.appendChild(option);//给select动态添加子元素
			//这种情况的添加会导致都添加,需要清空
		}

	}


	</script>

</body>
</html>

6、onkeydown

按键按下的时候触发的操作

下面是判断输入的按键内容的js代码

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<input type="text" id="d1">
	<script>

	var ele=document.getElementById("d1");

	ele.onkeydown =function(e){

		var num=e.keyCode;//ascii
		var key=String.fromCharCode(num);
		// alert(e.keyCode);
		alert(key);
		
	}

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

7、onmouseout与onmouseleave事件的区别

1.不论鼠标指针离开被选元素还是任何子元素,都会触发 mouseout 事件。

2.只有在鼠标指针离开被选元素时,才会触发 mouseleave 事件。

以后推荐是使用mouseleave

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
		#container{
			width: 300px;
			background-color: purple;
			text-align: center;
		}
		
		#title{
			line-height: 50px;

		}

		#list{
			display: none;
		}
		
		#list div{
			line-height: 50px;

		}

		#list .item1{
			background-color: green;
		}

		#list .item2{
			background-color: red;
		}

		#list .item3{
			background-color: yellow;
		}

	</style>
</head>
<body>

	<div id="container">
		<div id="title">mouse演示</div>
		<div id="list">
			<div class="item1">111</div>
			<div class="item2">222</div>
			<div class="item3">333</div>
	
		</div>
	</div>
	
	<script>
		var container=document.getElementById("container");
		var list =document.getElementById("list");
		var title = document.getElementById("title");

		title.onmouseover = function(){
			list.style.display = "block"
		}

		// container.onmouseout=function(){
		// 	list.style.display='none'
		// }

		container.onmouseleave=function(){
			list.style.display='none'
		}




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

练习

模态对话框

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
		.back{
			background-color: white;
			height: 2000px;
		}
		
		.shade{
			position :fixed;
			top: 0;
			bottom :0;
			left: 0;
			right: 0;
			background-color: grey;
			opacity: 0.4;
		}

		.hide{
			display: none;
		}

		.models{
			position: fixed;
			top: 50%;
			left: 50%;
			margin-left: -300px;
			margin-top: -100px;
			height: 300px;
			width: 300px;
			background-color: wheat;

		}
	</style>
</head>
<body>

	<div class="back">
		<input type="button" class="c" value="click">
	</div>

	<div class="shade hide handles"></div>
	
	<div class="models hide handles">
		<input type="button" class="c" value="cancel">
	</div>
	
	<script>
		var eles= document.getElementsByClassName("c");
		var handles = document.getElementsByClassName("handles");

		console.log(eles);
		console.log(handles);
		for (var i=0;i<eles.length;i++){

			//同时给click和cancel加上onclick事件
			eles[i].onclick=function(){

				if (this.value == "click"){
					for(var j=0;j<handles.length;j++){
						handles[j].classList.remove("hide");
					}
				}
				//这是cancel
				else{
					for (var j=0;j<handles.length;j++){
						handles[j].classList.add("hide");
					}
				}
			}
		}
				
		

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

表格 全选 反选 取消

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<button class="select_all">全选</button>
	<button class="select_reverse">反选</button>
	<button class="cancel">取消</button>
	<hr>

	<table class="server_table" border="2px">
		<tr>
			<td><input type="checkbox" class="item"></td>
			<td>111</td>
			<td>111</td>
			<td>111</td>
		</tr>
		
		<tr>
			<td><input type="checkbox" class="item"></td>
			<td>222</td>
			<td>222</td>
			<td>222</td>
		</tr>

		<tr>
			<td><input type="checkbox" class="item"></td>
			<td>333</td>
			<td>333</td>
			<td>333</td>
		</tr>
	</table>
	
	<script>
	var input_arr = document.getElementsByClassName("item");
	var button_arr = document.getElementsByTagName("button");

	for (var i=0;i<button_arr.length;i++){
		button_arr[i].onclick=function(){
			for (var j=0;j<input_arr.length;j++){
				var inp = input_arr[j];
				console.log(inp);

				if (this.innerText=="全选"){
					// console.log("ok");
					inp.checked = true;
				}
				else if(this.innerText=="取消"){
					inp.checked = false;
				}
				//反选
				else{
					if(inp.checked){
						inp.checked=false;
					}else{
						inp.checked=true;
					}
				}
			}
		}
	}


	</script>


</body>
</html>

select移动

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
		.outer{
			margin: 0 auto;
			background-color: gray;
			width: 80%;
			height: 600px;
			margin-top:30px;
		}

		#left{
			display: inline-block;
			width: 100px;
			height: 140px;
			background-color: wheat;
			text-align: center;
		}

		#choice{
			display: inline-block;
			height: 140px;
			background-color: green;
			vertical-align: top;//基线
			padding: 0 5px;
		}

		#choice button{
			margin-top: 20px;
		}

		#right{
			display: inline-block;
			width: 100px;
			height: 140px;
			line-height: 140px;
			background-color: wheat;
			text-align: center;
		}
	</style>

</head>
<body>
	<div class="outer">
		<select name="" id="left" size="4" multiple="multiple"> 
			<option >西游记</option>
			<option >水浒传</option>
			<option >红楼梦</option>
			<option >三国演义</option>
		</select>
		
		<span id="choice">
			<button id="choice_move"> > </button>
			<br>
			<button id="all_move"> >> </button>
		</span>

		<select name="" id="right" multiple="multiple" size="5">
			<option >默认</option>

		</select>

	</div>
	
	<script>
	var choice_move=document.getElementById("choice_move");
	var all_move=document.getElementById("all_move");
	var right=document.getElementById("right");
	var left=document.getElementById("left");
	var options=left.options;//选择的内容
	// console.log(option);

	choice_move.onclick=function(){
		for (var i = 0; i < options.length; i++) {
			
			var option = options[i];
		
			if (option.selected==true){
				right.appendChild(option);
				i--;
			}
		}

	}

	all_move.onclick=function(){

		for (var j=0; j<options.length;j++){
			var option=options[j];
				// console.log(option);
			right.appendChild(option);
			j--;
		}
	}
	</script>
</body>
</html>
posted @ 2017-05-27 10:41  hzxPeter  阅读(334)  评论(0编辑  收藏  举报