BOM & DOM 编程
一、BOM
1、BOM对象 浏览器对象模型
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>BOM对象</title> </head> <body> <!-- 浏览器对象模型 BOM--> <!-- 1.window alert() confirm() prompt() setInterval() setTimeout() 2.location href hash url ... reload() 3.screen 4.history go() --> </body> </html>
2、window对象的alert confirm prompt 弹出框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>alert| confirm| prompt</title> </head> <body> <script type="text/javascript"> //window对象的alert confirm prompt window.alert('mjj');//输出:一个弹窗,显示内容:mjj。 var a = window.confirm('你确定要离开网站?');//输出:一个弹窗,显示内容:你确定要离开网站?两个选择项:确定、取消。 console.log(a);//输出:true(点击确定) 或者 false(点击取消)。 var name = window.prompt('请输入你早晨吃了什么?','mjj'); //输出:一个弹窗,内容:请输入你早晨吃了什么? 输入框里默认显示:mjj。 console.log(name);//输出:mjj(点击确定) 或者 null(点击取消) </script> </body> </html>
3、定时器方法 setTimeout()| setInterval()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>setTimeout()| setInterval()</title> </head> <body> <script type="text/javascript"> // setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。 // 延迟性的操作 /* window.setTimeout(function(){ console.log('mjj'); },2000) //输出:两秒后输出:mjj. */ /* window.setTimeout(function(){ console.log('mjj'); },0) console.log('xiongdada'); //输出:先输出xiongda,再输出mjj。即使是0秒,也是起延迟作用的。 */ // setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。 // setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。 // 由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。 /* var num = 0; setInterval(function (){ num++; console.log('num:'+num); },1000) //输出:每一秒打印:num:1,num:2,num:3....... */ var num = 0; var timer = null; timer = setInterval(function(){ num++; if (num > 5) { clearInterval(timer);//清除定时器。 return;//这里如果没有这个return;将会输出到num:6才停止。 } console.log('num:'+ num); },1000); //输出:每隔一秒输出一个:num:1,unm:2......unm:5终止。 </script> </body> </html>
4、location对象 获取地址栏中的相关信息
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>location对象</title> </head> <body> <form> <input type="text" name="user"> <input type="password" name="pwd"> <input type="submit"> </form> <script type="text/javascript"> console.log(location.host);//获取服务器的ip地址:location.hostname console.log(location.href);//获取完整的网页地址。 console.log(location.pathname);//获取文件名。 console.log(location.port);//获取端口号。63342 console.log(location.protocol);//获取网站协议。 console.log(location.search);//获取输入的账号密码字符串。?user=mjj&pwd=1234 </script> </body> </html>
5、如何访问每个查询字符串参数 提取网址中的user 和 password。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>如何访问每个查询字符串参数</title> </head> <body> <script type="text/javascript"> // http://192.168.12.4:8080/04%20location%E5%AF%B9%E8%B1%A1.html?user=mjj&pwd=123 // ?user=mjj&pwd=123 /* var args = { user:'mjj', pwd:'123' } */ //http://localhost:63342/JavaScript-Study/JS-Code/01-insert-type.html?user=mjj&pwd=1234 //网址上面一定带?user=mjj&pwd=1234 function getQueryString(){ // 1.取得去掉问号查询字符串 user=mjj&pwd=123 var qs = location.search.length > 0 ? location.search.substring(1): '';//?user=mjj&pwd=123 //条件判断,如果获取到字符串,则从第一个字符向后分割,如果没有获取到字符串,则给你下空的字符串。 // 2.取得每一项 存放到数组中 var items = qs.length ? qs.split('&'): []; //这一步输出:["name=mjj", "pwd=123"] //判断如果qs有长度(此例中,qs.length=2),则以&进行分割,如果无长度,则给一个空列表。 var item = null,name = null,value = null,args = {}; for(var i = 0; i < items.length; i ++){ item = items[i].split('='); //['name%20','mjj'] name = decodeURIComponent(item[0]); //如果上面获取到的是:['name%20','mjj'],['pwd%20','123'],则需要decodeURIComponent解码。 //如果上面获取到的是:['name','mjj'],['pwd','123'],则需要不需要decodeURIComponent解码。直接把decodeURIComponent去掉即可。 value = decodeURIComponent(item[1]); if (name.length) { args[name] = value; } } return args; } var args = getQueryString();//调用函数。 console.log(args); console.log(args.user); console.log(args.pwd); </script> </body> </html>
6、网页跳转,刷新
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>网页跳转,刷新</title> </head> <body> <script type="text/javascript"> console.log('mjj') // 2秒之后跳转路飞学城 的web页面 setTimeout(function(){ location.href = 'https://www.luffycity.com/';//会产生历史记录,可以点击浏览器上的后退,退回到上一个网页。 location.replace('https://www.luffycity.com/');//不会产生历史记录,退回不到上一个网页。 location.reload();//2秒刷新一次网页。 },2000) </script> </body> </html>
7、navigator对象 如何检测当前浏览器上的插件
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>navigator对象 如何检测当前浏览器上的插件</title> </head> <body> <script type="text/javascript"> console.log(navigator.plugins); //navigator.plugins检测浏览器上面安装的插件。如果有返回true,如果没有返回false. function hasPlugin(name){ // 如果有插件 返回true 反之亦然 name = name.toLowerCase();//传入的参数全部转为小写字符。 for(var i = 0; i < navigator.plugins.length; i++){ if(navigator.plugins[i].name.toLowerCase().indexOf(name) > -1){ // 有此插件 return true; }else{ return false; } } } alert(hasPlugin('Flash')); alert(hasPlugin('Chrome PDF Viewer')); </script> </body> </html>
8、history对象
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>history对象</title> </head> <body> <script type="text/javascript"> // console.log(history); var count = 0; setTimeout(function(){ count++; // console.log(count); history.go(-2);//刷新(0) 括号里面正数是前进,负数是后退。 },2000) </script> </body> </html>
二、DOM
1、快速认识DOM
通过 HTML DOM,JavaScript 能够访问和改变 HTML 文档的所有元素。
HTML DOM(文档对象模型)
当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。
HTML DOM 模型被结构化为对象树:
对象的 HTML DOM 树
通过这个对象模型,JavaScript 获得创建动态 HTML 的所有力量:
- JavaScript 能改变页面中的所有 HTML 元素
- JavaScript 能改变页面中的所有 HTML 属性
- JavaScript 能改变页面中的所有 CSS 样式
- JavaScript 能删除已有的 HTML 元素和属性
- JavaScript 能添加新的 HTML 元素和属性
- JavaScript 能对页面中所有已有的 HTML 事件作出反应
- JavaScript 能在页面中创建新的 HTML 事件
2、DOM中的节点分类:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>02 节点</title> </head> <body> <p title="我是mjj" class="" id="">mjj</p> <!--这里的mjj是文本节点。title\class\id是属性节点。p就是元素节点。--> <ul> <li></li> </ul> <!-- 节点 node--> <!-- 1.元素节点(element node) 2.文本节点 (text node) 3.属性节点 (attribute node)--> <!-- 没有内容 的文档是没有任何价值的,而大多数内容都是有文本提供--> </body> </html>
3、获取元素节点对象的常用的三种方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>获取元素节点对象的常用的三种方法</title> </head> <body> <h2>你要买什么课程?</h2> <p title='请您选择购买的课程'>本课程是web全栈课程,期待你的购买!</p> <ul id='classList'> <li class='item'>JavaScript</li> <li class='item'>css</li> <li>DOM</li> </ul> <!-- 节点类型: 1.元素节点 2.属性节点 3.文本节点 --> <script type="text/javascript"> // 1.document.getElementById() 单个对象 //获得元素通过ID。 var eleNode = document.getElementById('classList'); console.log(eleNode); /*输出: <ul id='classList'> <li className='item'>JavaScript</li> <li className='item'>css</li> <li>DOM</li> </ul> */ console.log(typeof eleNode);//输出:object // 2.document.getElementsByTagName() 获取出来的是一个节点对象集合 有点像数组 但不是数组 不能用push()方法。 var olis = document.getElementsByTagName('li');//通过标签名获取元素。 console.log(olis); /*输出: HTMLCollection(3) [li.item, li.item, li] 0: li.item 1: li.item 2: li length: 3 [[Prototype]]: HTMLCollection */ for(var i = 0; i < olis.length; i ++){ //通过遍历获得里面的每个li标签。 console.log(olis[i]); } /*输出: <li class='item'> ::marker "JavaScript" </li> <li class='item'> ::marker "css" </li> <li> ::marker "DOM" </li> */ console.log(typeof olis);//输出:object var oTitle = document.getElementsByTagName('h2'); console.log(oTitle[0]);//输出:<h2>你要买什么课程?</h2> console.log(olis.length);//输出:3 // 3.document.getElementsByClassName('item');获取出来的是一个节点对象集合 //通过类获取节点方法。 var oItems = document.getElementsByClassName('item'); console.log(oItems); /*输出: HTMLCollection(2) [li.item, li.item] 0: li.item 1: li.item length: 2 [[Prototype]]: HTMLCollection */ </script> </body> </html>
4、获取属性getElementsByTagName 和 设置属性getAttribute
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>获取属性getElementsByTagName 和 设置属性getAttribute</title> <style type="text/css"> #box{ color: red; } </style> </head> <body> <h2>你要买什么课程?</h2> <p title='请您选择购买的课程'>本课程是web全栈课程,期待你的购买!</p> <ul id='classList'> <li class='item'>JavaScript</li> <li class='item'>css</li> <li>DOM</li> </ul> <!-- --> <script type="text/javascript"> var oP = document.getElementsByTagName('p')[0]; //输出:<p title='请您选择购买的课程'>本课程是web全栈课程,期待你的购买!</p> [0]不能少。 // 获取属性值 有一个必需的参数,这个节点对象的名字 var title = oP.getAttribute('title'); var className = oP.getAttribute('class'); // console.log(oP); console.log(title);//输出:请您选择购买的课程 console.log(className);//输出:null // 设置属性值 setAttribute(name,value) oP.setAttribute('id', 'box'); //通过javascript给p标签设置一个id=box。源代码里面看不到设置的id。 </script> </body> </html>
5、节点对象的其它常用属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>节点对象的其它常用属性</title> </head> <body> <div class="previous">我是上个兄弟</div><div id="father"><p>mjj</p><p>mjj2</p></div><div class="sibling">我是下个兄弟</div> <script type="text/javascript"> var oFather = document.getElementById('father'); console.log(oFather.childNodes);//获取节点的集合对象。 console.log(oFather.childNodes[0]); console.log(oFather.firstChild);//获取第一个p标签。 // console.log(oFather.childNodes[oFather.childNodes.length - 1]); console.log(oFather.lastChild);//获取最后一个p标签。 // console.log(oFather.parentNode.parentNode); console.log(oFather.parentNode);//获取父级标签。 console.log(oFather.nextSibling);//获取下一个class标签。 console.log(oFather.previousSibling);//获取上一个class标签。 </script> </body> </html>
6、节点对象属性在各浏览器兼容性处理 找出标签里面的内容:<p>mjj</p> 和 找出下一个属性节点
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>节点对象属性在各浏览器兼容性处理</title> </head> <body> <div class="previous">我是上个兄弟</div> <div id="father"> <p>mjj</p> <p>mjj2</p> </div> <div class="sibling">我是下个兄弟</div> <script type="text/javascript"> var oFather = document.getElementById('father'); // console.log(oFather); /*输出: <div id="father"> <p>mjj</p> <p>mjj2</p> </div> */ function get_childNodes(fatherNode){ //这个函数为了去掉oFather里面的空格. var nodes = fatherNode.childNodes; // console.log(nodes);//输出:[text, p, text, p, text] var arr = [];//保存已经获取的元素节点对象 for(var i = 0; i < nodes.length; i++){ if (nodes[i].nodeType === 1) { //判断是否为元素节点. arr.push(nodes[i]); } } return arr;//这里返回的arr赋值给了get_childNodes. } var childnodes = get_childNodes(oFather); console.log(childnodes[0]);//输出:<p>mjj</p> 如果0换成1,则输出:<p>mjj2</p> function get_nextSibling(n){ //这个函数是获取下一个属性节点. var x = n.nextSibling; while(x && x.nodeType != 1){ //这个条件是如果x不是空值,并且x的类型不等于1.,则需要继续往下找. x = x.nextSibling;//继续往下找需要更新一下变量x. } return x; } console.log(get_nextSibling(oFather));//输出:<div class="sibling">我是下个兄弟</div> </script> </body> </html>
7、节点方法:创建 插入 删除 替换 创建文本节点
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>节点方法:创建 插入 删除 替换 创建文本节点</title> <style type="text/css"> .active{ color: red; font-size: 30px; } </style> </head> <body> <div id="box"> <p id="active">mjj</p> </div> <!-- 动态的操作节点 1.创建节点 createElement() 2.插入节点 appendChild() insertBefore(newNode,node)// 第一个参数是新插入的节点,第二个参数是参考的节点 3.删除节点 removeChild(childNode) 4.替换节点 replaceChild(newNode,node) 5.创建文本节点 createTextNode() --> <script type="text/javascript"> //插入一个p标签,并且设属性完整步骤. var oDiv = document.getElementById('box');//获取到Id=box的div标签. var newNode = document.createElement('p');//创建一个标签对象p标签. newNode.setAttribute('class', 'active');//设置一个类属性,还有类名. oDiv.appendChild(newNode);//插入要创建的标签p. var textNode = document.createTextNode('alex');//创建一个文本alex. newNode.appendChild(textNode);//将文本添加到标签中. //上面两行等同于下面一行. newNode.innerHTML = '<a href="#">alex@qq.com</a>';//在网页上输出:alex@qq.com,超链接. newNode.innerText = '<a href="#">alex@qq.com</a>';//在网页上输出:<a href="#">alex@qq.com</a> /* // 在一个节点前面插入一个节点. var oDiv = document.getElementById('box');//获取到Id=box的div标签. var oAtive = document.getElementById('active'); var newNode = document.createElement('p');//创建一个标签对象p标签. var newNode2 = document.createElement('p'); // var newNode3 = document.createElement('a'); // console.log(newNode === newNode2); // newNode = null;//释放对象 newNode.innerHTML = '<a href="#">alex@qq.com</a>';//在网页上输出:alex@qq.com,超链接. newNode2.innerHTML = '<a href="#">mjj@qq.com</a>';//在网页上输出:alex@qq.com,超链接. // 第一个参数是新插入的节点,第二个参数是参考的节点 newNode.setAttribute('class', 'active');//设置一个类属性,还有类名. oDiv.appendChild(newNode);//插入要创建的标签p. oDiv.insertBefore(newNode2,oAtive); */ /* //删除节点完整操作. var oDiv = document.getElementById('box');//获取到Id=box的div标签. var oAtive = document.getElementById('active'); oDiv.removeChild(oAtive); //删除操作 */ /* //替换节点完整操作步骤. var oDiv = document.getElementById('box');//获取到Id=box的div标签. var oAtive = document.getElementById('active'); var newNode3 = document.createElement('a'); newNode3.setAttribute('href','http://www.baidu.com'); newNode3.innerHTML = '百度一下'; oDiv.replaceChild(newNode3, oAtive);//第一个参是新节点,第二个参数是要被替换的节点. */ </script> </body> </html>
8、动态操作样式 通过javascript设置标签样式,和css里面设置完全一样。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>动态操作样式</title> <style type="text/css"> .highLight{ background-color: black; color: white; width: 250px; height: 250px; line-height: 250px; text-align: center; font-size: 30px; } </style> </head> <body> <p id='box'>MJJ</p> <script type="text/javascript"> // nodeObj.style var para = document.getElementById('box'); /* 1、直接操作样式属性 //此方法和css里面设置标签样式完全一样. console.log(para.style); para.style.color = 'white'; para.style.backgroundColor = 'black'; para.style.width = '250px'; para.style.height = '250px'; para.style.textAlign = 'center'; para.style.lineHeight = '250px'; para.style.fontSize = '30px'; */ // 2、通过控制属性的类名来控制样式 para.setAttribute('class', 'highLight'); </script> </body> </html>
9、事件 鼠标点击 onclick
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>事件 鼠标点击 onclick</title> <style type="text/css"> #box{ width: 100px; height: 100px; background-color: blue; } </style> </head> <body> <!-- <div id="box" onclick="add();"></div> --> <div id="box" ></div> <script type="text/javascript"> /*事件触发的方式一:(推荐使用的方式) var oDiv = document.getElementById('box'); var add = function (){ alert("事件被触发了!") } oDiv.onclick = add; */ /*事件触发的方式二: <div id="box" onclick="add();"></div> var oDiv = document.getElementById('box'); function add(){ alert(111111) } */ var oDiv = document.getElementById('box'); var isBlue = true; oDiv.onclick = function(){ if (isBlue) { //这里if的条件是为了能在red和blue之间来回切换。 // this 指向了当前的元素节点对象 this.style.backgroundColor = 'red'; isBlue = false; }else{ this.style.backgroundColor = 'blue'; isBlue = true; } }; </script> </body> </html>
10、onmouseover()和onmouseout() 鼠标悬浮 事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>onmouseover()和onmouseout()事件</title> <style type="text/css"> #box{ width: 200px; height: 200px; background-color: red; } </style> </head> <body> <div id="box"> </div> <script type="text/javascript"> // 1.找开关 2.摁一下 3.灯亮了 // 1.找到触发的事件对象 var oDiv = document.getElementById('box');//通过id找到标签。 // 2.鼠标滑过事件 oDiv.onmouseover = function(){ console.log(111);//这里可以显示事件的次数。 // 3.事件处理程序 this.style.backgroundColor = 'green'; } // 2.鼠标移开事件 oDiv.onmouseout = function(){ // 3.事件处理程序 this.style.backgroundColor = 'red'; } </script> </body> </html>
11、光标聚焦和失焦事件 输入框,提示文字示例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>光标聚焦和失焦事件</title> <style type="text/css"> .text{ color: red; font-size: 12px; } </style> </head> <body> <form action=""> <p class="name"> <label for="username">用户名:</label> <input type="text" name="user" id="username"> </p> <p class="pwd"> <label for="pwd">密码:</label> <input type="password" name="wpd" id="pwd"> </p> <input type="submit" name=""> </form> <script type="text/javascript"> var userName = document.getElementById('username');//通过ID获取标签节点 var newNode = document.createElement('span');//创建一个节点标签 userName.onfocus = function(){ //此函数作用是鼠标点击输入框,显示提示文字:请输入用户名 newNode.innerHTML = '请输入用户名';//设置网页显示的内容。 newNode.setAttribute('class', 'text')//设置新标签p的类属性及值。 userName.parentNode.appendChild(newNode);//设置新添加的子节点位置在.form>p>input的后面。 } userName.onblur = function(){ //此函数的作用是在鼠标离开此输入框的时候,给出提示文字:请输入正确的用户名 newNode.innerHTML = '请输入正确的用户名'; newNode.setAttribute('class', 'text') userName.parentNode.appendChild(newNode); } </script> </body> </html>
12、内容选中事件onselect和内容改变事件onchange、内容改变实时事件oninput
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>内容选中事件onselect和内容改变事件onchange、内容改变实时事件oninput</title> </head> <body> <!-- onselect onchange --> <textarea cols="30" rows="10">请写入个人简介,字数不少于200字</textarea> <input type="text" name="" value="mjj"> <script type="text/javascript"> var textArea = document.getElementsByTagName('textarea')[0]; var inputObj = document.getElementsByTagName('input')[0]; textArea.onselect = function(){ //当文字被选中的时候,触发此事件。 console.log('内容被选中'); } inputObj.onchange = function(){ //当输入框里面的内容被改变的时候,触发此事件。(此事件使用的比较多) console.log('内容被改变了'); } inputObj.oninput = function(){ // 内容被实时改变,触发此事件。 console.log('内容被实时改变了'); console.log(this.value);//输出:被实时改变的文本内容。 } </script> </body> </html>
13、主要事件总结
作者:龙飞
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!