[Zope-dev] Javascript wizards wanted for Zope project
Martijn Pieters
mj@antraciet.nl
Wed, 17 Nov 1999 10:29:41 +0100
I know you have been given many answers, but I'll bud in anyway. I've done
way too much JavaScript, I like to think I know it's pitfalls.
At 02:45 17/11/99 , Anthony Pfrunder wrote:
>The problem is: how do I get a form to talk to an object in another frame?
>ie:
>
><input value=".." ... onchange="mywidget.setAttribute('property',
>value-of-inputbox)>
>
>where mywidget is a javascript function defined in another (loaded) frame.
You can just refer to it's name via the frameset that defines it, like
parent.nameofotherframe,mywidget.setAttribute(), but you can never be sure
that the other frame has been loaded.
To get around this problem, I use an asynchronous message broker in the
parent frame. The calling frame checks for a boolean property on it's
parent to check wether or not it is capable of doing the messaging, then
calling a method on this parent that'll pass on the message to the
receiving frame:
onLoad="if (parent.bIsTop) parent.setMenu('foo')"
The receiving frame sets a boolean flag on the same parent frame to signal
it is ready to receive messages:
onLoad="if (parent.bIsTop) parent.bNavLoaded = true;"
You can now use setTimeout, and a counter, to pass the message on. As long
as bNavLoaded (the flag indicating messages can be passed on) is false, and
we haven't tried too many times yet, wait a specified time and try again.
A real life example using two way message passing is used on
http://www.marantz.com/, in both the Hifi and Professional sections
(altough I don't think the Professional section is live yet).
In the Hifi section, the navigation frame signals the right hand frame on
mouse-over events to show descriptions of the menu choices, and the right
hand frame, when deeper into the site, signals the navigation frame to tell
it what menu option to display. This way the user can use te back and
forward buttons of his browser to step through it's browsing history, and
the navigation menu follows suit.
>Also, how can I "call" a html page without causing a reload:
>
>function jsZDOMsetAttribute(name, value){
> call("getWidget/setAttribute?name=name&value=value")
>}
>
>For further information on this problem please see
>http://163.182.196.200/zwiki/VisualZope - jsZDOM reflecter part.
For this one you'll need a hidden frame (width or height of 0), or you
could use a hidden DynDuo Layer and use it's load method:
http://www.dansteinman.com/dynduo/en/dynlayer-common.html
You should be able to then also read attributes from the server with this.
Just have the server return a page with javascript in it that does the
trick. Just remember, that you cannot wait for the page to load and expect
it to return a value, you'll have to write something asynchronous (and
non-blocking, Navigator's Javascript implementation is single threaded, use
setTimeout) to retrieve the value.
--
Martijn Pieters, Web Developer
| Antraciet http://www.antraciet.nl
| Tel: +31-35-7502100 Fax: +31-35-7502111
| mailto:mj@antraciet.nl http://www.antraciet.nl/~mj
| PGP: http://wwwkeys.nl.pgp.net:11371/pks/lookup?op=get&search=0xA8A32149
------------------------------------------