- 浏览: 1460124 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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 8618模块化高扩展性的前端框架 KISSY 注:本文为 2 ... -
构建前端 DSL
2012-10-11 22:10 5359目前在传统的软件开 ... -
KISSY kisses bootstrap navbar
2012-08-03 01:12 6028看了下 bootstrap 的导航菜单,立刻非常喜欢,注意是浅 ... -
promise api 与应用场景
2012-02-07 17:34 7375promise 是 commonjs 社区中提出的异步规范,其 ... -
unified event model
2011-10-14 23:02 1784为了处理原生事件在各 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2845简介 如果你经 ... -
cross domain request
2011-09-29 18:39 2845场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2268分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 7047作为前端开放的基础安全保证,caja 是目前比较合 ... -
ie 下 cloneNode 导致的属性克隆
2011-08-24 16:10 2475这个还是很值得记下,一直存在的很大隐患终于解决,由于在 ie& ... -
just another event model
2011-06-08 20:47 2165事件模型也算是客户端兼容性的一个长期问题,早期 jquery ... -
框架 build 系统介绍
2010-07-11 01:29 1657一个复杂的类库通常都包括很多子模块( jquery@git ... -
querySelectorAll 探讨
2010-07-01 22:35 5149随着css selector engine在越来越多的java ... -
再谈 attribute
2010-06-22 11:37 2653@slideshare 原生: ... -
事件机制探讨
2010-06-21 13:54 2222由于浏览器事件机制的不兼容性,譬如最常见的注册事件差异 ... -
利用Attribute重构:业务与UI分离
2010-06-08 16:54 1586很简单的一个应用 通过按钮来限制输入范围 ,这样的话再 ... -
yui3 loader的串行加载特性
2010-06-04 12:30 1814yui3 的沙箱机制可以在 ... -
理解YUI3 extension:Base.create
2010-05-31 03:01 1999YUI3中为了避免不必要的类继承层次,以及摆脱利用原型链模拟的 ... -
google WebFont Loader 源码阅读
2010-05-22 01:04 2780资料: 关于新发 ... -
jquery yui 对比
2010-04-29 09:58 0http://carlos.bueno.org/jq-yui. ...
相关推荐
1. 示例中展示了如何使用YUI.Ext创建一个简单的按钮,按钮点击事件触发对话框显示,并在鼠标悬停时改变图片。这段代码展示了事件监听和样式修改的方法,这对于用户交互至关重要。 2. 在LayoutDialog中添加Tabs,...
$(#standardQueryBtn).click(function(){//点击搜索按钮的触发事件 if($(#offerid).val() != ){//判断id搜索框的值是否为空 $(#dg).datagrid('load',{//调用load方法传递参数,从服务器加载新数据 offer.id:$(#...
3. **接收响应**:服务器处理请求并返回数据,XMLHttpRequest对象的onreadystatechange事件会在状态改变时触发,通过readyState和status属性判断请求是否成功,以及通过responseText或responseXML获取响应数据。...
事件可以绑定到任何组件上,从而触发特定的动作。例如,当用户点击某个按钮时,可以执行一个函数来处理这个事件。 - **Event Binding**: 开发者可以通过简单的语法绑定事件处理器,如`button.on('click', function...
- **JavaScript执行**: 记录了JavaScript执行的时间分布,以及事件触发的时间点。 - **Rendering**: 计算了页面渲染的时间,特别是DOM操作对渲染时间的影响。 - **生命周期**: 展示了页面从加载到完成渲染的整个过程...
触发Grid上的事件 - **CellClick**: 当单元格被点击时触发。 - 示例代码: ```javascript grid.on('cellclick', function(grid, rowIndex, columnIndex, e) { // 在这里处理点击事件 console.log('Cell ...
为了更好地管理和优化脚本加载,可以使用一些库,如YUI3、LazyLoad和LABjs。这些库提供延迟加载和无阻塞加载的功能,有助于在不影响页面渲染的情况下加载JavaScript。 总结提高JavaScript性能的关键点: 1. 将所有`...
-修正CheckBox控件的CheckedChanged事件会被触发两次的BUG(Data PostBack->AutoPostBack, Event PostBack->EnablePostBack)。 -为TextBox,TextArea,DatePicker,NumberBox,TriggerBox等控件增加AutoPostBack属性...
- **事件驱动模式**:通过监听特定事件(如点击、滑动等)来触发相应的行为,这种模式非常适合处理用户交互。 - **对象驱动模式**:将插件的功能组织成一个或多个对象,使得插件更加结构化和易于管理。 - **循环...
-修正CheckBox控件的CheckedChanged事件会被触发两次的BUG(Data PostBack->AutoPostBack, Event PostBack->EnablePostBack)。 -为TextBox,TextArea,DatePicker,NumberBox,TriggerBox等控件增加AutoPostBack属性...
这样做的原因是EasyUI在页面加载时会自动执行一次$.parser.parse(),但对于动态添加的元素,我们需要手动触发解析过程,以确保它们能够被正确初始化,包括按钮的图标和其他样式。 在实际应用中,你可以在Ajax请求...