一个通用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,所 ...
随机推荐
- Oracle成长点点滴滴(3)— 权限管理
上篇我们解说了创建用户以及主要的授权问题.以下我们来解说权限包含对象权限和系统权限. 事实上上节课我们解说就是系统的权限.系统权限就是一些创建表了,表空间等等的系统的权限. 1. 系统权限 ...
- ASP.NET Core Authorization
ASP.NET Core Authorization 本文目录 Asp.net Core 对于授权的改动很友好,非常的灵活,本文以MVC为主,当然如果说webapi或者其他的分布式解决方案授权,也容易 ...
- 一个大学生屌丝心中的seo梦
最 近这几天,我利用空闲时间去网上看到很多关于seoer的生存现状,尤为的感伤.因为自已也是一位爱好seo和利用闲于时间来学习seo的一个大学生屌 丝,在学习的过程中,有辛酸和泪水.但也有快乐,感觉一 ...
- 列举一些常见的Python HTTP服务器
要使 Python 写的程序能在 Web 上被访问,还需要搭建一个支持 Python 的 HTTP 服务器.下面列举一些常见的 Python HTTP 服务器,以及它们目前的大致发展情况,以便用户的对 ...
- sharepoint 2013 根据网站模版创建网站,并赋值网站权限 create a site by custom site template
通过程序,根据网站模版,创建新的网站 private void CreateSiteBySiteTemplate() { SPSecurity.RunWithElevatedPrivileges(de ...
- (step 8.2.8)hdu 1079(Calendar Game)
题目大意是: 两个家伙在区域赛前夕闲的无聊,然后玩一种无限纠结的游戏,随即给定一个日期,每次只能移动day OR month.......... 而且如果下一个月没有当前day的话, 你就不能移动mo ...
- hdu4725 The Shortest Path in Nya Graph
这道题看了下很多人都是把每一层拆成两个点然后建图做的. 我的思路很直接,也不用建图,直接在更新每个点时更新他相邻的边和相邻的层,当然前提是每个点只更新一次,每个层也只更新一次,这样才能确保时间复杂度. ...
- PHP开发经验中介(thinkphp3.2使用技巧)
1.在模板中截取字符串 {$vo.create_date|mb_substr=###,0,10,'utf-8'}
- 基于visual Studio2013解决C语言竞赛题之1075大数阶乘
题目 解决代码及点评 /************************************************************************/ /* ...
- jquery如何在加载完iframe的内容后才进行下一步操作
为iframe添加onload事件 ie使用attachEvent("onload",function(){}) firefox.chrome使用addEventListener( ...