Ticket #192: domcontentloaded.2.patch

File domcontentloaded.2.patch, 3.6 kB (added by sky@columbia.edu, 2 years ago)

DOMContentLoaded in MochiKit.Signal patch replacement

  • Signal.js

    old new  
    547547        } 
    548548    }, 
    549549 
     550    _browserAlreadyHasDOMContentLoaded: function () { 
     551        return (document.addEventListener); 
     552    }, 
     553 
     554    _domContentLoadListener: function (src, sig, func, obj) { 
     555        var E = MochiKit.Signal.Event; 
     556        return function(nativeEvent) { 
     557            if (nativeEvent.srcElement.readyState != "complete" ) return; 
     558            try { 
     559                nativeEvent.srcElement.parentNode.removeChild(nativeEvent.srcElement); 
     560            } catch(e) { 
     561                //pass 
     562            } 
     563            var e = new E(src, nativeEvent); 
     564            e.stop(); 
     565            e.type = function () { return sig; }; 
     566            if (typeof(func) == "string") { 
     567                return obj[func].apply(obj, [e]); 
     568            } else { 
     569                return func.apply(obj, [e]); 
     570            } 
     571        }; 
     572    }, 
     573 
    550574    _browserAlreadyHasMouseEnterAndLeave: function () { 
    551575        return /MSIE/.test(navigator.userAgent); 
    552576    }, 
     
    617641            } else { 
    618642                sig = "onmouseout"; 
    619643            } 
    620         } else { 
     644        } else if (isDOM && sig === "onDOMContentLoaded"  
     645                   && !self._browserAlreadyHasDOMContentLoaded()) { 
     646            if (/MSIE/.test(navigator.userAgent)) { 
     647                //defer script hack 
     648                document.write("<script id=__ie_init defer=true src=//:><\/script>"); 
     649                var listener = self._domContentLoadListener(src, sig, func, obj); 
     650                src = document.getElementById("__ie_init"); 
     651                sig = "onreadystatechange"; 
     652            } else { 
     653                var listener = self._listener(src, func, obj, isDOM); 
     654                sig = 'onload'; 
     655                src = window; 
     656            } 
     657        } else { 
    621658            var listener = self._listener(src, func, obj, isDOM); 
    622659        } 
    623660 
     
    629666 
    630667        var ident = [src, sig, listener, isDOM, objOrFunc, funcOrStr, true]; 
    631668        self._observers.push(ident); 
     669        src = null; 
    632670 
    633  
    634671        return ident; 
    635672    }, 
    636673 
  • DOM.js

    old new  
    613613    /** @id MochiKit.DOM.addToCallStack */ 
    614614    addToCallStack: function (target, path, func, once) { 
    615615        var self = MochiKit.DOM; 
    616         var existing = target[path]; 
    617         var regfunc = existing; 
    618         if (!(typeof(existing) == 'function' 
    619                 && typeof(existing.callStack) == "object" 
    620                 && existing.callStack !== null)) { 
    621             regfunc = self._newCallStack(path, once); 
    622             if (typeof(existing) == 'function') { 
    623                 regfunc.callStack.push(existing); 
    624             } 
    625             target[path] = regfunc; 
    626         } 
    627         regfunc.callStack.push(func); 
     616        if (MochiKit.Signal) { 
     617            MochiKit.Signal.connect(target, path, func); 
     618        } else { 
     619            var existing = target[path]; 
     620            var regfunc = existing; 
     621            if (!(typeof(existing) == 'function' 
     622                  && typeof(existing.callStack) == "object" 
     623                  && existing.callStack !== null)) { 
     624                regfunc = self._newCallStack(path, once); 
     625                if (typeof(existing) == 'function') { 
     626                    regfunc.callStack.push(existing); 
     627                } 
     628                target[path] = regfunc; 
     629            } 
     630            regfunc.callStack.push(func); 
     631        } 
    628632    }, 
    629633 
    630634    /** @id MochiKit.DOM.addLoadEvent */ 
    631635    addLoadEvent: function (func) { 
    632636        var self = MochiKit.DOM; 
    633         self.addToCallStack(self._window, "onload", func, true); 
    634          
     637        if (MochiKit.Signal) { 
     638            MochiKit.Signal.connect(self._document, "onDOMContentLoaded", func); 
     639        } else { 
     640            self.addToCallStack(self._window, "onload", func, true); 
     641        } 
    635642    }, 
    636643 
    637644    /** @id MochiKit.DOM.focusOnLoad */