Ticket #192: domcontentloaded.patch

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

DOMContentLoaded in MochiKit.Signal

  • 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            nativeEvent.srcElement.parentNode.removeChild(nativeEvent.srcElement); 
     559            var e = new E(src, nativeEvent); 
     560            e.stop(); 
     561            if (typeof(func) == "string") { 
     562                return obj[func].apply(obj, [e]); 
     563            } else { 
     564                return func.apply(obj, [e]); 
     565            } 
     566        }; 
     567    }, 
     568 
    550569    _browserAlreadyHasMouseEnterAndLeave: function () { 
    551570        return /MSIE/.test(navigator.userAgent); 
    552571    }, 
     
    617636            } else { 
    618637                sig = "onmouseout"; 
    619638            } 
    620         } else { 
     639        } else if (isDOM && sig === "onDOMContentLoaded"  
     640                   && !self._browserAlreadyHasDOMContentLoaded()) { 
     641            if (/MSIE/.test(navigator.userAgent)) { 
     642                //defer script hack 
     643                document.write("<script id=__ie_init defer=true src=//:><\/script>"); 
     644                var listener = self._domContentLoadListener(src, sig, func, obj); 
     645                src = document.getElementById("__ie_init"); 
     646                sig = "onreadystatechange"; 
     647            } else { 
     648                var listener = self._listener(src, func, obj, isDOM); 
     649                sig = 'onload'; 
     650                src = window; 
     651            } 
     652        } else { 
    621653            var listener = self._listener(src, func, obj, isDOM); 
    622654        } 
    623655 
     
    629661 
    630662        var ident = [src, sig, listener, isDOM, objOrFunc, funcOrStr, true]; 
    631663        self._observers.push(ident); 
     664        src = null; 
    632665 
    633  
    634666        return ident; 
    635667    }, 
    636668 
  • 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 (s=MochiKit.Signal) { 
     617            s.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 (s=MochiKit.Signal) { 
     638            s.connect(self._document, "onDOMContentLoaded", func); 
     639        } else { 
     640            self.addToCallStack(self._window, "onload", func, true); 
     641        } 
    635642    }, 
    636643 
    637644    /** @id MochiKit.DOM.focusOnLoad */