Here's something that had been running around my head for a while. When doing big
applications it is common to have a hidden data frame where we submit data or retrieve
data from into our web application. One common caveat is to detect that data frame's
onLoad events. Typically we would place some code in that frame's source so it informs
the caller of its loading completion and so and so on.
Another annoying situation is having a frame structure and performing some
initialization stuf each time content in one frame is changed ( creating a floating
menu inside that page, for example )
This object solves this problem by managing loads of its target frame and capturing
onloads events0. This way the loaded page itsef does not have to contain any
synchronizing code.
Here goes the code and attached is a simple example. I could have upped it via CVS but
I'm not sure about where does it fit or if it should be considered part of the API.
Maybe we need some sort of a 'misc. scrips' folder.
/*
Frame Load manager: allows to cast external file loads into a frame
and program their onload events.
IlMaestro ([EMAIL PROTECTED])
2000.13.12
Usage:
mr = new loadManager(myframe)
mr.load("p.html")
*/
loadManager = function(frame) {
this.id = "LM"+(loadManager.Count++)
window[this.id] = this
this.frame = frame
/* Should we catch links within the content, so when they are clicked the new page is
loaded via our object as well, allowing us to detect the new page's onLoad event ? */
this.catchLinks = true
this.onload = new Function()
}
/* Use this method to load urls into the target frame */
loadManager.prototype.load = function(url) {
with(this.frame.document) {
/* It seems that NS has troubles with one-frame framesets, therefore we resort to
a dummy frame that is anyway invisible */
open()
write("<frameset onLoad='window.pointerToLoader.loaded()' cols='110%,*' border=0>")
write("<frame name='"+this.id+"Content' src='"+url+"' border=0>")
write("<frame name='"+this.id+"Dummy' src='about:blank' border=0 scrolling=no>")
write("</frameset>")
close()
}
this.frame['pointerToLoader']=this
}
/* This method is called by the code we wrote into the target frame once the frameset
is loaded
( which means that the content frame has finished loading ) */
loadManager.prototype.loaded = function() {
if(this.catchLinks) this.parseLinks()
this.onload()
}
/* This method parses the links in the target document and replaces their content with
calls
to our loader. There are a number of cases to be taken into consideraration: for
example, links
in the form of 'javascript:...' must be left untouched.
I bet I'll miss some cases :(
*/
loadManager.prototype.parseLinks = function() {
eval("var e=this.frame."+this.id+"Content.document.links")
for (var i=0;i<e.length;i++) {
l = e[i].href
if(l.substring(0,11)!='javascript:' && l.substring(0,7)!='mailto:') e[i].href =
'javascript:parent.pointerToLoader.load("'+l+'")'
}
}
loadManager.Count=0
manager.zip