Thank you, I'll try this out.  Is this a fix that would be worked into
the API?  Has it been reviewed by any of the codemiesters?
 
M.

        -----Original Message----- 
        From: Michael Bürge 
        Sent: Wed 2/7/2001 11:32 AM 
        To: [EMAIL PROTECTED] 
        Cc: 
        Subject: Re: [Dynapi-Dev] New Developer Wants To Help With
Mac(contentsize)
        
        

        > My personal main problem on the mac is the
getContentHeight/Width methods...
        > You cannot make layer, fill it, and have it autosize to its'
contents.  If I
        > am wrong about this someone please let me know.
        
        you are wrong!!
        
        check out the following:
        (btw: i already posted this a few days ago, but nobody noticed
it, so i'm
        posting it again. i would be pleased to see some comments this
time.)
        
        
        ie5/mac:
        this browser needs some time to update the
scrollWidth/Height-values, so i
        store the old values of the contentSize and then call a function
that loops
        with a timeout until the values have changed (or a maximum of
retries is
        reached). the 'onload'-event isn't invoked until that moment.
this means
        that everything that needs the size of the content has to wait
for the
        'onload'-event to be invoked.
        
        ns5:
        i found that elm.scrollWidth and elm.scrollHeight in ns5 contain
the correct
        values if elm.style.width/height is set to 'auto', so what i did
in
        Dynlayer.prototype.getContentWidth() is setting the
elm.style.width to
        'auto', retrive the scrollWidth, and then changing the value of
        elm.style.width again to the original value. this causes a short
flickering,
        because when set to 'auto', ns5 adjust the size of the layer to
the
        contentSize, but at least i get the correct size of the content.
        
        
        since the setHTML() method of a DynLayer is the only place where
the size of
        the content can be changed there's no need for accessing the
browsers object
        every time the contentsize is needed, so i introduced two new
properties to
        the DynLayer: contentW and contentH (they are updated every time
setHTML()
        is called)
        
        i made a demonstration page available on the web:
        
http://n.ethz.ch/student/mibuerge/dynapi/examples/contentsize.htm
        
        
        
        the pieces of code i changed in "dynlayer.js":
        
        /* ... */
        
        DynLayer.prototype.toString=function () {
            return
        
(this.elm)?'DynAPI.getDocument("'+this.dyndoc.id+'").all["'+this.id+'"]'
:'Dy
        nLayer.unassigned["'+this.id+'"]';
        };
        // replaced check for this.created with this.elm
        
        
        /* ... */
        
        DynLayer.prototype.setHTML=function(html,noevt) {
            this.html=html?html:'';
            if (this.css==null) return;
            this.invokeEvent("beforeload");
           
            // saving the actual size of the content
            if (is.ie5 && is.platform == 'mac') {
                this.lastContentW = this.contentW ||
this.getContentWidth();
                this.lastContentH = this.contentH ||
this.getContentHeight();
            }
           
            this.elm.innerHTML=html;
            if (is.ns4) {
                this.doc.open();
                this.doc.write(html);
                this.doc.close();
                    for (var i in this.doc.images)
this.doc.images[i].lyrobj=this;
                    for (i=0;i<this.doc.links.length;i++)
        this.doc.links[i].lyrobj=this;
            }
            else if (is.ns5) {
                while (this.elm.hasChildNodes())
        this.elm.removeChild(this.elm.firstChild);
                var r=this.elm.ownerDocument.createRange();
                r.selectNodeContents(this.elm);
                r.collapse(true);
                var df=r.createContextualFragment(html);
                this.elm.appendChild(df);
                    for (var i in this.doc.images)
        this.doc.images[i].lyrobj=this.elm;
            }
            else {   
                //for (var i in this.elm.all.tags("img"))
        this.elm.all.tags("img")[i].lyrobj=this;
            }
            this.updateContentSizeValues(noevt)
        };
        
        /* ... */
        
        DynLayer.prototype.getContentWidth=function() {
            if (this.elm==null) return 0;
            else if (is.ns4) return this.doc.width;
            else if (is.ns5) {
                this.elm.style.width = "auto";  // makes the offsetWidth
available
                var w = this.elm.offsetWidth;
                this.elm.style.width = this.w;  // restore the width
                return w;
            }
            else if (is.ie) return parseInt(this.elm.scrollWidth);
            else return 0;
        };
        DynLayer.prototype.getContentHeight=function() {
            if (this.elm==null) return 0;
            else if (is.ns4) return this.doc.height;
            else if (is.ns5) {
                this.elm.style.height = "auto";
                var h = this.elm.offsetHeight;
                this.elm.style.height = this.h;
                return h;
            }
            else if (is.ie) return parseInt(this.elm.scrollHeight);
            else return 0;
        };
        DynLayer.prototype.updateContentSizeValues = function(noevt) {
            if (is.ie5 && is.platform == 'mac') {
            this.chkTimer = setTimeout(this +
        '.checkForContentSizeUpdate(1,'+!(noevt==false)+')',0);
            return;
            }
        
            this.contentW = this.getContentWidth();
            this.contentH = this.getContentHeight();
            if (noevt!=false) this.invokeEvent('load');
        }
        
        DynLayer.prototype.checkForContentSizeUpdate =
function(retry,noevt) {
            var w = this.getContentWidth();
            var h = this.getContentHeight();
            // check for changed values
            if (this.lastContentW != w || this.lastContentH != h) {
            this.lastContentW = this.lastContentH = null;
            this.contentW = w;
            this.contentH = h;
            if (noevt!=false) this.invokeEvent('load');
            }
            else if (retry < DynLayer.maxRetries) {
            clearTimeout(this.chkTimer)
            setTimeout(this +'.check4ContentSizeUpdate(' +(retry+1)
        +','+!(noevt==false)+')',30);
            }
            else if (noevt!=false) this.invokeEvent('load');
        
        }
        DynLayer.maxRetries = 5;
        
        /* ... */
        
        
        --
        Michael Buerge
        
        
        _______________________________________________
        Dynapi-Dev mailing list
        [EMAIL PROTECTED]
        http://lists.sourceforge.net/lists/listinfo/dynapi-dev
        

winmail.dat

Reply via email to