第十二章 DOM2和DOM3

一.DOM变化

1.针对XML命名空间的变化

2.其他方面的变化

二.样式

1.访问元素的样式

            .style
            1)DOM样式属性方法
                cssText:访问style特性中的CSS代码
                length:应用给元素的CSS属性数量
                parentRule:表示CSSRule对象
                getPropertyCSSValue(propertyName):返回包含给定属性值的CSSValue对象
                getPropertyPriority(propertyName):如果给定的属性使用了!important设置,则返回"important";否则,返回空字符串
                getPropertyVlue(propertyName):返回给定属性的字符串值
                item(index):返回给定位置的CSS属性的名称
                removeProperty(propertyName):从样式中删除给定属性
                setProperty(propertyName,value,priority):将给定属性设置哦为相应的值,并加上有限标志(“important”或者一个空字符串)
                -cssText:
                    myDiv.style.cssText="width:25px;height:100px;background-color:green";
                    alert(myDiv.style.cssText);
                    //为元素应用多项变化的快捷方式
                -length:
                    for( var i=0,len=myDiv.style.length;i<len;i++)
                        {
                              alert(myDiv.style[i]);//或者myDiv.style.item(i)  
                         }
                2)计算的样式
                    

2.操作样式表

          CSSStyleSheet类型表示的是样式表
            1)css规则
                CSSStyleRule对象:
                div.box{
                 background-color:blue;
                width:100px;
                height:200px;
               }
                var sheet =docuemnt.styleSheets[0];
                var rules=sheet.cssRules || sheet.rules;//取得规则列表
                var rules = rules[0];//取得第一条规则
                alert(rule.selectorText);//"div.box"
                alert(rule.style.cssText);//完整的CSS代码
                alert(rule.style.backgroundColor);//"blue"
                alert(rule.style.width);//"100px"
               alert(rule.style.height);//"200px"
            2)创建规则
                要向现有样式表中添加新规则,需要使用inserRule()方法:两个参数:规则文本和在哪里插入规则的索引
                sheet.insertRule("body{background-color:silver}",0);//DOM方法
           3)删除规则
                deleteRule(); 一个参数:要删除的位置
                sheet.deleteRule(0);//DOM方法
                sheet.removeRule(0);//仅对IE有效

3.元素大小

            1)偏移量:
                offsetHeight、 offsetTop、 offsetWidth、 offsetlLeft。
            2)客户区大小:元素内容及其内边距所占空间的大小
                clientWidth、 clientHeight。
            3)滚动大小
              
        4).确定元素大小
            
  1. function getElementLeft(element){
  2. var actualLeft = element.offsetLeft;
  3. var current = element.offsetParent;
  4. while (current !== null){
  5. actualLeft += current.offsetLeft;
  6. current = current.offsetParent;
  7. }
  8. return actualLeft;
  9. }
  10. function getElementTop(element){
  11. var actualTop = element.offsetTop;
  12. var current = element.offsetParent;
  13. while (current !== null){
  14. actualTop += current. offsetTop;
  15. current = current.offsetParent;
  16. }
  17. return actualTop;
  18. }
  19. function getBoundingClientRect(element){
  20. var scrollTop = document.documentElement.scrollTop;
  21. var scrollLeft = document.documentElement.scrollLeft;
  22. if (element.getBoundingClientRect){
  23. if (typeof arguments.callee.offset != "number"){
  24. var temp = document.createElement("div");
  25. temp.style.cssText = "position:absolute;left:0;top:0;";
  26. document.body.appendChild(temp);
  27. arguments.callee.offset = -temp.getBoundingClientRect().top - scrollTop;
  28. document.body.removeChild(temp);
  29. temp = null;
  30. }
  31. var rect = element.getBoundingClientRect();
  32. var offset = arguments.callee.offset;
  33. return {
  34. left: rect.left + offset,
  35. right: rect.right + offset,
  36. top: rect.top + offset,
  37. bottom: rect.bottom + offset
  38. };
  39. } else {
  40. var actualLeft = getElementLeft(element);
  41. var actualTop = getElementTop(element);
  42. return {
  43. left: actualLeft - scrollLeft,
  44. right: actualLeft + element.offsetWidth - scrollLeft,
  45. top: actualTop - scrollTop,
  46. bottom: actualTop + element.offsetHeight - scrollTop
  47. }
  48. }
  49. }
  50. function getDimensions(){
  51. var rect = getBoundingClientRect(document.getElementById("myDiv"));
  52. alert("left: " + rect.left + "\nright: " + rect.right + "\ntop: " + rect.top + "\nbottom: " + rect.bottom);
  53. }
  54. </script>
  55. </head>
  56. <body style="padding: 10px; margin: 0">
  57. <div style="margin: 20px">
  58. <div style="padding: 20px">
  59. <div id="myDiv" style="width: 100px; height: 50px; background-color: red; border: 1px solid black"></div>
  60. </div>
  61. </div>
  62. <input type="button" value="Get Element Dimensions" onclick="getDimensions()" />
  63. </body>
 
 

三.遍历

            ie不支持dom遍历
