domReady的兼容性实现方法

一、为何要实现domReay方法?

举例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>domready</title>
    <script src="domready.js"></script>
    <script>
          document.getElementById(‘p01‘).style.color=‘#ff0000‘; //抛出错误 TypeError: document.getElementById(...) is null
    </script>
</head>
<body>
    <p id="p01">javascript中domready的实现方法</p>
</body>
</html>

我们需要给一些元素的事件绑定处理函数。但问题是,如果那个元素还没有加载到页面上,但是绑定事件已经执行完了,是没有效果的,如上所示。

平时我们都是如此做:

  <script>
    window.onload=function(){
        document.getElementById(‘p01‘).style.color=‘#ff0000‘;
    }
  </script>

onload 事件触发时,需要等待页面上所有的DOM,样式表,脚本,图片,flash都已经加载完成。

DOMContentLoaded 事件触发时,仅当DOM加载完成,不包括样式表,图片,flash。

这两个事件大致就是用来避免这样一种情况,将绑定的函数放在这两个事件的回调中,保证能在页面的某些元素加载完毕之后再绑定事件的函数。

当然DOMContentLoaded机制更加合理,因为我们可以容忍图片,flash延迟加载,却不可以容忍看见内容后页面不可交互。

二、domReady实现

function domReady(fn){
    //现代浏览器支持方法
    if(document.addEventListener){
        document.addEventListener(‘DOMContentLoaded‘, fn , false);
    }else {
        IEContentLoaded(fn);
    }

    //IE下模拟DOMContentLoaded
    function IEContentLoaded(fn){
        var d = window.document;
        var flag = false;

        //只执行一次用户的回调函数init()
        var init = function () {
            if(!flag){
                flag = true;
                fn();
            }
        };

        //自执行匿名函数
        (function () {
             try {
                 // DOM树未创建之前调用doScroll会抛出错误
                  d.documentElement.doScroll(‘left‘);
              } catch(e) {
                  // 延迟再执行一次
                  setTimeout(arguments.callee, 50);
                  return;
              }
              //没有错误就表示DOM树创建完毕,然后立即执行用户回调
              init();
        })();

        //监听document的加载状态
        d.onreadystatechange = function () {
            //如果是在domready之后绑定的函数,就立马执行
            if(d.readyState == ‘complete‘){
                d.onreadystatechange = null;
                init();
            }
        }

    }
}

HTML代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>domready</title>
    <script src="domready.js"></script>
    <script>
        domReady(function () {
             document.getElementById(‘p01‘).style.color=‘#ff0000‘;
        })
    </script>
</head>
<body>
    <p id="p01">javascript中domready的实现方法</p>
</body>
</html>
时间: 2024-11-01 13:29:06

domReady的兼容性实现方法的相关文章

笔记-[js兼容]-滚动条的滚动距离的兼容性问题解决方法。

在我们操作JS实现些效果的时候,可能会涉及到滚动条滚动距离的问题; 在IE和非IE下是存在兼容性问题的 在IE下支持:document.body.scrollTop(scrollLeft);//在ie下获取滚动条距离的属性 在非IE下支持:document.documentElement.scrollTop(scrollLeft);//在非ie下获取滚动条距离的属性 代码兼容: var scrollTop;//定义一个变量名为scrollTop为滚动条的距离 滚动高度 :  var scroll

Prototype与jQuery冲突|兼容性问题解决方法

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf

CSS浏览器兼容性问题解决方法总结

CSS浏览器兼容解决总结如下: 1. CSS中几种浏览器对不同关键字的支持,可进行浏览器兼容性重复定义 !important 可被FireFox和IE7识别 * 可被IE6.IE7识别 _ 可被IE6识别 *+ 可被IE7识别 区别IE6与FF: background:orange;*background:blue;区别IE6与IE7: background:green !important;background:blue;区别IE7与FF: background:orange; *backgr

测试web网站兼容性的方法

随着操作系统,浏览器越来越多样性,导致软件兼容性测试在目前软件测试领域占有很重要的地位,无论是B/S架构还是C/S架构的软件都需要进行兼容性测试,为了充分保证产品的平台无关性,使用户充分感受到软件的友好. 方法/步骤 操作系统/平台兼容: 常见的操作系统有windows.unix.linux等,对于普通用户来讲,最常用的是Windows操作系统.Windows操作系统包括Windows XP,windows 2003,vista,Win2000/NT,Windows9x等等,每个软件产品的兼容性

getElementsByClassName 方法兼容性封装方法二

var getElmsByClsName = function(className, results) { results = results || []; // 判断浏览器是否支持 getElementsByClassName if(document.getElementsByClassName) { // 浏览器支持这个方法 results.push.apply( results, document.getElementsByClassName(className) ); } else {

IE6,IE7,IE8 css bug搜集及浏览器兼容性问题解决方法汇总

http://www.jb51.net/css/85640.html 断断续续的在开发过程中收集了好多的bug以及其解决的办法,都在这个文章里面记录下来了!希望以后解决类似问题的时候能够快速解决,也希望大家能在留言里面跟进自己发现的ie6 7 8bug和解决办法! 1:li边距“无故”增加  任何事情都是有原因的,li边距也不例外.  先描述一下具体状况:有些时候li边距会突然增 加很多,值也不固定(只在IE6/IE7有这种现象),让人摸不着头脑,仔细“研究”发现是由于其低级元素ul的paddi

浏览器hack总结 详细的浏览器兼容性解决方法

由于各浏览器对页面的解析不同,会导致页面在不同浏览器中显示的样式不一致,为了保持页面的统一,经常需要对浏览器进行兼容性问题的调试. CSS Hack 面对浏览器诸多的兼容性问题,经常需要通过CSS样式来调试,其中用的最多的就是CSS Hack.所谓CSS Hack就是针对不同的浏览器书写不同的CSS样式,通过使用某个浏览器单独识别的样式代码,控制该浏览器的显示效果.CSS Hack主要分为两类 CSS 选择器Hack CSS选择器Hack是指通过在CSS选择器的前面,加上一些只有特定浏览器才能识

JS常用事件兼容性处理方法

event.js文件 //跨浏览器事件处理程序[根据能力检测调用] var EventObject = { //添加事件AddEvent:function(obj , type , eventFn){if(obj.addEventListener){//常用obj.addEventListener(type , eventFn , false);}else if(obj.attachEvent){//IE8及以下obj.attachEvent('on'+type , eventFn);}else

【转】 IE6 IE7 IE8 css bug兼容性解决方法总结归纳

1:li边距“无故”增加 任何事情都是有原因的,li边距也不例外. 先描述一下具体状况:有些时候li边距会突然增 加很多,值也不固定(只在IE6/IE7有这种现象),让人摸不着头脑,仔细“研究”发现是由于其低级元素ul的padding引 起,padding的上下值对li有影响,左右无影 响.所以只好笨手笨脚地把padding去掉,换成margin.这是能解决问题,但往往不是我们想要的结果,或许 还会引起其他不必要的怪现象. 现在终于发现解决这个问题的方法,其实很简单,既然是有ul引 起的,就设置