- 浏览: 1431546 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
以前的一些总结:页面load 与 资源load ,这次提出来一个window的load事件触发问题以及解释一下在 yui3 中问题的解决。
问题:
异步脚本对页面的影响:
我们知道 window 的load事件只会在页面载入完毕后触发一次且仅一次,如果你没有在页面载入前listen这个事件,则以后都没机会了。(为了简便不使用addlistener了)
例如下面代码:
<script> setTimeout(function(){ window.onload=function(){ alert("i will not trigger,sigh !"); }; },1000); </script>
使用了yui3的异步加载脚本后,同样原理:
<script type="text/javascript" src="http://yui.yahooapis.com/3.1.0/build/yui/yui-min.js"></script> <script> YUI({filter:"DEBUG"}).use("event",function(Y){ window.onload=function(){ alert("i will not trigger,sigh !"); }; });
onload是不会触发了,但是如果你真的需要这个事件,比如整体页面图片监控等应用(yui3脚本载入时间与页面load完毕时间大小不定),yui3提供了 Y.on("load")可供你使用,下文分析一下yui3对这个问题的考虑,而正是因为这点,造成了event源码中的 if 特殊判断,影响了代码的完美性。
原理:
这部分依赖于于对yui3事件机制 的理解。既然不能等用户来绑定 onload ,yui为了解决上述问题,实际上不管用户是否需要这个load事件,都预先监听了。
1.在一开始的种子脚本 yui-min 中就listen了load,并设置全局变量代表load是否完毕:
add(window, 'load', handleLoad); handleLoad = function() { YUI.Env.windowLoaded = true; YUI.Env.DOMReady = true; if (hasWin) { remove(window, 'load', handleLoad); } };
2.在动态加载的even模块中如果页面尚未载完也进行过了监听,不过这部分实际上主要是domready的fallback处理。
3.那么在 Y.on("load")时就开始了 yui3 的事件监听处理,但是正是由于 load 的特殊处理,导致了这段代码的不一致性:
3.1 如果是load事件,且window已经load完毕(windowLoaded==true),标志马上触发
if (el == Y.config.win && type == "load") { // if the load is complete, fire immediately. // all subscribers, including the current one // will be notified. if (YUI.Env.windowLoaded) { fireNow = true; } }
但是没有做的更彻底,为了能够和 window 尚未 load完毕的情况稍微统一一点,仍然创建了 cewrapper(如果load尚未完毕就照常规监听)。
ret = cewrapper._on(fn, context, (args.length > 4) ? args.slice(4) : null); if (fireNow) { cewrapper.fire(); }
3.2 多监听器下的 fire
如下列代码:
<script type="text/javascript" src="http://yui.yahooapis.com/3.1.0/build/yui/yui-min.js"></script> <script> YUI({filter:"DEBUG"}).use("event",function(Y){ window.onload=function(){ alert("i will not trigger,sigh !"); }; Y.on("load",function(){ alert(1); },window); Y.on("load",function(){ alert(2); },window); }); </script>
如果绑定了 多个 load 监听器,按照常规的 cewrapper.fire(),则弹出 1 1 2,因为到第二次 on load 的话,实际上 cewrapper 的 subscribers 有两个了,一下子 fire 就会弹出 1,2 了.
而 fire 为了避免这点采取了3点:
3.2.1.一旦触发事件,则该事件的 fired=true ,标记事件是已经 fire 了:
fire :function(){ //..... this.fired = true; }
3.2.2.为 load 事件特殊标记,load只会真正fire一次:
if (el == Y.config.win && type == "load") { // window load happens once cewrapper.fireOnce = true; _windowLoadKey = key; }
3.2.3.如果遇到 fired 以及 fireOnce ,则 fire 直接返回,真正的触发在 on 的时候就开始了,只对当前的 一个subscriber触发
_on: function(fn, context, args, when) { //.... if (this.fireOnce && this.fired) setTimeout(Y.bind(this._notify, this, s, this.firedWith), 0);
fire: function() { if (this.fireOnce && this.fired) { return true; } //.....
总结
这样的话,尽可能的在普通事件监听的框架在解决了异步 load 的问题,虽然仍存在点 if ,但毕竟什么都没有完美的, 对于标准浏览器下的domready判断同理,但是对于ie就不一样了以后再写
评论
window.onload=function(){
alert("i will not trigger,sigh !");
};
});
這個代碼會trigger呀!
发表评论
-
模块化高扩展性的前端框架 KISSY
2013-03-14 14:58 8541模块化高扩展性的前端框架 KISSY 注:本文为 2 ... -
构建前端 DSL
2012-10-11 22:10 5280目前在传统的软件开 ... -
KISSY kisses bootstrap navbar
2012-08-03 01:12 5952看了下 bootstrap 的导航菜单,立刻非常喜欢,注意是浅 ... -
promise api 与应用场景
2012-02-07 17:34 7277promise 是 commonjs 社区中提出的异步规范,其 ... -
unified event model
2011-10-14 23:02 1740为了处理原生事件在各 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2780简介 如果你经 ... -
cross domain request
2011-09-29 18:39 2782场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2194分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 6927作为前端开放的基础安全保证,caja 是目前比较合 ... -
ie 下 cloneNode 导致的属性克隆
2011-08-24 16:10 2406这个还是很值得记下,一直存在的很大隐患终于解决,由于在 ie& ... -
just another event model
2011-06-08 20:47 2119事件模型也算是客户端兼容性的一个长期问题,早期 jquery ... -
框架 build 系统介绍
2010-07-11 01:29 1583一个复杂的类库通常都包括很多子模块( jquery@git ... -
querySelectorAll 探讨
2010-07-01 22:35 4383随着css selector engine在越来越多的java ... -
再谈 attribute
2010-06-22 11:37 2558@slideshare 原生: ... -
事件机制探讨
2010-06-21 13:54 2172由于浏览器事件机制的不兼容性,譬如最常见的注册事件差异 ... -
利用Attribute重构:业务与UI分离
2010-06-08 16:54 1532很简单的一个应用 通过按钮来限制输入范围 ,这样的话再 ... -
yui3 loader的串行加载特性
2010-06-04 12:30 1764yui3 的沙箱机制可以在 ... -
理解YUI3 extension:Base.create
2010-05-31 03:01 1954YUI3中为了避免不必要的类继承层次,以及摆脱利用原型链模拟的 ... -
google WebFont Loader 源码阅读
2010-05-22 01:04 2710资料: 关于新发 ... -
jquery yui 对比
2010-04-29 09:58 0http://carlos.bueno.org/jq-yui. ...
相关推荐
yui3-master.zip
基于YUI3的dialog组件该组件是基于YUI3开发的,功能强大,详细见http://www.qiqicartoon.com
YUI教程YUI 入门教程YUI 入门教程YUI 入门教程
在页面加载完成时候 ‘.add_project’ 元素是可以触发click时间的,当动态添加 ‘.add_project’ 时候,新添加的元素却触发不了click事件,类似下面的写法: $(".add_project").on('click', function(){ alert(...
YUI3 引入了粒度更细的模块管理方式,通过异步 HTTP 请求加载模块、然后执行回调来加载和使用模块。现场有很多人提出疑问,大家无非关心的是“效率”二字。个人以为在现阶段,这种方式有一点激进,否能为广大用户所...
从YUI2到YUI3看前端的演变
Yahoo! UI Library (YUI) 是一个开放源代码的 JavaScript 函数库,为了能建立一个高互动的网页,它采用了AJAX, DHTML 和 DOM 等程式码技术。它也包含了许多 CSS 资源。
将yuicompressor-2.4.2.jar 放在c:下,将editor.js放在c:盘下。 将editor.js进行压缩 命令为: C:\java -jar yuicompressor-2.4.2.jar editor.js -o editor2.js 参数说明: yuicompressor-2.4.2.jar 为工具包...
yui对于开发者来说是绝对的好用,开发者福利,特献上最新版
YUI 库,全称Yahoo! UI Library。是一组工具和控件,用JavaScript写成, 为的是用DOM 脚本,DHTML和AJAX等技术创建丰富的网页交互式应用程序。 YUI 基于BSD协议,对所有的使用方式都是免费的。YUI 项目包括YUI 库和两...
YUI3 源码 非compress版 YUI3 源码 非compress版 YUI3 源码 非compress版
yui官网下载的。内容很全,示例+doc说明
本书作者便是在此背景下,以国外最优秀的JavaScript框架之一——Yahoo User Interface Library(简称YUI)的最新版本YUI 3.15为基础编写而成。本书通过通俗易懂的语言和大量丰富的实例,帮助读者解决实际生产环境...
YUI Test is a complete testing framework for JavaScript and Web applications. You can use the simple JavaScript syntax to write unit tests that can be run in web browsers or on the command line, as ...
yui_2.6.0r2 yui_2.6.0r2 yui_2.6.0r2 yui_2.6.0r2 yui_2.6.0r2
NULL 博文链接:https://ttwang.iteye.com/blog/1741631
yui 源码下载,3.9.0 r2 包,最新版本
YUI Compressor非常好用,特别是JS的混淆是众多JS Coding的最爱。可惜官网提供的版本都不具备右键功能,每次压缩都要cmd输入一些命令实在是繁琐,本文就介绍如何给YUI Compressor添加右键命令,方便使用。 网上已有...
雅虎的东西,简单的操作很好用 使用例子:java -jar D:\yuicompressor\yuicompressor\yuicompressor.jar E:\js\all.js -o E:\wap\wap2\js\all-min.js --charset utf-8 当然要装jdk了 不然就玩完了