[Javascript] Avoid multiple onclick
Brian L. Matthews
blmatthews at gmail.com
Thu Oct 19 12:38:46 CDT 2006
>At 12:13 PM 10/18/2006, Nick Fitzsimons wrote:
>All JS code runs in a single thread, so you don't need to worry about
>>doing it atomically. That is, it's not possible for any other
>>JavaScript code to run until the DoSomething function has run to its
>>conclusion. So if DoSomething was called twice, there would be no
>>risk of the "if" line executing, and then another instance of the
>>function running, making the same check and seing the not-yet-true
>>value.
>
>That (i.e. the fact that JS runs in a single thread) answers one
>question I have, and leads to another. I have a progress bar that's
>animated via setInterval(). Then, I run a function to load data that
>can run for quite some time. During that time, the progress bar
>won't run - I assume due to the fact that my load data function is
>hogging the CPU. I'd like to arrange for the load data function to
>give up sufficient CPU to allow the progress bar to run. However, I
>can't find a sleep() or similar function. Is there a way for my load
>data function to give up sufficient CPU for the progress bar
>animation to run?
Yes, you have to split it into chunks and run the chunks from
setTimeout (or setInterval, but I prefer setTimeout as it gives you
more control over when things run). You can do something like this:
function doIt()
{
...run until done or some time has passed...
if (!done)
setTimeout("doIt()", 100);
}
By returning from doIt, you allow the browser to run any other
setTimeout/setInterval expressions. After a bit, doIt is run again so
you can do some more processing.
Another alternative is to call the progress bar update from doIt
directly. However, you still need to give up time to the browser by
returning from doIt, otherwise the browser won't update the page so
it will look like the progress bar isn't advancing.
Brian
More information about the Javascript
mailing list