*深度优先遍历0
检测浏览器对DOM2级遍历能力的支持情况
            var supportsTraversals=docuemnt.implementation.hasFeature("Traversal","2.0");
            var supportsNodeIterator=(typeof document.creatNodeIterator=="function");
            var supportsTreeWalker=(typeof docuemnt.creatTreeWalker=="function");

1.NodeIterator

            document.creatNodeIterator()方法创建实例
            接受参数:
                root:想要作为搜索起点的树中的节点
                whatToShow:想要访问哪些节点的数字代码
                filter:是一个NodeFilter对象,或者一个表示应该接受还是拒绝某种特定节点的函数
                entityReferenceExpansion:布尔值,表示是否要扩展实体引用。用这个参数在HTML页面中没有用,因为其中的实体引用不能扩展。
                eg .
                <div id=" div1">
                 <p><b>hello</b>world!</p>
                <ul>
                   <li>1</li>
                    <li>2</li>
                    <li>3</li> 
               </ul>
               </div>
            想要遍历<div>元素中的所有元素:
            var div=document.getElementById("div1");
            var iterator=docuemnt.creatNodeIterator(div,NodeFilter.SHOW_ELEMENT,null,false);
            var node=iterator.nextNode();
            while(node!=null){
                alert(node.tagname);//输出标签名
                node=iterator.nextNode();    
           }
