Thanks TJ, think I get it now!

One question - since I do have multiple <div>s with a class of 'test',
it might just be easier to make them all do the same effect at once
(the user will only see one at a time anyway due to the tabs and I
can't figure out how to make the script aware of which one's current -
this value's passed in the URL so it could be admin.php#addProduct or
admin.php#addRange etc).

If I was to use this code:

document.observe("dom:loaded", function() {
  $$(div.test').each(Effect.SlideDown);
});

This applies it to all the div.tests - fine. But how can I add effect
options? I tried this and it didn't work:

document.observe("dom:loaded", function() {
  $$('#editProducts div.test').each(Effect.Fade({ duration: 3.0, from:
0, to: 1 });
});

Thanks
Matt

On Jan 15, 1:38 pm, "T.J. Crowder" <t...@crowdersoftware.com> wrote:
> Hi Matt,
>
> Yes, *slightly*:  Element#select() and $$() both return an array of
> matching (extended) elements.  So you need to index into it.
>
> If you know there will only be one and don't mind if the effect
> applies to all of them if (for whatever reason) there's more than one,
> Enumerable#each makes for a concise bit of code:
>
> document.observe("dom:loaded", function() {
>   $('editProducts').select('div.test').each(Effect.SlideDown);
>
> });
>
> Or you can combine the $() and select() using descendant selectors
> with $$():
>
> document.observe("dom:loaded", function() {
>   $$('#editProducts div.test').each(Effect.SlideDown);
>
> });
>
> (I haven't compared the performance differences between those.)
>
> Alternately, if you really only want to do it once even if there are
> multiple matches:
>
> document.observe("dom:loaded", function() {
>   var pageBox = $('editProducts').select('div.test')[0];
> // or var pageBox = $$('#editProducts div.test')[0];
>   if (pageBox) {
>     Effect.SlideDown(pageBox);
>   }
>
> });
>
> Side notes:
>
> * You don't need to return false from dom:loaded handlers.
> * You don't have to extend elements returned by $$() or Element#select
> () by passing them through $() -- that's already been done for you.
> * kangax tells me dom:loaded is unreliable in its current
> implementation on IE.  (I haven't seen a problem, but he knows this
> stuff better than I do.)  I haven't had a chance to search lighthouse
> yet to find out the whens/wherefores of that.  I believe 1.6.0.4 is
> meant to address it.
>
> HTH,
> --
> T.J. Crowder
> tj / crowder software / com
> Independent Software Engineer, consulting services available
>
> On Jan 14, 5:07 pm, Matt <guitarroman...@gmail.com> wrote:
>
> > After some tests, I can see that my code above isn't selecting the
> > element properly - am I using select() wrong?
>
> > Thanks
> > Matt
>
> > On Jan 13, 3:10 pm, Matt <guitarroman...@gmail.com> wrote:
>
> > > Hi TJ, thanks for the reply - that does sound about right for what I
> > > want, congrats!
>
> > > I tried this code:
>
> > > document.observe("dom:loaded", function() {
> > >   var pageBox = $('editProducts').select('div.test');
> > >   Effect.SlideDown($(pageBox)); return false;
>
> > > });
>
> > > the 'editProducts' part is the bit that needs to be dynamic,
> > > basically, but for now I'm trying to test it using hardcoded
> > > variables. The #editProducts div/tab definitely contains a div with a
> > > class 'test' but it doesn't run the effect when I display it. Is my
> > > syntax wrong?
>
> > > On Jan 13, 1:48 pm, "T.J. Crowder" <t...@crowdersoftware.com> wrote:
>
> > > > Hi,
>
> > > > Would the dom:loaded event[1] provide the trigger you're looking for?
> > > > Or am I missing the point, as seems likely. :-)  If the real issue is
> > > > identifying the correct div or something, it depends on how the tabs
> > > > are being done, but you should be able to figure out which tab is
> > > > "visible" and then find the appropriate error box (perhaps by
> > > > classname by using Element#select[2] on the tab's element).
>
> > > > Apologies if I've completely misunderstood and told you things you
> > > > already know. :-)
>
> > > > [1]http://prototypejs.org/api/document/observe
> > > > [2]http://prototypejs.org/api/element/select
>
> > > > HTH,
> > > > --
> > > > T.J. Crowder
> > > > tj / crowder software / com
> > > > Independent Software Engineer, consulting services available
>
> > > > On Jan 13, 11:28 am, Matt <guitarroman...@gmail.com> wrote:
>
> > > > > Hi everyone.
>
> > > > > I'm producing an admin control panel script in PHP. It uses our
> > > > > favourite JS library to produce a tabbed interface. I have a div used
> > > > > for response text which displays to the user the result of their
> > > > > actions, eg, an error ("price must be a number") or success ("product
> > > > > was added!").
>
> > > > > I want that box to fade in (or some other highlighting effect) on page
> > > > > load. The problem is, I have 5 of the boxes positioned, one for each
> > > > > tab of the interface (depending on what the user's doing at the time).
>
> > > > > How can I run a custom pageload function so that when the page
> > > > > refreshes, it applies a fade in effect to a specific div? Ideally I'd
> > > > > have a function like:
>
> > > > > function loadBox(boxID)
> > > > > {
> > > > >       Effect.SlideDown($(boxID)); return false;
>
> > > > > }
>
> > > > > and then call it like loadBox("addProductResponse") on the relevant
> > > > > tab area. Does this make sense? How can I do it?!
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Prototype & script.aculo.us" group.
To post to this group, send email to prototype-scriptaculous@googlegroups.com
To unsubscribe from this group, send email to 
prototype-scriptaculous+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to