JS中的函数、BOM和DOM操作
写在前面:
之前在学习js的时候,这一块感觉掌握的很不好,而这一块在js中是比较重要的,所以借此系统的将这一部分进行整理,以备不时之需 。
一、函数
1.js中函数的声明与调用
1).声明:
function 函数名(参数一,参数二){ //函数体代码 return 返回值 }
2).调用
①直接调用:函数名(参数一,参数二); ②通过事件调用:再HTML标签中,通过事件属性进行调用
【函数声明与调用的注意事项】
①函数中有没有返回值,只取决于函数中有没有return,无需刻意声明 在js中,有返回值可以不接受;没有返回值,也可以接受 ,结果为undefined ②js中,函数的形参列表与实参列表,无任何关联 即 有参数可以不赋值(未赋值 undefined);没有参数也可以赋值 函数的实际参数个数取决于实参列表 ③js中,函数是变量的唯一作用域 那么,函数的形参属于函数的局部变量 ④函数的声明与调用语句,没有先后之分。即,可以先调用语句,再声明函数 func() function func(){}
【匿名函数的声明与使用】
1).匿名函数表达式:
var func =function(){};
调用:func(); 注意:函数的调用语句,必须放在声明语句之后
2).直接将匿名函数赋值给一个事件
window.onload=function(){}//文档就绪函数,确保函数中的代码,在html文档加载完之后执行代码
document.getElementById("id").onclick=function(){}
3).自执行函数
① !functon(){}();//开头用!表明这是自执行函数 建议
!function(){ alert("自执行函数1"); }();
② (function(){}());//用括号将匿名函数声明与调用包括在一起--->表明其整体性
(function(){ alert("自执行函数2"); })();
③ (function(){})();//用括号将匿名函数将声明语句进行包括
(function(){ alert("自执行函数3"); })();
js代码的执行
1.检查编译阶段
主要检查语法的错误,进行变量的声明、函数的声明等操作。
2.代码执行阶段
变量的赋值、函数的调用等执行语句,属于代码的执行阶段
var num=1; function func(){} var func2=function(){}
//检查编译阶段 var num; function func(){} var func2; //代码执行阶段 num=1; func(); func2(); func2=function(){}
【Arguments对象】
1.作用:用于保存所有函数的实参 >>>但函数存在实参时,可以使用数组下标访问函数的所有实参 >>>arguments[4]
2.arguments中元素的个数,取决于实参列表,与形参个数无关 3.一旦函数调用时,传入了实参,那么对应位置的形参,将于arguments对应的元素进行绑定 修改形参,arguments中对应的元素将被改掉。反之,也成立 但是,如果某一位置,没有传入实参,则该位置的形参和arguments将不再进行关联 4.arguments.callee(); 执行当前函数的引用,用于在函数中使用递归调用自身
二、BOM操作
screen 对象
width height availWidth//可用宽度 availHeight//可用高度=screen.height-底部任务栏高度 console.log(screen);//属性,属于windows对象,windows可省略 console.log(window.screen);
location对象
href:完整的url路径 protocal:协议ming hostname主机名 port:端口号 host:主机名+端口号 pathname:文件路径 search:从?开始的参数部分 hash:从#开始的锚点部分
function gotoBaidu(){ location.href="http://www.baidu.com"; }
//跳转页面。加载新页面以后,可以点击回退按钮返回 function gotoBaiduByAssign(){ location.assign("http://www.baidu.com"); }
//跳转界面,加载新页面以后没有回退按钮,无法返回 function gotoBaiduByReplace(){ location.replace("http://www.baidu.com"); }
//刷新当前页面 location.reload();刷新页面,如果本地有缓存,将从缓存中读取,相当于按F5 location.reload(true);//强制刷新,从服务器端重新获取数据 相当于按Ctrl+F5
history 对象
console.log(history.length);//用于记录当前页面跳转的历史页面的个数 history.forward();//上一页 history.back();//下一页 console.log(history.length);//用于记录当前页面跳转的历史页面的个数 history.forward();//上一页 history.back();//下一页
navigator 对象
console.log(navigator);
//检测浏览器中安装的所有插件 for(var i=0;i<navigator.plugins.length;i++){ console.log(navigator.plugins[i].name); }
window 对象
1.prompt()弹窗输入 alert()弹框输出 2.confirm(""):带确定、取消的提示框。分别返回true、false 3.close();关闭浏览器窗口 4.open():打开一个新窗口 参数一:新窗口的地址 参数二:新窗口的名字,没啥用 参数三:新窗口的各种配置属性 window.open("http://www.baidu.com","baidu","width=600px,height=600px,top=100px"); 5.setTimeOut():延时器 参数一:可以传入匿名函数,也可以传入函数名 参数二:延时的毫秒数 参数三~参数n:传给回掉函数的参数 setTimeout(function(num1,num2){},2000,"hahah",123); 6.setInterval():定时器。表示每隔多少毫秒执行一遍函数 其他用法与setTimeout完全相同 7.clearInterval()、clearTimeout():清除定时器、清除延时器 声明定时器时,可以接受返回的id,并将id传给clearInterval()即可清除
三、DOM操作
DOM树的节点
分三大类:元素节点(标签节点)、属性节点、文本节 属性节点和文本节点都属于元素节点的子节点。因此操作时,需先选中元素节点,再修改属性和文本
<ul> <li id="first"><b>第一项</b></li> <li class="cls" name="name">第二项</li> <li class="cls">第三项</li> <li name="name">第四项</li> </ul> <div id="div1"> <ul> <li>第一项</li> <li class="cls" name="name">第二项</li> <li class="cls">第三项</li> <li name="name">第四项</li> </ul> </div>
【查看元素节点】
1)使用getElement系列方法:
var li = document.getElementById("first"); var lis1 = document.getElementsByClassName("cls"); var lis2 = document.getElementsByName("name"); var lis3 = document.getElementsByTagName("li"注意事项
①id不能重名,id重复取第一个 ②获取元素节点时,必须等到DOM树加载完成后才能获取 两种方式:a.js写在文档最后 b.代码写在window.onload函数中 ③通过getElments系列取到的为数组格式,操作时必须取到每一个元素,才能进行操作,不能直接对数组进行操作 document.getElementByTagName("li").click=function(){} × document.getElementByTagName("li")[0].click=function(){} √ ④这一系列方法,也可以先选中一个DOM节点,在从选中的DOM节点中,选择需要的节点: document.getElementById("div1").getElementByTagName("li");
2)通过querySelector系列方法:
① 传入一个选择器名称,返回第一个找到的元素。 通常用于查找ID: var dq1 = document.querySelector("#id"); ② 传入一个选择器名称,返回所有找到的元素,无论找到几个,都返回数组格式。 var dqs1 = document.querySelectorAll("#div1 li");
【查看/设置属性节点】
1、 查看属性节点:.getAttribute("属性名"); 2、 设置属性节点:.setAttribute("属性名","属性值"); 3、 注意事项: .setAttribute() 在老版本IE中会存在兼容性问题,可以使用.符号代替。 document.getElementById("first").className = "haha";
【JS修改CSS的多种方式】
1、 使用setAttribute设置class和style document.getElementById("first").setAttribute("class","class1");
document.getElementById("first").setAttribute("style","color:red;"); 2、使用.className添加一个class选择器。 document.getElementById("first").className = "class1"; 3、 使用.style.样式 直接修改单个样式。 注意样式名必须使用驼峰命名法 document.getElementById("first").style.fontSize = "18px"; 4、使用.style 或 .style.cssText 添加一串行级样式: document.getElementById("first").style = "color:red;"; // IE不兼容 document.getElementById("first").style.cssText = "color:red;"; // √
【查看/设置文本节点】
1、.innerHTML: 取到或设置一个节点中的HTML代码。 2、.innerText: 取到或设置一个节点中的文本,不能设置HTML代码。
【层次节点操作】
1. .childNodes: 获取当前节点的所有子节点(包括元素节点和文本节点)。 children: 获取当前节点的所有元素子节点(不包含文本节点)。 2. .parentNode: 获取当前节点的父节点。 3. .firstChild: 获取第一个子节点,包括回车等文本节点; .firstElementChild: 获取第一个元素节点。 不含文本节点。 .lastChild、.lastElementChild 获取最后一个,同理。 4. .previousSibling: 获取当前节点的前一个兄弟节点,包括文本节点; .previousElementSibling: 获取当前节点的前一个元素兄弟节点。 .nextSibling、.nextElementSibling: 同理。 5. .attributes: 获取当前节点的所有属性节点。 返回数组格式。
【创建并新增节点】
1. document.createElement("标签名"): 创建一个新节点,并将创建的新节点返回。 需要配合.setAttribute()为新节点设置属性。 2. 父节点.insertBefore(新节点,目标节点): 在父节点中,将新节点插入到目标节点之前。 父节点.appendChild(新节点): 在父节点的内部最后,插入一个新节点。 3. 源节点.cloneNode(true): 克隆一个节点。 传入true表示克隆源节点以及源节点的所有子节点; 传入false或不传,表示只克隆当前节点,而不克隆子节点。
【删除、替换节点】
1. 父节点.removeChild(子节点): 从父节点中,删除指定子节点。 2. 父节点.replaceChild(新节点,老节点): 从父节点中,用新节点替换老节点。
DOM对象
html表中的对象有三种:
1.表格对象 table= document.getElementById("table");
2. 行对象 table.rows[0]
3.单元格对象 table.rows[0].cells[0]
【表格对象中的属性和方法】
1.rows属性,返回当前表格的所有行,为数组格式
2.insertRow(index):在表格的index行,插入一个新行。返回新产生的行对象
3.deleteRow(index):删除表格的第index行
【行对象中的属性和方法】
1.cells属性:返回当前行中的所有单元格对象,为数组格式 2.rowIndex属性,返回当前行 在表格中的下标 3.insertCell(index):表示在行中的index位置,插入一个新单元格, 返回新产生的单元格对象 4.deleteCell(index):表示删除本行中的第index个单元格
【单元格对象中的属性和方法】
1.cellIndex属性:返回当前单元格在本行中的下标 2.innerHTML innerText 等