I left out one line of code in my previous reply. Add this line before the
two function definitions:

    var head = document.getElementsByTagName('head')[0];

Oops! :-)

-Mike

> From: Michael Geary
> 
> You are definitely on the right track, Gordon.
> 
> Here's the code you need:
> 
>     // Add a stylesheet with the given CSS styles (a text string)
>     // and return a reference to it
>     function addStyleSheet( css ) {
>         var sheet = document.createElement( 'style' );
>         sheet.type = 'text/css';
>         head.appendChild(  sheet );
>         if( sheet.styleSheet )
>             sheet.styleSheet.cssText = css;
>         else
>             sheet.appendChild( document.createTextNode(css) );
>         return sheet;
>     }
>     
>     // Replace a stylesheet with new CSS styles (a text string)
>     // and return a reference to it
>     function changeStyleSheet( sheet, css ) {
>         if( sheet.styleSheet )
>             sheet.styleSheet.cssText = css;
>         else
>             sheet.replaceChild(
>                 document.createTextNode(css), sheet.firstChild );
>         return sheet;
>     }
>     
>     // Example - add an empty stylesheet and then
>     // replace it with new styles
>     var sheet = addStyleSheet( '' );
>     changeStyleSheet( sheet,
>         '#test-id { /*...*/ } .test-class { /*...*/ }' );
> 
> Note that you don't try to access any existing stylesheet in 
> your document.
> You could do that, but I think it's better to create a new 
> sheet dynamically
> just for this purpose.
> 
> Given this code, can you think of a way to set all four 
> position and size
> values for *all* of your elements in a single 
> changeStyleSheet() call, so
> that you won't have to set any style attributes directly on the DOM
> elements? That would make your animation even faster than you 
> are hoping
> for.
> 
> If the answer doesn't jump out at you, give me a shout back 
> and I'll post a
> more detailed example.
> 
> -Mike 
> 
> > From: Gordon
> > 
> > When working with jquery and javascript in general I have 
> > found that manipulating DOM attributes, especially those 
> > associated with the appearence of an element, can be rather 
> > slow.  In one script I am working on I have to animate a 
> > group of elements at once, but each element has to get a 
> > different top and left position. This means that each element 
> > must get its own top and left styles.
> > 
> > Another thing the loop has to do is change the width and 
> > height of the elements being processed, but in this case all 
> > elements get the same dimensions.
> > 
> > The loop currently manipulates 4 attributes per element 
> > (style.width, style.height, style.top, style.left) and can 
> > get rather slow when working with a large number of elements.
> > 
> > this.each (function (thisElemNum)
> > {
> >     var elem = $(this);
> >     // Calculate the new position and dimensions for the element
> >     var newProps    = {
> >             left    : someLeftVal,
> >             top     : someTopVal,
> >             width   : 100,
> >             height  : 100
> >     };
> >     elem.animate (newProps, speed)
> > });
> > 
> > (The width and height can change from one invokation of the 
> > loop to the next, but for each invokation they remain 
> constant for all
> > iterations)
> > 
> > One idea that occured to me is that instead of animating the 
> > width and height on a per-element basis, I could use CSS to 
> > define the width and height and then animate those attributes 
> > by changing the width and height degined in the stylesheet.  
> > This would mean only animating 2 attributes per element, plus 
> > a further 2 in the stylesheet as opposed to 4 attributes per 
> > element, which should hopefully lead to a considerable 
> > speedup.  I would give all the elements a class, define a 
> > width and height for that class in the stylesheet and then 
> > change that with animate() in order to change the width and 
> > height of all elements similtaniously.
> > 
> > The only problem is I have no idea how to go about doing it.  
> > Is doing what I want to be able to do even possible?  If so, 
> > how do I get at the stylesheet node and manipulate it like I 
> > would a DOM element?
> > 
> 

Reply via email to