zoukankan      html  css  js  c++  java
  • 如何实现加载DOM时执行js代码

    有一些功能需求,需要在DOM载入时马上执行一些函数,但又不愿意仅为了这一个需求而引入整个JQuery库,于是就把jQuery的方法提取出来,单独使用了。

    大家可以使用windows.onload事件,但onload在看来,就是页面上的东西(img,iframe等资源)全部都加载完毕后才能发生,如果页面内有大的图片的话,会在页面展现后好久时间后才执行。

    如果只需要对DOM进行操作,那么这时就没必要等到页面全部加载了。我们需要更快的方法。Firefox有DOMContentLoaded事件可以轻松解决,可惜的就是IE没有。

    MSDN关于JSCRIPT的一个方法有段不起眼的话,当页面DOM未加载完成时,调用doScroll方法时,会产生异常。那么我们反过来用,如果不异常,那么就是页面DOM加载完毕了。所以 对于Mozilla & Opera 浏览器,在dom树载入后有现成的 DOMContentLoaded 事件。对于Safari 浏览器,有document.onreadystatechange事件,当该触发时,如果 document.readyState=complete时,可视为dom树已经载入。

    对于ie,当在iframe内时,同样有document.onreadystatechange事件,对于ie在非iframe内时,只有不断地通过能否执行doScroll判断dom是否加载完毕。

    在本例中每间隔5毫秒尝试去执行 document.documentElement.doScroll('left')。在ie8下,貌视非iframe窗口也会有document.onreadystatechange事件,另外你也可以在构建自己的框架时使用此函数。

    (function(){
    	var isReady=false; //判断onDOMReady方法是否已经被执行过
    	var readyList= [];//把需要执行的方法先暂存在这个数组里
    	var timer;//定时器句柄
    	
    	ready=function(fn) 
    	{
    		if (isReady )
    			fn.call( document);
    		else
    			readyList.push( function() { return fn.call(this);});
    		return this;
    	}
    	var onDOMReady=function(){
    		for(var i=0;i< readyList.length;i++)
    		{
    			readyList[i].apply(document);
    		}
    		readyList = null;
    	}
    	var bindReady = function(evt)
    	{
    		if(isReady) return;
    		isReady=true;
    		onDOMReady.call(window);
    		if(document.removeEventListener)
    		{
    			document.removeEventListener("DOMContentLoaded", bindReady, false);
    		}
    		else if(document.attachEvent)
    		{
    			document.detachEvent("onreadystatechange", bindReady);
    			if(window == window.top){
    				clearInterval(timer);
    				timer = null;
    			}
    		}
    	};
    	if(document.addEventListener){
    		document.addEventListener("DOMContentLoaded", bindReady, false);
    	}
    	else if(document.attachEvent)
    	{
    		document.attachEvent("onreadystatechange", function(){
    			if((/loaded|complete/).test(document.readyState))
    			bindReady();
    		});
    	if(window == window.top)
    	{
    		timer = setInterval(function(){
    			try
    			{
    				isReady||document.documentElement.doScroll('left');//在IE下用能否执行doScroll判断 dom是否加载完毕
    			}
    			catch(e)
    			{
    				return;
    			}
    			bindReady();
    		},5);
    	}
    	}
    })();
    

    使用方法如下:

    ready(dosomething);//dosomething为已存在的函数
    //也可以通过闭包来使用
    ready(function(){
    	//这里是逻辑代码
    });
    
  • 相关阅读:
    HADOOP_HIVE安装和配置
    LInux__增加交换空间(SWAP)的大小
    ORACLE__Linux下Oracle数据库的卸载、删除
    HADOOP__HBASE集群安装(自带ZOOKEEPER)
    HADOOP__PIG安装与配置
    HADOOP__HADOOP基础安装和配置
    PYTHON__Thread达到上限的解决方案(设置线程上限)
    MYSQL__MYSQL的一些基础设置
    Android Studio Unable to access Android SDK addon list Mac
    dmg 文件打不开,双击没反应
  • 原文地址:https://www.cnblogs.com/xiaoyang002/p/4039421.html
Copyright © 2011-2022 走看看