若只想要返回<li>元素:
        
  1. <head>
  2. <title>NodeIterator Example</title>
  3. <script type="text/javascript">
  4. function makeList() {
  5. var div = document.getElementById("div1");
  6. var filter = function(node){
  7. return (node.tagName.toLowerCase() == "li") ?
  8. NodeFilter.FILTER_ACCEPT :
  9. NodeFilter.FILTER_SKIP;
  10. };
  11. var iterator = document.createNodeIterator(div, NodeFilter.SHOW_ELEMENT, filter, false);
  12. //For Firefox: iterator = document.createTreeWalker(div, NodeFilter.SHOW_ELEMENT, filter, false);
  13. var output = document.getElementById("text1");
  14. var node = iterator.nextNode();
  15. while (node !== null) {
  16. output.value += node.tagName + "\n";
  17. node = iterator.nextNode();
  18. }
  19. }
  20. </script>
  21. </head>
  22. <body>
  23. <p><strong>Note:</strong> The <code>NodeIterator</code> object has only been implemented in Internet Explorer 9, Chrome, Firefox (version 3.5 and higher), Opera (version 7.6 and higher) and Safari (version 1.3 and higher). It has not been implemented in Internet Explorer or Firefox (so this example won't work).</p>
  24. <div id="div1">
  25. <p><b>Hello</b> world!</p>
  26. <ul>
  27. <li>List item 1</li>
  28. <li>List item 2</li>
  29. <li>List item 3</li>
  30. </ul>
  31. </div>
  32. <textarea rows="10" cols="40" id="text1"></textarea><br />
  33. <input type="button" value="Make List" onclick="makeList()" />
  34. </body>
 

2.TreeWalker

                nextNode()和previousNode()
                parentNode()遍历到当前节点的父节点
                firstChild():遍历到当前节点的第一个子节点
                lastChild():遍历到当前节点的最后一个子节点
                nextSibling():遍历到当前节点的下一个同辈节点
                previousSibling():遍历到当前节点的上一个同辈节点
                创建TreeWalker对象
                    document.createTreeWalker()
                        四个参数:遍历起点(根节点)、要显示的节点类型、过滤器、是否扩展实体引用的布尔值。
                        
  1. <script type="text/javascript">
  2. function makeList() {
  3. var div = document.getElementById("div1");
  4. var filter = function(node){
  5. return (node.tagName.toLowerCase() == "li") ?
  6. NodeFilter.FILTER_ACCEPT :
  7. NodeFilter.FILTER_SKIP;
  8. };
  9. var walker = document.createTreeWalker(div, NodeFilter.SHOW_ELEMENT, filter, false);
  10. var output = document.getElementById("text1");
  11. var node = walker.nextNode();
  12. while (node !== null) {
  13. output.value += node.tagName + "\n";
  14. node = walker.nextNode();
  15. }
  16. }
  17. </script>
 
            

四.范围

1.DOM中的范围

                createRange()方法
                     selectNode()选择整个节点,包括子节点
                     selectNodeContents()只选择节点的子节点
                        用DOM范围实现复杂选择
                            setStart() setEnd():参数一个参照节点和一个偏移量
                        deleteContents()
                            <p><b>he</b><b>llo</b>world</p>
                            var p1=document.getElementById("p1");
                                helloNode=p1.firstChlid.firstChild;
                                worldNode=p1.lastChild;
                                range=document.createRange();//创建范围
                                range.setStart(helloNode,2);
                                range.setEnd(worldNode,3);
                                range.deleteContents();
                                结果:
                                    <p><b>he</b>rld!</p>
                                插入DOM范围中的内容:
                                    insertNode();
                                清理DOM范围
                                    range.detach();//从文档中分离
                                    range=null;//解除引用

2.IE8及更早版本中的范围

dom2和dom3的更多相关文章

  1. 12. javacript高级程序设计-DOM2和DOM3

    1. DOM2和DOM3 DOM2级规范定义了一些模块,用于增强DOM1级.“DOM2级核心”为不同的DOM类型引入了一些与XML命名空间有关的方法,这些变化只在使用XML或者XHTML,对于HTML ...

  2. javascript高级程序设计第3版——第12章 DOM2与DOM3

    12章——DOM2与DOM3 为了增强D0M1,DOM级规范定义了一些模块. DOM2核心:为不同的DOM类型引入了一些与XML命名空间有关的方法,还定义了以编程方式创建Document实例的方法: ...

  3. Javascript高级编程学习笔记(49)—— DOM2和DOM3(1)DOM变化

    DOM变化 我们知道DOM有许多的版本,其中DOM0和DOM2这两个级别以对事件的纳入标准而为人所知 但是呢,这里不讲事件,在后面会有专门和事件有关的部分作为详细讲解 这里就只讲一下DOM2和DOM3 ...

  4. DOM2和DOM3读书笔记

    二刷<高程>做的笔记,没什么技术含量就不发到首页啦!~DOM1级主要定义HTML和XML文档底层结构,DOM2和DOM3在这个结构基础上引入更多交互能力,也支持更高级的XML特性.DOM2 ...

  5. [转]DOM0,DOM2,DOM3事件处理方式区别

    转 DOM0,DOM2,DOM3事件处理方式区别 2016年07月13日 15:00:29 judyge 阅读数:1457更多 个人分类: js与前端   引子:        文档对象模型是一种与编 ...

  6. 《JavaScript高级程序设计》笔记:DOM2和DOM3(十二)

    DOM1级主要定义的是HTML和XML文档的底层结构.DOM2级和DOM3级在这个结构基础上引入了更多的交互能力,也支持更高级的XML特性.为此DOM2级和DOM3级分为了很多的模块(模块直接具有某种 ...

  7. 全栈JavaScript之路( 二十四 )DOM2、DOM3, 不涉及XML命名空间的扩展

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/hatmore/article/details/37658167 (一)DocumentType 类型 ...

  8. dom0、dom2、dom3事件

    https://www.jianshu.com/p/3acdf5f71d5b addEventListener():可以为元素添加多个事件处理程序,触发时会按照添加顺序依次调用. removeEven ...

  9. Javascript高级编程学习笔记(54)—— DOM2和DOM3(6)范围选择

    范围 为了让开发人员更加方便地控制页面“DOM2级遍历和范围”模块定义了“范围”接口 通过该接口开发人员可以选择文档中的一个区域,而不必考虑元素的界限 在常规操作不能有效地修改文档时,使用范围往往可以 ...

随机推荐

  1. C#webform LinQ

    LinQ的高级查询: 模糊查 con.Car.Where(r=>r.Name.Contains(cname)).ToList(); 以..开头 con.car.Where(r => r.n ...

  2. opencv用imread( argv[1], 1)读取图片

    显示一幅图:主要是运用功能:imread namedWindow imshowimread:从字面意思我们就可以看懂,用来读取图片的:namedWindow:显然,我们也可以看到这是用来命名窗口名称的 ...

  3. C#中的@符号用法

    C#中的@符号其实有很多的用法,我们来看看@有什么神奇之处. 1.限定字符串 用 @ 符号加在字符串前面表示其中的转义字符“不”被处理. 如果我们写一个文件的路径,例如"D:/文本文件&qu ...

  4. Centos7 hostname重启失效

    /etc/hosts  文件如下 [root@god ~]# more /etc/hosts 127.0.0.1 localhost ::1 localhost localhost.localdoma ...

  5. Eclipse 离线安装ADT

    由于小猪的Eclipse中ADT版本过低无法打开Android项目了,所以要更新ADT(Android Develop Tools),但是在国内由于谷歌与本国微妙的关系想自动安装总是卡在某个点上. 所 ...

  6. 禁止浏览.htaccess文件

    很多黑客会攻击和利用.htaccess做网站跳转,所以保护好.htaccess文件尤为重要. 在apache的httpd.conf的配置文件中 默认是已经设置了禁止对.htaccess的访问,截取相关 ...

  7. linux与php时间函数有关的错误解决

    最近在程序里写了不少获取时间或时间戳的函数date() strtotime()等,但是把程序拿到linux上运行却爆出这些函数的错误,具体原因是因为linux本身的时间设置以及php的时区问题. 先确 ...

  8. 第一次用golang写个小程序

    1.下载go1.6并安装.我是win7系统(会自动添加GOOROOT环境变,自己建一个放go文件的工程目录并添加到环境变量中) 2.下载liteide并解压缩.(liteide查看菜单中也可编辑环境变 ...

  9. int->string-------------c

    void intToString(int n,char a[]){ int i=1,m=n; while((n/=10)!=0)  i++; int j=0; for(;j<i;j++){  a ...

  10. Android APP使用NDK编译后的ffmpeg库出现undefined reference to 'posix_memalign'错误

    在android程序中使用NDK编译后的ffmpeg库的时候出现了如下错误: jni/libs/libavutil.a(mem.o): in function av_malloc:libavutil/ ...