Web浏览器兼容性整理

 文档类型定义(DTD)

          浏览器会有几种工作模式,而DTD里面包含了文档的规则,浏览器会根据文档定义的DTD来解释页面的标识,并展现出来。    换句话说, DTD告诉浏览器工作在不同的模式下。

  DOCTYPE是document type(文档类型)的简写,在web设计中用来说明你用的XHTML或者HTML是什么版本。

  DOCTYPE声明 对于 建立符合标准的网页 是必不可少的关键组成部分;如果DOCTYPE不正确,标识和CSS都不会生效。

  DTD分类: 

  •  过渡的(Transitional):是要求非常宽松的DTD。一般的情况下网页中会使用此DTD,它允许你继续使用HTML4.01的标识(但是要符合xhtml 的写法)。
     
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

    2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

     

  • 严格的(Strict):要求严格的DTD。对页面的标签使用非常严格,页面里几乎不准使用 inline-style 的 CSS 样式。

     
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

    2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

     

  • 框架的(Frameset):专门针对框架页面设计使用的DTD。以前Table 满街走的年代很流行这种DTD,如果你的页面中包含有框架,需要采用这种DTD。

     
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"

    2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

     

  • 适用于手机浏览器的DTD:用于移动端开发。

     
    1. <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN"

    2. "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">

     

怎么选择DOCTYPE?

理想情况当然是严格的DTD,但对于大多数刚接触web标准的设计师来说,过渡的DTD(XHTML 1.0 Transitional)是目前理想选择。因为这种DTD还允许我们使用 表现层的标识、元素和属性,也比较容易通过W3C的代码校验。

注:上面说的"表现层的标识、属性"是指那些纯粹用来控制表现的tag。例如用于排版的表格、背景颜色标识等。在XHTML中标识是用来表示结构的,而不是用来实现表现形式,我们过渡的目的是最终实现数据和表现相分离。

判断页面有没有DTD (compated属性问题)

 
  1. document.compatMode === "BackCompat" 

  2. BackCompat 未声明的返回值

  3. CSS1Compat 已经声明的返回值

1. 事件对象

  • 获取事件对象 event。
     
    1. W3C火狐谷歌 : event 或者 在事件绑定的函数中加参,这个参数就是event.

    2. IE6、7、8 支持: window.event(不支持带参)

    3.  
    4. function (event){

    5. var event = event || window.event;

    6. // 对事件进行操作

    7. }

     

  • 获取事件的目标 target。

     
    1. W3C 浏览器: event.target

    2. IE6、7、8 : event.srcElement

    3. 兼容写法:

    4. var target = event.target || event.srcElement;

    5. var target = event.target? event.target: event.srcElement;

     

2. 获取屏幕可视区的宽高

 
  1. W3C 规 定 : window.innerWidth 和 window.innerHeight

  2. 谷歌支持声明DTD : window.documentElement.clientWidth 和 window.documentElement.clientHeight

  3. IE支持未声明DTD : window.body.clientWidth 和 window.body.clientHeight

  4. 兼容写法:

  5.  
  6. function client(){

  7. if(window.innerHeight !== undefined){ // 如果浏览器支持innerHeight属性

  8. return {

  9. "width" : window.innerWidth,

  10. "height": window.innerHeight

  11. }

  12. }else if( document.compatMode === "CSS1Compat"){ // 如果浏览器声明了DTD

  13. return {

  14. "width" : window.documentElement.clientWidth,

  15. "height": window.documentElement.clientHeight

  16. }

  17. }else{

  18. return {

  19. "width" : window.body.clientWidth,

  20. "height": window.body.clientHeight

  21. }

  22. }

  23.  
  24. }

3. 获取被卷曲的部分

 
  1. function scroll(){

  2. if( window.pageYOffset !== undefined){

  3. return {

  4. "top" : window.pageYOffset ,

  5. "left": window.pageXOffset

  6. }

  7. }else if( document.compatMode ==="CSS1Compat"){

  8. return {

  9. "top" : window.documentElement.scrollTop ,

  10. "left": window.documentElement.scrollLeft

  11. }

  12. }else{

  13. return {

  14. "top" : window.body.scrollTop,

  15. "left": window.body.scrollLeft

  16. }

  17. }

  18. }

  19.  
  20. 或者简写:

  21. function scroll(){

  22. /*

  23. * 如果这个属性存在,那么返回值 应该在 0 ~ 无穷大;

  24. * 如果没有, 返回值则是 undefined.

  25. * 只要判断 不是undefined 就可以调用此方法.

  26. */

  27. if(window.pageYOffset !== undefined){

  28. return{

  29. "top" : window.pageYOffset || documnet.body.scrollTop || documnet.documentElement.scrollTop;

  30. "left" : window.pageXOffset || documnet.body.scrollLeft || documnet.documentElement.scrollLeft;

  31. }

  32. }

  33. }

