yui3下的load事件触发

本文探讨了异步脚本对页面load事件的影响及YUI3提供的解决方案。通过预监听load事件并设置全局变量,确保即使在页面加载完成后也能响应事件绑定。此外,文章还分析了多监听器情况下事件触发的细节。

以前的一些总结:页面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就不一样了以后再写

 

基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)内容概要:本文档围绕基于遗传算法的异构分布式系统任务调度算法展开研究,重点介绍了一种结合遗传算法的新颖优化方法,并通过Matlab代码实现验证其在复杂调度问题中的有效性。文中还涵盖了多种智能优化算法在生产调度、经济调度、车间调度、无人机路径规划、微电网优化等领域的应用案例,展示了从理论建模到仿真实现的完整流程。此外,文档系统梳理了智能优化、机器学习、路径规划、电力系统管理等多个科研方向的技术体系与实际应用场景,强调“借力”工具与创新思维在科研中的重要性。; 适合人群:具备一定Matlab编程基础,从事智能优化、自动化、电力系统、控制工程等相关领域研究的研究生及科研人员,尤其适合正在开展调度优化、路径规划或算法改进类课题的研究者; 使用场景及目标:①学习遗传算法及其他智能优化算法(如粒子群、蜣螂优化、NSGA等)在任务调度中的设计与实现;②掌握Matlab/Simulink在科研仿真中的综合应用;③获取多领域(如微电网、无人机、车间调度)的算法复现与创新思路; 阅读建议:建议按目录顺序系统浏览,重点关注算法原理与代码实现的对应关系,结合提供的网盘资源下载完整代码进行调试与复现,同时注重从已有案例中提炼可迁移的科研方法与创新路径。
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)内容概要:本文提出了一种基于非支配排序的蜣螂优化算法(NSDBO),用于求解微电网多目标优化调度问题。该方法结合非支配排序机制,提升了传统蜣螂优化算法在处理多目标问题时的收敛性和分布性,有效解决了微电网调度中经济成本、碳排放、能源利用率等多个相互冲突目标的优化难题。研究构建了包含风、光、储能等多种分布式能源的微电网模型,并通过Matlab代码实现算法仿真,验证了NSDBO在寻找帕累托最优解集方面的优越性能,相较于其他多目标优化算法表现出更强的搜索能力和稳定性。; 适合人群:具备一定电力系统或优化算法基础,从事新能源、微电网、智能优化等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于微电网能量管理系统的多目标优化调度设计;②作为新型智能优化算法的研究与改进基础,用于解决复杂的多目标工程优化问题;③帮助理解非支配排序机制在进化算法中的集成方法及其在实际系统中的仿真实现。; 阅读建议:建议读者结合Matlab代码深入理解算法实现细节,重点关注非支配排序、拥挤度计算和蜣螂行为模拟的结合方式,并可通过替换目标函数或系统参数进行扩展实验,以掌握算法的适应性与调参技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值