深入浅出javascript DOM编程

简介: 本章主要讲解javascript语言中的BOM和DOM的相关技术,以实战为主,不讲解太多的重复的理论知识。重要部分代码都贴出来,并有详细的中文注释,思路非常清晰。

本章主要讲解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>


目录
相关文章
N..
|
1月前
|
JavaScript 前端开发 UED
DOM编程中的form对象
DOM编程中的form对象
N..
10 0
N..
|
1月前
|
XML JavaScript 数据格式
DOM编程中的Document对象
DOM编程中的Document对象
N..
15 0
|
1月前
|
JavaScript 前端开发
JavaScript操作DOM元素
JavaScript操作DOM元素
12 1
|
1月前
|
JavaScript 前端开发
如何使用 JavaScript 操作 DOM?
如何使用 JavaScript 操作 DOM?
13 0
|
17天前
|
JavaScript 算法
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
|
1月前
|
JavaScript 前端开发 算法
js开发:请解释什么是虚拟DOM(virtual DOM),以及它在React中的应用。
虚拟DOM是React等前端框架的关键技术,它以轻量级JavaScript对象树形式抽象表示实际DOM。当状态改变,React不直接操作DOM,而是先构建新虚拟DOM树。通过高效diff算法比较新旧树,找到最小变更集,仅更新必要部分,提高DOM操作效率,降低性能损耗。虚拟DOM的抽象特性还支持跨平台应用,如React Native。总之,虚拟DOM优化了状态变化时的DOM更新,提升性能和用户体验。
23 0
|
3天前
|
JavaScript 前端开发 UED
深入解析JavaScript原生操作DOM技术
【4月更文挑战第22天】本文深入探讨JavaScript原生DOM操作技术,包括使用`getElement*`方法和CSS选择器获取元素,借助`createElement`与`appendChild`动态创建及插入元素,修改元素内容、属性和样式,以及删除元素。通过掌握这些技术,开发者能实现页面动态交互,但应注意避免过度操作DOM以优化性能和用户体验。
|
10天前
|
存储 JavaScript 前端开发
JavaScript DOM 操作:解释一下 cookie、sessionStorage 和 localStorage 的区别。
Cookie是服务器发送至客户端的文本信息,会随每个请求发送回服务器,适合控制会话状态但可能暴露隐私。SessionStorage仅在当前会话中存储数据,关闭浏览器后清除,适合临时存储如登录状态。LocalStorage则持久保存数据,即使关闭浏览器也不会清除,适用于存储长期设置。三种方式各有侧重,应按需求选择。
15 0
|
10天前
|
JavaScript 前端开发 安全
JavaScript DOM 操作:解释一下浏览器的同源策略。
**同源策略**是浏览器安全基石,它阻止脚本跨不同协议、域名或端口访问资源,防止恶意行为。例如,HTTP页面无法直接用JS获取HTTPS页面内容。**CORS**允许跨域请求,但需服务器配合设置,通过`document.domain`属性可配置,但仍受限于服务器配置。
14 4
|
22天前
|
JavaScript
理解DOM树的加载过程(js的问题)
理解DOM树的加载过程(js的问题)
10 0