4. 光标在页面中的位置

 
  1. pageX 和 pageY 兼容性不好。

  2. 兼容写法:

  3.  
  4. 鼠标在页面中的位置 = 被卷曲的部分 + 可视区部分。

  5. pagex = event.pageX || scroll().left + event.clientX;

  6. pagey = event.pageY || scroll().top + event.clientY;

5.取消/阻止事件冒泡

不冒泡的事件有: blur 、focus、load、unload、onmouseenter、onmouseleave

判断事件是否冒泡 : event. bubbles 属性 

 
  1. document.onclick = function(event){

  2. event = event || window.event;

  3. console.log( event.bubbles);

  4. // 返回true则说明事件冒泡;否则不冒泡。

  5. }


 

取消/阻止事件冒泡: 

 
  1. W3C浏览器: 通过stopPropagation()方法阻止冒泡

  2. IE6、7、8: 通过cancelBubble属性控制是否阻止冒泡

  3.  
  4. document.onmouseenter = function(event){

  5. var event = event || window.event;

  6. if( event && event.cancelBubble){

  7. event.cancelBubble = true;

  8. }else{

  9. event.stopPropagation();

  10. }

  11.  
  12. }

6.跨浏览器的事件处理程序

    使用EventUtil对象来处理浏览器间的差异性。

 
  1. var EventUtil = {

  2. addHandler : function(element, type, handler){

  3. if ( element.addEventListener){

  4. element.addEventListener(type, handler, false);

  5. }else if( element.attachEvent){

  6. element.attachEvent("on" + type , handler);

  7. } else{

  8. element["on"+type] = handler;

  9. }

  10. },

  11. removeHandler : function(element, type, handler){

  12. if( element.removeEventListener){

  13. element.removeEventListener(type, handler, false);

  14. }else if(element.detachEvent){

  15. element.detachEvent("on"+type, handler);

  16. }else{

  17. element["on"+type] = null;

  18. }

  19. }

  20. }

7.跨浏览器的事件对象

 
  1. var EventUtil = {

  2. addHandler: function( element, type, handler){},

  3. getEvent: function(event){

  4. return event?event: window.event;

  5. },

  6. getTarget: function(event){

  7. return event.target || event.srcElement;

  8. },

  9. preventDefault : function(event){

  10. if( event.preventDefault){

  11. event.preventDefault();

  12. }else{

  13. event.returnValue = false;

  14. }

  15. },

  16. removeHandler: function( element, type, handler){},

  17. stopPropagation: function(event){

  18. if(event.stopPropagation){

  19. event.stopPropagation();

  20. }else{

  21. event.cancelBubble = true;

  22. }

  23. }

  24.  
  25. }

8.鼠标滚轮事件

 
  1. W3C浏览器: mousewheel 属性event.wheelDelta >0向上滚动

  2. Foirefox: DOMMouseScroll 属性event.detail <0 向上滚动

  3. JQuery中: event.originalEvent.wheelDelta就是指向原始的事件对象。

  4.  
  5. JQuery中兼容写法:

  6. $(document).on("mousewheel DOMMouseScroll", function (e) {

  7. var delta = (e.originalEvent.wheelDelta && (e.originalEvent.wheelDelta > 0 ? 1 : -1)) || (e.originalEvent.detail && (e.originalEvent.detail > 0 ? -1 : 1));

  8. //var delta = (event.originalEvent.wheelDelta) ? event.originalEvent.wheelDelta : -(event.originalEvent.detail || 0); //合并写法

  9. if (delta > 0) {

  10. // 向上滚

  11. console.log("wheelup");

  12. } else if (delta < 0) {

  13. // 向下滚

  14. console.log("wheeldown");

  15. }

  16. });

  17. 判断Firefox:(除了使用userAgent属性)

  18. if( document.mozHidde != undefined){

  19. //此为firefox

  20. }

  21.  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值