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