window.onload多个共存 - 借鉴jQuery.noConflict的思路

一、背景

window.onload方法只能存在一个,如果多次赋值给window.onload,则后者会覆盖前者。

二、浅谈jQuery.noConflict的实现方式

1)源代码

// 简化抽离出来源码
(function( window, undefined ) {
    var _jQuery = window.jQuery,
        _$ = window.$;
        
    jQuery.extend({
        noConflict: function( deep ) {
            if ( window.$ === jQuery ) {
                window.$ = _$;
            }

            if ( deep && window.jQuery === jQuery ) {
                window.jQuery = _jQuery;
            }

            return jQuery;
        }
    );

  window.jQuery = window.$ = jQuery;
})(window);

2)解析

  • 缓存已有的引用
var _jQuery = window.jQuery,
      _$ = window.$;

在jQuery库想获得变量$的控制权之前,需要假设之前已经有其他库使用了变量$。
那么,就必须先把$引用存起来,以备后续判断是否可以获得控制权。

  • 根据需要,判定是否交出变量$的控制权
if ( window.$ === jQuery ) { 
    window.$ = _$;
 }

代码的含义:
如果当前变量$已由jQuery库控制,则交出控制权。还给jQuery库载入之前,变量$的拥有者。

  • 彻底交出变量jQuery的使用权
if ( deep && window.jQuery === jQuery ) {
     window.jQuery = _jQuery; 
}

代码的含义:
如果当前变量jQuery由jQuery库控制,并且是深度还原(deep),则交出jQuery的控制权。将变量jQuery的使用权交还给jQuery载入之前的使用者。

三、window.onload借鉴这种“引用缓存机制”来实现多个并存

(function(window, undefined){
    var old_onload = window.onload; // 缓存旧的onload方法
    
    // 定义新的onload
    window.onload = function(){
        console.log("wall");
        // 很多代码....
        
        typeof old_onload == "function" && old_onload(); // 执行旧的onload方法
    };
})(window);

perfect!

四、号外

吐槽下:因为公司的产品,可以让高级用户自主添加代码。一些用户申请的工商认证代码,就带有window.onload方法。
 然而,这种公用性居然没有一点包容原则,直接就把onload覆盖了!
 所以,这个思路虽好,但是也别遇到猪队友 =_=!


喜欢我文章的朋友,扫描以下二维码,关注我的个人技术博客,我的技术文章会第一时间在博客上更新

点击链接wall的个人博客

window.onload多个共存 - 借鉴jQuery.noConflict的思路_第1张图片
wall的个人博客

你可能感兴趣的:(window.onload多个共存 - 借鉴jQuery.noConflict的思路)