一个通用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,所 ...
随机推荐
- 使用struts2和poi导出excel文档
poi眼下应该是比較流行的操作excel的工具了.这几天做了个struts2和poi结合使用来实现导出excel的功能.个人认为还是比較有用的.代码阅读起来也非常easy.下来就来分享下我的心得 1 ...
- ios qq 分享 失败
1. TencentOAuth 是需要调用,但QQ代码共享是没有解释.共享代码如下面: TencentOAuth *auth = [[TencentOAuth alloc] initWithAppId ...
- android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()详解二之小秘与领导的故事
总结的不是很好,自己也有点看不懂,正好现在用到了,研究了一个,再次总结,方便大家查看 总则: 1.onInterceptTouchEvent中有个Intercept,这是什么意思呢?她叫拦截,你大概知 ...
- Service的开启和停止以及生命周期
1.清单文件 <service android:name=".TestService"></service> 2.开启Service Intent inte ...
- android listview滚动到顶部
1.为了实现类似IOS点击状态栏,列表回滚到顶部的功能(要平滑滚动效果),android上点击一个按钮或是图片什么的也可以让listview一次性滚动到顶部(滑动太多页时,一次可能滚不到顶部,使用ha ...
- Hadoop MapReduce编程的一些个人理解
首先要实现mapreduce就要重写两个函数,一个是map 还有一个是reduce map(key ,value) map函数有两个參数,一个是key,一个是value 假设你的输入类型是TextIn ...
- 【Tips】Endnote导入IEEE Xplore文献方法《转载》
1. 在IEEE XPlore中点击“Download Citation”: 2. 选中“Citation & Abstract”和“EndNote,Procite,RefMan”两个选项: ...
- C#压缩与解压
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- 基于visual Studio2013解决面试题之0506取和为m的可能组合
题目
- mfc修改应用程序外观
1.在窗口创建前修改窗体外观 在BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)函数中修改,其中CREATESTRUCT结构中有诸如窗口大小 ...