一个通用onReady函数的实现
define([], function(){
function onReady(fn) {
var DOC = document,
html = DOC.documentElement,
W3C = document.dispatchEvent;
//FF曾经是没有readyState属性的
//推断body是否存在来决定DOM文档是否载入完成
if (!DOC.readyState) {
var readyState = DOC.readyState = DOC.body ? "complete" : "loading";
}
//假设页面已经全然载入完成直接运行回调函数
if (DOC.readyState === "complete") {
setTimeout(fn);
//现代游览器和IE>=IE9
} else if (W3C) {
DOC.addEventListener('DOMContentLoaded', function(){
if (readyState) {
DOC.readyState = 'complete';
}
fn();
}, false);
} else {
ieReady(fn);
}
}
function ieReady(fn) {
try {
//处理iframe中的页面在IE下无法通过doScroll推断DOM知否载入完成
if (self !== top && self.document.readyState !== 'complete') {
setTimeout(function(){
ieReady.call(window, fn)
})
} else if (self !== top && self.document.readyState === 'complete') {
arguments[0]();
} else {
document.documentElement.doScroll('left');
arguments[0]();
}
} catch (e) {
setTimeout(function(){
ieReady.call(window, fn)
})
}
};
AS.extend({
'onReady': onReady
});
return onReady;
})
修正一个重大bug,ready函数是不能在AMD中定义从而异步载入的,由于DOMContentLoaded监听的触发时机是在DOM和JS.CSS载入运行完成后,但有一个例外就是JS假设是动态载入进来的,DOMContentLoaded不会等待这个异步载入的js,所以假设将绑定DOMContentLoaded事件的函数写在动态载入的js中,有一个可能就是Dom已经载入完成但动态载入的js中的为DOMContentLoaded绑定监听的代码还没有运行,所以非常有可能你为DOMContentLoaded绑定的监听不会运行.
一个通用onReady函数的实现的更多相关文章
- IMP本质上是一个通用的函数指针
IMP:通用的函数指针 /// A pointer to the function of a method implementation. #if !OBJC_OLD_DISPATCH_PROTOTY ...
- Linux C编程学习之开发工具3---多文件项目管理、Makefile、一个通用的Makefile
GNU Make简介 大型项目的开发过程中,往往会划分出若干个功能模块,这样可以保证软件的易维护性. 作为项目的组成部分,各个模块不可避免的存在各种联系,如果其中某个模块发生改动,那么其他的模块需要相 ...
- 通用js函数集锦<来源于网络> 【二】
通用js函数集锦<来源于网络> [二] 1.数组方法集2.cookie方法集3.url方法集4.正则表达式方法集5.字符串方法集6.加密方法集7.日期方法集8.浏览器检测方法集9.json ...
- 通用js函数集锦<来源于网络/自己> 【一】
通用js函数集锦<来源于网络/自己>[一] 1.返回一个全地址2.cookie3.验证用户浏览器是否是微信浏览器4.验证用户浏览器是否是微博内置浏览器5.query string6.验证用 ...
- 如何实现一个通用的IHttpHandler 万能的IHttpHandler HttpWebRequest文件上传
昨天遇到一个比较奇怪的需求,大致是需要在服务器上部署一个http服务,但是服务的具体功能不知道,以后在客服端实现.这里介绍一下系统背景,有一个系统运(部署在美国)行了很多年了,给系统产生了很多文件,现 ...
- django 创建一个通用视图
创建一个通用视图 抽取出我们代码中共性的东西是一个很好的编程习惯. 比如,像以下的两个Python函数: def say_hello(person_name): print 'Hello, ...
- Django创建通用视图函数
想在我们有两个视图: def thinkingview(request): user = request.user if request.method == 'GET': return render( ...
- rabbitmq 生产者 消费者(多个线程消费同一个队列里面的任务。) 一个通用rabbitmq消费确认,快速并发运行的框架。
rabbitmq作为消息队列可以有消息消费确认机制,之前写个基于redis的通用生产者 消费者 并发框架,redis的list结构可以简单充当消息队列,但不具备消费确认机制,随意关停程序,会丢失一部分 ...
- 如何为 Go 设计一个通用的日志包
需求 一个通用的日志包,应该满足以下几个需求: 兼容 log.Logger,标准库大量使用了 log.Logger 作为其错误内容的输出通道,比如 net/http.Server.ErrorLog,所 ...
随机推荐
- PHP - 日期与时间
第10章 日期与时间 学习要点: 1.PHP日期和时间库 使用PHP编程时,与你遇到的大多数其他类型的数据相比,日期和时间有很大不同.因为日期和时间没有明确的结构,并且日期的计算和表示也很麻烦.在PH ...
- Java基础07 包
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们已经写了一些Java程序.之前的每个Java程序都被保存为一个文件,比如Tes ...
- Spring MVC 学习笔记 json格式的输入和输出
Spring mvc处理json需要使用jackson的类库,因此为支持json格式的输入输出需要先修改pom.xml增加jackson包的引用 <!-- json --> <dep ...
- sql:oracle, CURSOR
CursorsYou use a cursor to fetch rows returned by a query. You retrieve the rows into the cursor usi ...
- windows 2003 DNS服务的重建
DNS的重建 网络上转载之文章,据说来自微软官方,留下一份自己用,曾经帮助我解决了DNS方面的困扰,希望能给大家带来帮助 1.打开dns管理器,删除domain.com区域,如果存在_msdcs.do ...
- 大数据高并发系统架构实战方案(LVS负载均衡、Nginx、共享存储、海量数据、队列缓存)
课程简介: 随着互联网的发展,高并发.大数据量的网站要求越来越高.而这些高要求都是基础的技术和细节组合而成的.本课程就从实际案例出发给大家原景重现高并发架构常用技术点及详细演练. 通过该课程的学习,普 ...
- win2k/xp查看当前进程
win2k/xp查看当前进程 tasklist tasklist | find "关键字" 可以对结果进行过滤 关闭当前某个进程 taskkill /pid 程序的PID号码 wi ...
- 获取字符宽度:并非自适应。coretext去计算
获取字符宽度:并非自适应.coretext去计算 UniChar ch = [ns_str characterAtIndex:0]; CGGlyph glyph = 0; CTFontGetGlyph ...
- ASP.NET - TreeView
设置节点图片 : Windows资源管理器左侧的树型资源结构图中,各节点都有图片连接,例如磁盘的图片.光盘的图片和文件夹的图片等,使资源的表现更加形象.IEWebControls的TreeView控件 ...
- MSSQL - 用GUID值来完成数据表行标识
地址:http://www.cnblogs.com/huangfr/archive/2012/03/28/2420780.html [Guid] [uniqueidentifier] NOT NULL ...