本章主要讲解javascript语言中的BOM和DOM的相关技术,以实战为主,不讲解太多的重复的理论知识。重要部分代码都贴出来,并有详细的中文注释,思路非常清晰。如果对DOM和BOM理解掌握还不是非常透彻的同学,请耐心的看完每行代码,并自己亲自动手实践,这样才能真正掌握,加深印象。
首先是对BOM(浏览器对象模型)方面的常用技巧的演示:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>学习浏览器对象模型BOM</title> <script src="Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script> <script type="text/javascript"> var o = new Object(); o=123456; // alert(o.toString()); // alert(window); //1.使用最多的window对象 var demo = 799; //所有的对象,都是默认在Window下面的 //alert(demo); //或者写成 alert(window.demo); function move() { window.moveTo(300,200);// 定位为 300,200 // window.moveBy(300, 400); //以现在的位置为参考,偏移300,200 } function test() { // window.resizeBy(300, 400); window.resizeTo(300, 400); //将浏览器窗口变为300*400 } $(function () { $("#showWindow").click(function () { var oneNewWindow = window.open("setTimeOut.htm", "_blank"); //打开一个新的页面 oneNewWindow.resizeTo(400, 300); oneNewWindow.moveTo(300, 400); }); //2.history对象 // window.history.go(index); //浏览器历史记录中跳转。正数往前跳,负数往后跳 // window.history.back(); //往后跳转 // window.history.forword();//往前跳转 // alert(window.history.length);//浏览器总的跳转历史记录条数 //3.document对象(dom的相关操作后续会详细讲解) document.anchors; //获取文档中所有的标签 //alert(document.URL); //获取文档URL document.links; //获取文档中所有的链接 document.forms; //获取文档中所有的表单 document.images; //获取文档中所有的图片 //alert(document.links.length);//获取链接的总个数 //alert(document.links[0].href);//获取第一个链接的href属性 //4.location对象 // location.href; //URL // location.host; //ip地址 // location.port; //端口号 // location.reload(); //刷新页面 //location.replace("setTimeOut.htm");//页面跳转至指定的URL //alert(location.port); //5.navigator对象(浏览器对象) //alert(navigator.appName); //浏览器名称 //alert(navigator.appVersion); //浏览器版本信息 //6.screen对象(屏幕) // alert(screen.height); //屏幕分辨率的 Y--高度 // alert(screen.width); //屏幕分辨率的 X--宽度 //7.frames对象(框架)-- 注意:框架与 HTML dom中的contentWindow经常一起使用 //获取父窗体中ID为ifmOne的框架元素,并调用其move()函数 // parent.frames["ifmOne"].move(); }); </script> </head> <body> <a href="javascript:move()">测试移动浏览器窗口</a> <a href="javascript:test()">测试改变浏览器窗口的大小</a> <input type="button" id="showWindow" value="弹出一个小窗口的广告"/> 版权从2005年至<script type="text/javascript">document.write(new Date().getFullYear().toString())</script>年 </body> </html>
下面则是更加复杂的DOM操作:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>复习Dom操作</title> <style type="text/css"> #newTest { color:Red; } </style> <script src="Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script> <script type="text/javascript"> // //jQuery写法--页面加载完成 // $(document).ready(function () { // }); // //可以简写成 // $(function () { // // }); //标准js中的写法 --页面加载完成 window.onload = function () { var root = document.documentElement; //DOM根节点 --文档节点 var farDIV = document.getElementById("farther"); //根据ID获得DOM的“元素节点” //元素节点的一些常用的属性 //document.getElementsByTagName("")//根据元素(标签)名称获得DOM的“元素节点”(可能是单个或一组) //document.getElementsByName("")//根据name属性获得DOM的“元素节点”(可能是单个或一组) var idNode = farDIV.getAttributeNode("id"); //获得属性为id的“属性节点” //注意:不要把 getAttribute("id")和getAttributeNode("id")搞混了,前者获取的是属性的值,后者获取的属性节点 var textNode = farDIV.firstChild; //farDIV的第一个子节点 //DOM中常用的属性 //属性(其实只在属性节点中定义才有效) //farDIV.attributes;//返回该节点的所有属性对象的数组 //节点名称 // alert(root.nodeName + ":" + farDIV.nodeName + ":" + idNode.nodeName + ":" + textNode.nodeName); //nodeType(不支持IE)有五种,分别代表:标签(元素)节点,属性节点,文本节点,根节点,注释节点 //alert(root.nodeType + ":" + farDIV.nodeType + ":" + idNode.nodeType + ":" + textNode.nodeType); //节点值 //alert(root.nodeValue + ":" + root.nodeValue + ":" + idNode.value + ":" + textNode.nodeValue); //根节点的一些常用属性 -- 创建新节点 var newNode = document.createElement("div"); //创建一个div节点 var text = document.createTextNode("这是我手动创建的"); //创建一个文本节点 newNode.appendChild(text); //将文本节点插入div节点中 var attrNode = document.createAttribute("id"); //创建属性节点,属性名为“id” newNode.setAttributeNode(attrNode); //将newNode节点的属性节点设置为attrNode newNode.setAttribute("id", "newTest"); //设置newNode节点的id属性设置为newTest //var comment = document.createComment("我是注释");//创建注释节点 //获取页面中的body标签所在节点 var body = root.lastChild; //获取root的最后一个子节点 body.appendChild(newNode); //将新建的节点插入body中 //如果添加成功,则CSS会生效(字体变红,ID选择器有效) //获取元素的属性 alert(farDIV.id); alert(farDIV.getAttribute("id")); alert(newNode.getAttribute("id")); //HTML中获取节点的属性 -- 在XHTML中的可以简写 :alert(newNode.id); // //动态的创建表格 //1.可以使用与上面类似的方式,创建节点、拼接、插入... 但是这样操作似乎很麻烦 //2.可以使用更加简单的操作方式 }; </script> </head> <body> <div id="farther">我是父div</div> </body> </html>
关于LoadXML部分,不同的浏览器有些差异,下面做了改进:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>javascript对XML的操作</title> <script src="Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script> <script type="text/javascript"> function test() { alert(loadXML(true, "TestDom.xml")); alert(loadXML(false,"<xml>123</xml>")); } //IE和Firefox类浏览器中装载同域XML文件或XML字符串的方法 //@param flag true表示装载XML文件 false表示装载XML的字符串 //@param xmldoc flag为true时表示XML文件的路径,flag为false时表示XML字符串文本 function loadXML(flag, xmldoc) { //IE和Firefox类浏览器对XML文档的装载和处理存在差异 if (window.ActiveXObject) { //IE浏览器 var activexName = ["MSXML2.Document", "Miscrosoft.XmlDom"]; var xmlObj; for (var i = 0; i < activexName.length; i++) { try { xmlObj = new ActiveXObject(activexName[i]); break; } catch (e) { } if (xmlObj) { // 装载XML文档的对象创建成功 xmlObj.async = false; // 同步方式 if (flag) { //装载XML文件 xmlObj.load(xmldoc); } else { //装载XML字符串 xmlObj.loadXML(xmldoc); } //return xmlObj; //返回根节点 return xmlObj.documentElement; //返回跟元素 } else { alert("装载XML的对象创建失败"); return null; } } } else if (document.implementation.createDocument) { //针对FireFox类浏览器 var xmlObj; if (flag) { //装载XML文件 xmlObj = document.implementation.createDocument("", "", null); if (xmlObj) { //同步方式进行装载 xmlObj.async = false; // 同步方式 xmlObj.load(xmldoc); return xmlObj.documentElement; } else { alert("装载XML的对象创建失败"); return null; } } else { //装载XML字符串 xmlObj = new DOMParser(); var DocRoot = xmlObj.parseFromString(xmldoc, "text/xml"); return DocRoot.documentElement; } } else { alert("该类浏览器可能不支持"); return null; } } </script> </head> <body> <input type="button" id="testLoad" value="测试XML文档加载" onclick="test()" /> </body> </html>