简体   繁体   中英

How can I stop or pause one of the scripts I use when someone clicks on a specific link?

http://www.ultralocal.fr/refonte/test.php

As you can see, I have a menu with a few links. All of them, except one, launch a small script that changes the background color according to the onclick thing. The "Talweg" link work another way, it launches a bigger script that actually makes the background color change from time to time, progressively. What I would like to know is how I can make the other links stop the Talweg script and just change the bgcolor for once.

the menu:

× <a href="#" class="line" onClick="changeBGC('pink')">Désœuvrements</a><br />
× <a href="#" class="line" onClick="changeBGC('lightblue')">Recettes</a><br />
× <a href="#" class="line" onclick="setrandomcolor()">Talweg</a><br />

the simple script:

function changeBGC(color){
document.bgColor = color;
}

the bigger script that can be launched when one clicks on Talweg but I want to stop when one clicks on the other links.

// Set 1 dark to medium 
// Set 2 light to medium 
// Set 3 very dark to very light light
// Set 4 light to very light
// Set 5 dark to very dark 
var fade_effect=4

// What type of gradient should be applied Internet Explorer 5x or higher?
// Set "none" or "horizontal" or "vertical"
var gradient_effect="none"

var speed=800


var browserinfos=navigator.userAgent 
var ie4=document.all&&!document.getElementById
var ie5=document.all&&document.getElementById&&!browserinfos.match(/Opera/)
var ns4=document.layers
var ns6=document.getElementById&&!document.all
var opera=browserinfos.match(/Opera/)  
var browserok=ie4||ie5||ns4||ns6||opera

if (fade_effect==1) {
    var darkmax=1
    var lightmax=127
}
if (fade_effect==2) {
    var darkmax=180
    var lightmax=254
}
if (fade_effect==3) {
    var darkmax=1
    var lightmax=254
}
if (fade_effect==4) {
    var darkmax=204
    var lightmax=254
}
if (fade_effect==5) {
    var darkmax=1
    var lightmax=80
}
var hexc = new Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F')

var newred
var newgreen
var newblue
var oldred
var oldgreen
var oldblue

var redcol_1
var redcol_2 
var greencol_1 
var greencol_2 
var bluecol_1 
var bluecol_2 
var oldcolor
var newcolor
var firsttime=true

var stepred=1
var stepgreen=1
var stepblue=1

function setrandomcolor() {
    var range=(lightmax-darkmax)
    if (firsttime) {
        newred=Math.ceil(range*Math.random())+darkmax
        newgreen=Math.ceil(range*Math.random())+darkmax
        newblue=Math.ceil(range*Math.random())+darkmax
        firsttime=false
    }

    oldred=Math.ceil(range*Math.random())+darkmax
    oldgreen=Math.ceil(range*Math.random())+darkmax
    oldblue=Math.ceil(range*Math.random())+darkmax

    stepred=newred-oldred
    if (oldred>newred) {stepred=1}
    else if (oldred<newred) {stepred=-1}
    else {stepred=0}

    stepgreen=newgreen-oldgreen
    if (oldgreen>newgreen) {stepgreen=1}
    else if (oldgreen<newgreen) {stepgreen=-1}
    else {stepgreen=0}

    stepblue=newblue-oldblue
    if (oldblue>newblue) {stepblue=1}
    else if (oldblue<newblue) {stepblue=-1}
    else {stepblue=0}
    fadebg()
}

function fadebg() {
    if (newred==oldred) {stepred=0}
    if (newgreen==oldgreen) {stepgreen=0}
    if (newblue==oldblue) {stepblue=0}
    newred+=stepred
    newgreen+=stepgreen
    newblue+=stepblue

    if (stepred!=0 || stepgreen!=0 || stepblue!=0) {
        redcol_1 = hexc[Math.floor(newred/16)];
        redcol_2 = hexc[newred%16];
        greencol_1 = hexc[Math.floor(newgreen/16)];
        greencol_2 = hexc[newgreen%16];
        bluecol_1 = hexc[Math.floor(newblue/16)];
        bluecol_2 = hexc[newblue%16];
        newcolor="#"+redcol_1+redcol_2+greencol_1+greencol_2+bluecol_1+bluecol_2
        if (ie5 && gradient_effect!="none") {
            if (gradient_effect=="horizontal") {gradient_effect=1}
            if (gradient_effect=="vertical") {gradient_effect=0}
            greencol_1 = hexc[Math.floor(newred/16)];
            greencol_2 = hexc[newred%16];
            bluecol_1 = hexc[Math.floor(newgreen/16)];
            bluecol_2 = hexc[newgreen%16];
            redcol_1 = hexc[Math.floor(newblue/16)];
            redcol_2 = hexc[newblue%16];
            var newcolorCompl="#"+redcol_1+redcol_2+greencol_1+greencol_2+bluecol_1+bluecol_2
            document.body.style.filter=
"progid:DXImageTransform.Microsoft.Gradient(startColorstr="+newcolorCompl+", endColorstr="+newcolor+" GradientType="+gradient_effect+")"
        }
        else {
            document.bgColor=newcolor 
        }
        var timer=setTimeout("fadebg()",speed);
    } 
    else {
        clearTimeout(timer)
        newred=oldred
        newgreen=oldgreen
        newblue=oldblue
        oldcolor=newcolor
        setrandomcolor()
    }
}

Thanks

The longer-running script keeps re-executing itself with selfTimeout . If you want to stop it, all you need to do is call clearTimeout on the returned variable:

clearTimeout(timer)

Of course, you may need to be a bit more careful, because the script may be in the middle of the execution when you clear the timeout. One way to deal with it would be to set a flag indicating that the script need not be re-executed again. You can pull variable declarations out of the functions to make the code easier to read. So your code can look like this:

//variable declaration for use in fadebg function
var timer;
//variable declaration for the flag
var contBg = true;

//stop your previous script
function stopRandomBg() {
    clearTimeout(timer);
    contBg = false;
}

//changes to fadebg function
function fadebg() {
    ...
    //change this line
    //var timer=setTimeout("fadebg()",speed);
    //to
    if(contBg) {
        timer=setTimeout("fadebg()",speed);
    }
    ...
}

These additional changes will take care of the case when the script is in the middle of execution when you try to stop it - it will complete the execution pass and then stop.

Now all you need to do is to add onClick event listener to your link to call stopRandomBg function.

You have to make the timer variable global instead of local.

var timer;

then clear the timer when ever you call other links.

function changeBGC(color){
 clearTimeout(timer);
 document.bgColor = color;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM