BOM对象
window对象
所有浏览器都支持 window 对象。
概念上讲.一个html文档对应一个window对象.
功能上讲: 控制浏览器窗口的.
使用上讲: window对象不需要创建对象,直接使用即可.
Window 对象方法(全局变量)
alert() 显示带有一段消息和一个确认按钮的警告框。
confirm() 显示带有一段消息以及确认按钮和取消按钮的对话框(确定为true、取消为flase)。
prompt() 显示可提示用户输入的对话框。
open() 打开一个新的浏览器窗口或查找一个已命名的窗口。
close() 关闭浏览器窗口。
setInterval() 按照指定的周期(以毫秒计)来调用函数或计算表达式。
clearInterval() 取消由 setInterval() 设置的 timeout。
setTimeout() 在指定的毫秒数后调用函数或计算表达式。
clearTimeout() 取消由 setTimeout() 方法设置的 timeout。
scrollTo() 把内容滚动到指定的坐标。
方法使用
1、alert confirm prompt以及open函数
//----------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的窗口 resizable 窗口是否可调节
//close方法 将当前文档窗口关闭. //close();
示例:
var num = Math.round(Math.random()*100); function acceptInput(){ //2.让用户输入(prompt) 并接受 用户输入结果 var userNum = prompt("请输入一个0~100之间的数字!","0"); //3.将用户输入的值与 随机数进行比较 if(isNaN(+userNum)){ //用户输入的无效(重复2,3步骤) alert("请输入有效数字!"); acceptInput(); } else if(userNum > num){ //大了==> 提示用户大了,让用户重新输入(重复2,3步骤) alert("您输入的大了!"); acceptInput(); }else if(userNum < num){ //小了==> 提示用户小了,让用户重新输入(重复2,3步骤) alert("您输入的小了!"); acceptInput(); }else{ //答对了==>提示用户答对了 , 询问用户是否继续游戏(confirm). var result = confirm("恭喜您!答对了,是否继续游戏?"); if(result){ //是 ==> 重复123步骤. num = Math.round(Math.random()*100); acceptInput(); }else{ //否==> 关闭窗口(close方法). close(); } } }
2、setInterval(定时器),clearInterval(清除定时器)
setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。
语法:setInterval(code,millisec)
其中,code为要调用的函数或要执行的代码串。millisec周期性执行或调用 code 之间的时间间隔,以毫秒计。
3、input,button
<head>
<script> function bar(){ // 获取当前时间字符串 var curr_time=new Date(); var s_time=curr_time.toLocaleString(); // 找到标签,然后对其value赋值 var ele=document.getElementById("timer"); ele.value=s_time; } function stop(){ alert(123 ); } </script> </head> <body> <!--onfocus 获取光标事件--> < type="text" id="timer" onfocus="start()"> <!--单击鼠标事件--> <button onclick="stop()">end</button> </body>
定时器练习:
!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <script> var ID; function start(){ if (ID==undefined){ bar(); ID=setInterval(bar,1000); // 123 } } function bar(){ // 获取当前时间字符串 var curr_time=new Date(); var s_time=curr_time.toLocaleString(); // 找到标签,然后对其value赋值 var ele=document.getElementById("timer"); ele.value=s_time; } function stop(){ clearInterval(ID);//清除最后一次定时器 ID=undefined; } </script> </head> <body> <!--onfocus 获取光标事件--> <input type="text" id="timer" onfocus="start()"> <!--单击鼠标事件--> <button onclick="stop()">end</button> </body> </html>
DOM对象
什么是HTML DOM
- HTML Document Object Model(文档对象模型)
- HTML DOM 定义了访问和操作HTML文档的标准方法
HTML DOM 把 HTML 文档呈现为带有元素、属性和文本的树结构(节点树)
DOM树
画dom树是为了展示文档中各个对象之间的关系,用于对象的导航。
DOM节点
节点类型
HTML 文档中的每个成分都是一个节点。
DOM 是这样规定的:
整个文档是一个文档节点
每个 HTML 标签是一个元素节点
包含在 HTML 元素中的文本是文本节点
每一个 HTML 属性是一个属性节点
其中,document与element节点是重点。attribute是属性节点。
节点关系
节点树中的节点彼此拥有层级关系。
父(parent),子(child)和同胞(sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。
- 在节点树中,顶端节点被称为根(root)
- 每个节点都有父节点、除了根(它没有父节点)
- 一个节点可拥有任意数量的子
- 同胞是拥有相同父节点的节点
下面的图片展示了节点树的一部分,以及节点之间的关系:
访问 HTML 元素(节点),访问 HTML 元素等同于访问节点,我们能够以不同的方式来访问 HTML 元素。
节点查找
直接查找节点(全局查找,如果要找某个节点下的节点,先定位全局下的这个某个节点)
document.getElementById(“idname”)
document.getElementsByTagName(“tagname”)
document.getElementsByName(“name”)
document.getElementsByClassName(“name”)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<body> <p>hello P</p> <div class="c1"> <div class="c2">c22222</div> <p>c1----PPPP</p> </div> <a href="#" id="ID1"></a> <script> var eles=document.getElementById("ID1"); console.log(eles); eles=document.getElementsByTagName("p"); console.log(eles[0]); </script> <body>
导航节点属性
注意,js中没有办法找到所有的兄弟标签!
'''
parentElement // 父节点标签元素
children // 所有子标签
firstElementChild // 第一个子标签元素
lastElementChild // 最后一个子标签元素
nextElementtSibling // 下一个兄弟标签元素
previousElementSibling // 上一个兄弟标签元素
'''
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<head> <meta charset="UTF-8"> <title></title> <style> .item .c1{ display: none; } </style> </head> <body> <div> <div class="item"> <p onclick="foo(this)">菜单一</p> //this将<p>标签本身当做参数传入函数 <div class="c1">111111</div> </div> <div class="item"> <p onclick="foo(this)">菜单二</p> <div class="c1">111111</div> </div> <div class="item"> <p onclick="foo(this)">菜单三</p> <div class="c1">11111111</div> </div> </div> <script> function foo(self){ // alert(1234) // console.log(self) // 指代的当前操作标签 // console.log(self.nextElementSibling); // var ele=self.nextElementSibling; // ele.style.display="block"; // 思路1 查找上一级父类标签 // console.log(self.parentElement); // var eles=document.getElementsByClassName("c1"); // for (var i=0;i<eles.length;i++){ // // console.log(eles[i]) // eles[i].style.display="none"; // } // self.nextElementSibling.style.display="block"; //思路二 查找父类标签的父类标签 // var eles=self.parentElement.parentElement.children; // console.log(eles) //思路三 查找父类标签的上下兄弟标签 var eles=self.parentElement.previousElementSibling; console.log(eles) } </script> </body>
节点操作
创建节点:
1
|
createElement(标签名) :创建一个指定名称的元素。 |
例:var tag=document.createElement(“input")
tag.setAttribute('type','text');
添加节点:只能在父节点的子节点追加(somenode是父节点)
追加一个子节点(作为最后的子节点)
somenode.appendChild(newnode)
把增加的节点放到某个节点的前边
somenode.insertBefore(newnode,某个节点);
删除节点:
removeChild():获得要删除的元素,通过父元素调用删除
替换节点:
somenode.replaceChild(newnode, 某个节点);通过父元素调用替换
节点属性操作:
1、获取和赋值文本节点的值:innerText(只拿最终的文本) innerHTML(可以取包含文本的标签)
elementNode.innerText = ' '
2、attribute操作elementNode元素节点
elementNode.setAttribute(name,value) elementNode.getAttribute(属性名) <-------------->elementNode.属性名(DHTML语法,取值设值) elementNode.removeAttribute(“属性名”);
3、value获取当前选中的value值
1.input
2.select (selectedIndex)
3.textarea
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <select name=" " id="select" onchange="foo(this)"> //内容改变,触发onchange <option value="111">河南省</option> <option value="222">陕西省</option> <option value="333">山东省</option> </select> <script> var ele=document.getElementById("select"); console.log(ele); function foo(self) { console.log(self); //返回下拉框的标签 console.log(self.selectedIndex);//返回下拉框选择项的索引值 } </script> </body> </html>
4、innerHTML 给节点添加html代码:
该方法不是w3c的标准,但是主流浏览器支持
tag.innerHTML = “<p>要显示内容</p>”;
5、关于class的操作:
elementNode.className //返回字符串 elementNode.classList.add
elementNode.classList.add('btn','btn-info')
//返回数组 elementNode.classList.remove
//返回数组
6、改变css样式:
<p id="p2">Hello world!</p> document.getElementById("p2").style.color="blue"; .style.fontSize=48px//所有在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:
<p id="abc">试一试!</p> <script> var ele=document.getElementById("abc"); ele.onclick=function(){ console.log("ok"); console.log(this); // this直接用 }; </script>
绑定方法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div onclick="alert(456)" style="color: red">DIV</div> <div onclick="foo(456)" style="color: red">DIV</div> <p>PPP</p> <p>PPP</p> <p>PPP</p> <button>click</button> <script> // 绑定方式一 // function foo(self){ // console.log(self); // } //绑定方式二 标签对象.事件=function(){}; // var ele =document.getElementsByTagName("p")[0]; // ele.onclick=function(){ // console.log(this);//this指自己标签本身 // alert(this.innerText); // //alert(123); // }; // var eles =document.getElementsByTagName("p"); // for (var i=0;i<eles.length;i++){ // eles[i].onclick=function(){ // alert(789); // } // } </script> </body> </html>
事件介绍:
1、onclick ondblclick
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div onclick="alert('单击事件')">单击事件</div> <div ondblclick="alert('双击事件')">双击事件</div> <input type="text" value="请输入姓名" onfocus="enter(this)" onblur="exit(this)"> <script> function enter(self){ self.value=""; } function exit(self){ if(self.value.trim()==""){ self.value="请输入姓名"; } } </script> </body> </html>
2、onchange onfocus
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<select name="" class="select_pro">
<option value="1">河南省</option>
<option value="2">湖南省</option>
<option value="3">云南省</option>
</select>
<select name="" class="select_city"></select>
<script>
var info={"河南省":["郑州","洛阳","开封"],"湖南省":["湘潭","长沙","岳阳"],"云南省":["大理","昆明"]}
var ele=document.getElementsByClassName("select_pro")[0];
var ele_2=document.getElementsByClassName("select_city")[0];
ele.onchange=function(){
var arrs=ele.children;
// console.log(arrs);
// console.log(this.selectedIndex);//返回选择的select的选项索引值
var sindex=this.selectedIndex;//取到选项的索引值
var province=arrs[sindex].innerText;//取到选项的文本
var citys_arr=info[province];
//console.log(citys_arr); // ["","",""]城市的数组
var ele2_children=ele_2.children;//清空select的子元素
for (var j=0;j<ele2_children.length;j++){//省份选择变换时,清空上一个选项创建的标签
ele_2.removeChild(ele2_children[0]) }
// ----- ele_2.options.length=0; // DHML清空select的子元素
// console.log(ele_2.options);
for (var i=0;i<citys_arr.length;i++){
var option=document.createElement("option");//创建标签
option.innerText=citys_arr[i];//向标签内添加文本
// console.log(option);
ele_2.appendChild(option);//将标签添加进select标签内
}
}
</script>
</body>
</html>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <script> var ID; function start() { if (ID == undefined) { bar(); ID = setInterval(bar, 1000); // 123 } } function bar(){ // 获取当前时间字符串 var curr_time=new Date(); var s_time=curr_time.toLocaleString(); // 找到标签,然后对其value赋值 var ele=document.getElementById("timer"); ele.value=s_time; } function stop(){ clearInterval(ID); ID=undefined; } </script> </head> <body> <!--onfocus 获取光标事件--> <input type="text" id="timer" onfocus="start()"> <!--单击鼠标事件--> <button onclick="stop()">end</button> </body> </html>
3、onload:
onload 属性开发中只给body元素加,这个属性的触发标志着页面内容被加载完成。应用场景: 当有些事情我们希望页面加载完立刻执行,那么可以使用该事件属性。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <script> //整个页面加载完再执行 window.onload=function(){ var ele=document.getElementsByTagName("p")[0]; ele.style.color="red"; } </script> </head> <body> <p>PPP</p> </body> </html>
4、onsubmit:
是当表单在提交时触发. 该属性也只能给form元素使用.应用场景: 在表单提交前验证用户输入是否正确.如果验证失败.在该方法中我们应该阻止表单的提交.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="" method="post" id="form"> 用户名:<p><input type="text" name="user"></p> 密码:<p><input type="password" name="pwd"></p> <p><input type="submit" value="submit"></p> </form> <script> var ele=document.getElementById("form"); ele.onsubmit=function(e){//e即绑定event事件 alert(123); // 阻止默认事件发生的方式一: // return false // 阻止默认事件发生的方式二: e.preventDefault()//event是一个封装了当前事件状态的对象 } </script> </body> </html>
5、onselect:
文本被选中时触发。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input type="text" value="1230"> <script> var ele=document.getElementsByTagName("input")[0]; ele.onselect=function(){ alert(123) } </script> </body> </html>
6、onkeydown 某个键盘按键被按下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input type="text" id="d1"> <script> var ele=document.getElementById("d1"); ele.onkeyup=function(e){ var num=e.keyCode;//取出按下的键 var alph=String.fromCharCode(num);//将按下的键对应的数值转化成字母 alert(e.keyCode+"----"+alph); } </script> </body> </html>
7、onmouseout鼠标从某元素移开 onmouseover鼠标移到某元素之上 onmouseleave鼠标从元素离开
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> .div1{ width: 200px; height: 100px; background-color: darkgreen; } </style> </head> <body> <div class="div1"> DIV </div> <script> var ele=document.getElementsByClassName("div1")[0]; ele.onmouseover=function(){ this.style.color="white";//鼠标移到某元素之上 this.style.cursor="pointer";//鼠标指针变成小手 }; ele.onmouseleave=function(){ this.style.color="black";//鼠标从元素离开 }; ele.onmousedown=function(){ this.style.color="red";//鼠标按钮被按下 } </script> </body> </html>
8、onmouseout与onmouseleave事件的区别:
因为mouseout事件是会冒泡的,也就是onmouseout事件可能被同时绑定到了container的子元素title和list 上,所以鼠标移出每个子元素时也都会触发我们的list.style.display="none";
1.不论鼠标指针离开被选元素还是任何子元素,都会触发 mouseout 事件。
2.只有在鼠标指针离开被选元素时,才会触发 mouseleave 事件。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></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: yellow; } #list .item3{ background-color: blue; } </style> </head> <body> <div id="container"> <div id="title">mouseout演示</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.onmouseleave=function(){ list.style.display="none"; }; // lcontainer.onmouseout=function(){ // list.style.display="none";// // } // //因为mouseout事件是会冒泡的,也就是onmouseout事件可能被同时绑定到了container的子元素title和list //上,所以鼠标移出每个子元素时也都会触发我们的list.style.display="none"; // // 1.不论鼠标指针离开被选元素还是任何子元素,都会触发 mouseout 事件。 // 2.只有在鼠标指针离开被选元素时,才会触发 mouseleave 事件。 </script> </body> </html>
9、事件传播
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> .outer{ 200px; height: 200px; background-color: red; } .inner{ 100px; height: 100px; background-color: yellow; } </style> </head> <body> <div class="outer"> <div class="inner"></div> </div> <script> var ele=document.getElementsByClassName("outer")[0]; ele.onclick=function(){ alert(123); }; var ele2=document.getElementsByClassName("inner")[0]; ele2.onclick=function(e){ alert(456); // e.stopPropagation();//阻止123出现,不加的点子类标签,先出现456,再出现123 } </script> </body> </html>
程序练习
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin: 0;
}
.back{
height: 1200px;
100%;
background-color:cornsilk;
}
.shade{
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color:white ;
opacity:0.4 ;
}
.model{
position: fixed;
400px;
height: 400px;
background-color: green;
top: 50%;
left: 50%;
margin-left:-200px ;
margin-top: -200px;
text-align: center;
}
.con{
margin-top:100px ;
}
.hide{
display: none;
}
</style>
</head>
<body>
<div class="back">
<button onclick="start()">start</button>
</div>
<div class="shade hide"></div>//遮罩层
<div class="model hide">
<div class="con">
用户名:<input type="text">
<button onclick="stop">取消</button>
</div>
</div>//对话框
<script>
function stop() {
var ele=document.getElementsByClassName("shade")[0];
var ele2=document.getElementsByClassName("models")[0];
ele.classList.add("hide");
ele2.classList.add("hide");
}
function start() {
var ele=document.getElementsByClassName("shade")[0];
var ele2=document.getElementsByClassName("models")[0];
if(act=="show"){
ele.classList.remove("hide");
ele2.classList.remove("hide");
}else {
ele.classList.add("hide");
ele2.classList.add("hide");
}
}
</script>
</body>
</html>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<select name="" class="select_pro">
<option value="1">河南省</option>
<option value="2">湖南省</option>
<option value="3">云南省</option>
</select>
<select name="" class="select_city"></select>
<script>
var info={"河南省":["郑州","洛阳","开封"],"湖南省":["湘潭","长沙","岳阳"],"云南省":["大理","昆明"]}
var ele=document.getElementsByClassName("select_pro")[0];
var ele_2=document.getElementsByClassName("select_city")[0];
ele.onchange=function(){
var arrs=ele.children;
// console.log(arrs);
// console.log(this.selectedIndex);//返回选择的select的选项索引值
var sindex=this.selectedIndex;//取到选项的索引值
var province=arrs[sindex].innerText;//取到选项的文本
var citys_arr=info[province];
//console.log(citys_arr); // ["","",""]城市的数组
var ele2_children=ele_2.children;//清空select的子元素
for (var j=0;j<ele2_children.length;j++){//省份选择变换时,清空上一个选项创建的标签
ele_2.removeChild(ele2_children[0]) }
// ----- ele_2.options.length=0; // DHML清空select的子元素
// console.log(ele_2.options);
for (var i=0;i<citys_arr.length;i++){
var option=document.createElement("option");//创建标签
option.innerText=citys_arr[i];//向标签内添加文本
// console.log(option);
ele_2.appendChild(option);//将标签添加进select标签内
}
}
</script>
</body>
</html>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<button class="all">全选</button>
<button class="reverse">反选</button>
<button class="cancel">取消</button>
<hr>
<table border="2px" class="server_tb">
<tr>
<td><input type="checkbox" class="item"></td>
<td>1111</td>
<td>1111</td>
<td>1111</td>
</tr>
<tr>
<td><input type="checkbox" class="item"></td>
<td>1111</td>
<td>1111</td>
<td>1111</td>
</tr>
<tr>
<td><input type="checkbox" class="item"></td>
<td>1111</td>
<td>1111</td>
<td>1111</td>
</tr>
<tr>
<td><input type="checkbox" class="item"></td>
<td>1111</td>
<td>1111</td>
<td>1111</td>
</tr>
<script>
var ele_all=document.getElementsByClassName("all")[0];
var ele_reverse=document.getElementsByClassName("reverse")[0];
var ele_cancel=document.getElementsByClassName("cancel")[0];
var input_arr=document.getElementsByClassName("item");
eles=document.getElementsByTagName("button");
for(var i=0;i<eles.length;i++){
//console.log(eles[i]);
eles[i].onclick=function(){
for (var j=0;j<input_arr.length;j++){
console.log(this);
if(this.innerText=="全选"){
input_arr[j].checked=true;
}
else if(this.innerText=="取消"){
input_arr[j].checked=false;
}
else{
if(input_arr[j].checked){
input_arr[j].checked=false;
}
else{
input_arr[j].checked=true;
}
}
}
}
}
// ele_all.onclick=function(){
// for(var i=0;i<input_arr.length;i++){
// console.log(input_arr[i]);
// var input=input_arr[i];
// input.checked=true;
// }
// };
//
// ele_cancel.onclick=function(){
// for(var i=0;i<input_arr.length;i++){
// console.log(input_arr[i]);
// var input=input_arr[i];
// input.checked=false;
// }
// };
//
// ele_reverse.onclick=function(){
// for(var i=0;i<input_arr.length;i++){
// console.log(input_arr[i]);
// var input=input_arr[i];
// if(input.checked){
// input.checked=false;
// }
// else{
// input.checked=true;
// }
// }
// }
</script>
</table>
</body>
</html>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> h1{ background-color: darkgray; color: red; text-align: center; line-height: 50px; } </style> </head> <body> <h1 class="title">欢迎方绍伟</h1> <button onclick="test()">click</button> <script> function test() { var ele=document.getElementsByClassName("title")[0]; var content=ele.innerText; var first_char=content.charAt(0); var later_string=content.substring(1,content.length); var new_content=later_string+first_char; ele.innerText= new_content; setInterval(test,1000); } </script> </body> </html>
左移右移
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> span{ display: inline-block; 100px; height: 40px; background-color: palevioletred; text-align: center; line-height: 40px; vertical-align: top; } </style> </head> <body> <select name="" id="left" multiple="3"> <option value="">大上海</option> <option value="">狼图腾</option> <option value="">大主宰</option> </select> <span> <button id="move"> > </button> <button id="move_all"> >> </button> </span> <select name="" id="right" multiple="3"> <option value="">西游记</option> </select> <script> var move=document.getElementById("move"); var move_all=document.getElementById("move_all"); var left=document.getElementById("left"); var right=document.getElementById("right"); var option_arr=left.options;//select的选项元素,获取全部选项 console.log(option_arr); move.onclick=function () { for (var i=0;i<option_arr.length;i++){ var option=option_arr[i]; if (option.selected){ //判断选中的选项 right.appendChild(option); i--; } } } </script> </body> </html>
js扩展
js的作用域链与词法分析
变量的作用域是在声明时决定的而不是调用执行时决定;
当函数调用的前一瞬间,先形成一个激活对象,叫Avtive Object, AO并会分析以下3个方面的东西:
1:参数
2:局部变量声明
3:函数声明表达式
函数内部无论是使用参数,还是使用局部变量,都到AO上找.
function f(a,b){
var a=12;
console.log(a);
console.log(b)
}
f(5);
/*
*
js执行顺序 // 词法分析阶段
激活AO(active object)
词法分析(预编译过程)
AO.a=undefined AO.b=undefined
// 分析参数
AO.a = 5
AO.b = undefined
// 分析变量声明
AO.a = undefined 已存在,不做任何影响.
// 函数声明表达式
无 不影响分析
// 函数执行阶段
AO.a = 12
console.log(AO.a) ==> 12
console.log(AO.y) ==> undefined
*
* */
1. 全局作用域(Global Scope)
在代码中任何地方都能访问到的对象拥有全局作用域,一般来说一下几种情形拥有全局作用域:
(1)最外层函数和在最外层函数外面定义的变量拥有全局作用域
var name="yuan"; function foo(){ var age=23; function inner(){ console.log(age); } inner(); } console.log(name); // yuan //console.log(age); // Uncaught ReferenceError: age is not defined foo(); // 23 inner(); // Uncaught ReferenceError: inner is not defined
(2)所有末定义直接赋值的变量自动声明为拥有全局作用域,例如:
var name="yuan"; function foo(){ age=23; var sex="male" } foo(); console.log(age); // 23 console.log(sex); // sex is not defined
变量age拥有全局作用域,而sex在函数外部无法访问到。
(3)所有window对象的属性拥有全局作用域
一般情况下,window对象的内置属性都都拥有全局作用域,例如window.alert()、window.location、window.top等等。
2. 局部作用域(Local Scope)
和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域成为函数作用域.
如示例1中的age与inner都只有局部作用域。(js中if、for没有自己的作用域)
作用域链(Scope Chain)
在JavaScript中,函数也是对象,实际上,JavaScript里一切都是对象。函数对象和其它对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是[[Scope]],由ECMA-262标准第三版定义,该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。
示例演示
function bar(age) { console.log(age); var age = 99; var sex= 'male'; console.log(age); function age() { alert(123) }; console.log(age); return 100; } result=bar(5);
结果分析
我相信大家一定会有想不到的结果,接下来我们就以最复杂的例3来分析整个过程。
当一个函数创建后,它的作用域链会被创建此函数的作用域中可访问的数据对象填充。在函数bar创建时,它的作用域链中会填入一个全局对象,该全局对象包含了所有全局变量,如下图所示:
解析到函数调用时,即bar(5),会生成一个active object的对象,该对象包含了函数的所有局部变量、命名参数、参数集合以及this,然后此对象会被推入作用域链的前端,当运行期上下文被销毁,活动对象也随之销毁。新的作用域链如下图所示:
过程解析:
function bar(age) { console.log(age); var age = 99; var sex="male"; console.log(age); function age(){ alert(123); } ; console.log(age); return 100; } result=bar(5); 一 词法分析过程(涉及参数,局部变量声明,函数声明表达式): 1-1 、分析参数,有一个参数,形成一个 AO.age=undefine; 1-2 、接收参数 AO.age=5; 1-3 、分析变量声明,有一个 var age, 发现 AO 上面有一个 AO.age ,则不做任何处理 1-4 、分析变量声明,有一个 var sex,形成一个 AO.sex=undefine; 1-5 、分析函数声明,有一个 function age(){} 声明, 则把原有的 age 覆盖成 AO.age=function(){}; 二 执行过程: 2-1 、执行第一个 console.log(age) 时,当前的 AO.age 是一个函数,所以输出的一个函数 2-2 、这句 var age=99; 是对不 AO.age 的属性赋值, AO.age=99 ,所以在第二个输出的age是 99; 2-3 、同理第三个输出的是 99, 因为中间没有改变 age 值的语句了。 注意:执行阶段: function age(){ alert(123) } ; 不进行任何操作,将执行语句复制给age这部操作是在词法分析时,即运行前完成的。