document.documentElement 与document.boay 的区别

本文探讨了InterActiveEditor在不同IDE环境下Resize功能的行为差异,并深入分析了DOCTYPE声明如何影响浏览器的渲染模式,提供了相应的解决方案。
1.问题的 引发 重构InterActiveEditor,在 WebStorm中浏览可以进行Resize,打包到Eclipse中不能进行Resize
                        在WebStorm中document.documentElement.clientHeigh能够获取高度,
                        嵌套到portal中,
document.documentElement.clientHeigh 不能够获取到高度,是一个固定值
2.  引发问题 原因
            查看相关文档跟DTD有关
           页面具有 DTD,或者说指定了 DOCTYPE 时,使用 document.documentElement。
           页面不具有 DTD,或者说没有指定了 DOCTYPE,时,使用 document.body。


3.什么是DTD
        DTD
(Document Type Definition):文档类型定义:是一套为了进行程序间的数据交换而建立的关于标记符的语法规则:
       说白了也就是XML标记符的语法规则,是用来验证XML文件格式的验证机制,是XML的一个组成部分。
      全写
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
      可以写成
<!DOCTYPE html>

4.为什么使用 <!doctype html>
        
在写html的时候需要定义文档类型;如果没有定义,浏览器在渲染页面的时候会使用怪异模式;各个浏览器在怪异模式下对各个元素渲染是有差异的。
       
<!doctype html>是HTML5标准网页声明,如果网页开头没有定义DTD它,浏览器就会开启怪异模式(标准模式关闭)去解析网页。如果定义了它浏览器就会在严格模式(标准模式)下解析网页。
       
 IE 6 for Windows/mac, Mozilla, Safari和Opera 都实现了这两种模式,但是IE 6以下版本永远定在了怪异模式。
        
每个浏览器都有自己的方式来激活怪异模式。可查看这个清单:
http://hsivonen.iki.fi/doctype/
5.获取浏览器当前网页的渲染方式
     document.compatMode属性
        BackCompat:标准模式关闭。
        CSS1Compat:标准模式开启。
  
For example:
        当document.compatMode等于BackCompat时,浏览器客户区宽度是document.body.clientWidth;
        当document.compatMode等于CSS1Compat时,浏览器客户区宽度是document.documentElement.clientWidth。

         if (document.compatMode  ===  "BackCompat") {

               cWidth = document.body.clientWidth;
               cHeight = document.body.clientHeight;
               sWidth = document.body.scrollWidth;
               sHeight = document.body.scrollHeight;
               sLeft = document.body.scrollLeft;
               sTop = document.body.scrollTop;
         } else { //document.compatMode  ===  "CSS1Compat"
                cWidth = document.documentElement.clientWidth;
                cHeight = document.documentElement.clientHeight;
                sWidth = document.documentElement.scrollWidth;
                sHeight = document.documentElement.scrollHeight;
                sLeft = document.documentElement.scrollLeft == 0 ? document.body.scrollLeft : document.documentElement.scrollLeft;
                sTop = document.documentElement.scrollTop == 0 ? document.body.scrollTop : document.documentElement.scrollTop;
         }
这段代码主要实现了判断是否为IE浏览器,并在IE浏览器环境下获取页面滚动位置和鼠标位置的功能,以下是对代码各部分含义的详细解析: ### 1. `if (document.all)` `document.all` 是一个在旧版IE浏览器中存在的属性,现代浏览器(如Chrome、Firefox等)已经不支持该属性。因此,通过判断 `document.all` 是否存在,可以粗略地判断当前浏览器是否为IE浏览器。如果 `document.all` 存在,则表示当前使用的是IE浏览器,代码块内的逻辑将会执行。 ### 2. 页面滚动位置的获取 ```javascript x = (document.documentElement && document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : document.body.scrollLeft; y = (document.documentElement && document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop; ``` - **`x` 的计算**:`x` 代表页面水平方向的滚动位置。使用三元运算符来判断 `document.documentElement` 是否存在且 `document.documentElement.scrollLeft` 是否有值。如果条件成立,则将 `document.documentElement.scrollLeft` 的值赋给 `x`;否则,将 `document.body.scrollLeft` 的值赋给 `x`。 - **`y` 的计算**:`y` 代表页面垂直方向的滚动位置。同样使用三元运算符来判断 `document.documentElement` 是否存在且 `document.documentElement.scrollTop` 是否有值。如果条件成立,则将 `document.documentElement.scrollTop` 的值赋给 `y`;否则,将 `document.body.scrollTop` 的值赋给 `y`。 ### 3. 鼠标位置的计算 ```javascript x += window.event.clientX; y += window.event.clientY; ``` - **`window.event`**:`window.event` 是IE浏览器特有的事件对象,用于获取当前事件的相关信息。 - **`clientX` 和 `clientY`**:`clientX` 表示鼠标相对于浏览器窗口可视区域左上角的水平坐标,`clientY` 表示鼠标相对于浏览器窗口可视区域左上角的垂直坐标。 - **最终的 `x` 和 `y`**:将页面滚动位置(`x` 和 `y`)分别加上鼠标相对于浏览器窗口可视区域的坐标(`window.event.clientX` 和 `window.event.clientY`),得到鼠标相对于整个页面的实际坐标。 ### 代码示例 ```javascript if (document.all) { // 获取页面滚动位置 let x = (document.documentElement && document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : document.body.scrollLeft; let y = (document.documentElement && document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop; // 获取鼠标相对于浏览器窗口可视区域的坐标 x += window.event.clientX; y += window.event.clientY; console.log(`鼠标相对于整个页面的水平坐标: ${x}`); console.log(`鼠标相对于整个页面的垂直坐标: ${y}`); } ``` ### 总结 这段代码通过判断 `document.all` 属性来确定是否为IE浏览器,并在IE浏览器环境下获取页面的滚动位置和鼠标相对于整个页面的实际坐标。需要注意的是,`document.all` 和 `window.event` 都是旧版IE浏览器特有的属性和对象,在现代浏览器中已经不被支持,因此在实际开发中应尽量避免使用这些旧的特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值