Ticket #192: domcontentloaded.3.patch

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

same patch, this time safer to use on DOM nodes besides document

  • 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            var s=nativeEvent.srcElement; 
     558            if (s.readyState != "complete" ) return; 
     559            try { 
     560                if (s.id=="__ie_init") { 
     561                    s.parentNode.removeChild(s); 
     562                } 
     563            } catch(e) { 
     564                //pass 
     565            } 
     566            var e = new E(src, nativeEvent); 
     567            e.stop(); 
     568            e.type = function () { return sig; }; 
     569            if (typeof(func) == "string") { 
     570                return obj[func].apply(obj, [e]); 
     571            } else { 
     572                return func.apply(obj, [e]); 
     573            } 
     574        }; 
     575    }, 
     576 
    550577    _browserAlreadyHasMouseEnterAndLeave: function () { 
    551578        return /MSIE/.test(navigator.userAgent); 
    552579    }, 
     
    617644            } else { 
    618645                sig = "onmouseout"; 
    619646            } 
    620         } else { 
     647        } else if (isDOM && sig === "onDOMContentLoaded"  
     648                   && !self._browserAlreadyHasDOMContentLoaded()) { 
     649            if (src.readyState) { 
     650                var listener = self._domContentLoadListener(src, sig, func, obj); 
     651                //defer script hack for IE 
     652                if (src == document) { 
     653                    document.write("<script id=__ie_init defer=true src=//:><\/script>"); 
     654                    src = document.getElementById("__ie_init"); 
     655                } 
     656                sig = "onreadystatechange"; 
     657            } else { 
     658                var listener = self._listener(src, func, obj, isDOM); 
     659                sig = 'onload'; 
     660                if (src == document) { 
     661                    src = window; 
     662                } 
     663            } 
     664        } else { 
    621665            var listener = self._listener(src, func, obj, isDOM); 
    622666        } 
    623667 
     
    629673 
    630674        var ident = [src, sig, listener, isDOM, objOrFunc, funcOrStr, true]; 
    631675        self._observers.push(ident); 
     676        src = null; 
    632677 
    633678 
    634679        return ident; 
  • 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 */