Avatar billede snappi-v Nybegynder
09. januar 2008 - 11:36 Der er 10 kommentarer og
1 løsning

Kald funktioner med timeout

Hej,

jeg har dette stykke kode

opacity('sletstifterperson', 100, 0, 700);setTimeout('toggleDiv(\'sletstifterperson\',0)',701);

Først køre vi en funktion der hedder opacity (den får en div'en til at fade væk på 0,7ms (visuelt), lige efter kalder vi en funktion (der hedder toogleDiv som sætte display:none; så den er forsvundet. Det fungere fint.

Problemet er den anden vej, hvor jeg først sætte div til display.block; -> og så fader den ind.

Det betyder den blinker i et kort øjeblik.... det jeg gerne vil er at undgå det "blink"...

Nogle ideer?
Avatar billede w13 Novice
09. januar 2008 - 11:58 #1
Prøv at vise den funktion, der fader boksen til synlig.
Avatar billede thomas_yde Nybegynder
09. januar 2008 - 13:11 #2
Nu får du lige en klump data, jeg lavede for laang tid siden. Det har lidt i samme stil som det du gerne vil.

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE></TITLE>
</HEAD>
<BODY>
<script>
var images = new Array("1.jpg","2.jpg","3.jpg","4.jpg","5.jpg");

/*  General Functions  */
var ie;

var timeOut;
var lastImage = 0;

var fadeElm = new Array();

function browser(){
    ie = (document.all) ? true : false;
}

function getE(id){return document.getElementById(id);}
/************************/

function preloadImages(vImages){
    var oImg = new Image();
    for(i=0;i<vImages.length;i++){
        oImg.src = vImages[i];
    }
}

function initPage(){
    browser();
    preloadImages(images,"images");   
}

// startFading(vObj,vDT,vType) starts to fade a object
// vObject = reference to the object to be faded, vDT is delaytime, vType can be "in" "out"
function startFading(vObj,vDT,vType){
    var found = false;
    var elmsCount = fadeElm.length;
    for(i=0;i<elmsCount;i++){
        if(fadeElm[i][0] == vObj){
            found = true;
            if(vType=="out"){
                fadeElm[i][1] = vDT;
                fadeObjOut(i);
            }
            else{
                fadeElm[i][1] = vDT;
                fadeObjIn(i);
            }   
            break;
        }
    }
    if(!found){
        fadeElm[elmsCount] = new Array();
        fadeElm[elmsCount][0] = vObj;
        fadeElm[elmsCount][1] = vDT;
        if(vType=="out"){
            fadeObjOut(elmsCount);
        }
        else{
            fadeObjIn(elmsCount);
        }
    }
}

function getIndexWithObj(vObj){
    var elmsCount = fadeElm.length;
    for(i=0;i<elmsCount;i++){
        if(fadeElm[i][0] == vObj){
            return i;
        }
    }
    return -1;
}

function setOpacity(vObj,vVal){
    if(ie){
        vObj.filters.alpha.opacity = vVal;
    }
    else{
        vObj.style.MozOpacity = vVal/100;
    }
}

function fadeObjOut(index){
    var vObj = fadeElm[index][0];
    try{clearTimeout(fadeElm[index][2]);}
    catch(e){}
    var opa = (ie) ? vObj.filters.alpha.opacity : vObj.style.MozOpacity;
    if(!ie){ opa = opa*100;    if(opa<1) opa=0;}
    if(opa>0){
        setOpacity(fadeElm[index][0],opa-2);
        fadeElm[index][2] = setTimeout(function(){fadeObjOut(index)},fadeElm[index][1]);
    }
}

function fadeObjIn(index){
    var vObj = fadeElm[index][0];
    try{clearTimeout(fadeElm[index][2]);}
    catch(e){}
    var opa = (ie) ? vObj.filters.alpha.opacity : vObj.style.MozOpacity;
    if(!ie){ opa = opa*100;}
    if(opa < 100){
        setOpacity(fadeElm[index][0],opa+2);
        fadeElm[index][2] = setTimeout(function(){fadeObjIn(index)},fadeElm[index][1]);
    }   
}

function rotateImg(vObj){
    if(lastImage<images.length){
        lastImage++;
        vObj.src = images[lastImage];
        setTimeout(function(){fadeObjIn(vObj),10},100);
    }
    else{
        lastImage = 0;
        vObj.src = images[lastImage];
        setTimeout(function(){fadeObjIn(vObj),10},100);
    }
}

//filter:alpha(opacity=25);-moz-opacity:.25;opacity:.25;

window.onload = initPage;
</script>
<P>&nbsp;</P>

<input type="button" onClick="fadeObjOut(getE('img1'));" value="fadeObjOut">
<input type="button" onClick="fadeObjIn(getE('img1'));" value="fadeObjIn" id=button1 name=button1>

<div>Pic1:<br>
    <img id="img1" src="images/1.jpg" width="400" height="300"
    style="filter:alpha(opacity=100);-moz-opacity:1;" onMouseOver="startFading(this,1,'out')" onMouseOut="startFading(this,10,'in');">
</div>

<div>Pic2:<br>
    <img src="images/3.jpg" width="400" height="300"
    style="filter:alpha(opacity=100);-moz-opacity:1;" onMouseOver="startFading(this,50,'out')" onMouseOut="startFading(this,20,'in');">
</div>

<div>Pic2:<br>
    <img src="images/2.jpg" width="400" height="300"
    style="filter:alpha(opacity=100);-moz-opacity:1;" onMouseOver="startFading(this,100,'out')" onMouseOut="startFading(this,30,'in');">
</div>
<div id="debug"></div>
</BODY>
</HTML>
Avatar billede w13 Novice
09. januar 2008 - 13:11 #3
Jeg ville kode det ind i opacity-funktionen, at når den er på 0%, skal boksen sættes til style.display.none og når den er på 1% skal den sættes til style.display.block. Så behøver du heller ikke din timeout.
Avatar billede snappi-v Nybegynder
10. januar 2008 - 12:13 #4
<!--
function opacity(id, opacStart, opacEnd, millisec) {
    //speed for each frame
    var speed = Math.round(millisec / 100);
    var timer = 0;

    //determine the direction for the blending, if start and end are the same nothing happens
    if(opacStart > opacEnd) {
        for(i = opacStart; i >= opacEnd; i--) {
            setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
            timer++;
        }
    } else if(opacStart < opacEnd) {
        for(i = opacStart; i <= opacEnd; i++)
            {
            setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
            timer++;
        }
    }
}

//change the opacity for different browsers
function changeOpac(opacity, id) {
    var object = document.getElementById(id).style;
    object.opacity = (opacity / 100);
    object.MozOpacity = (opacity / 100);
    object.KhtmlOpacity = (opacity / 100);
    object.filter = "alpha(opacity=" + opacity + ")";
}
//-->

Desværre er jeg ikke en stor javascript haj, så jeg er blevet nød til at lave den hack løsning som tidligere beskrevet. Hvis der er nogle der har mod på at kode det ind i selve opacity funktionen, vil der være perfekt.
Avatar billede w13 Novice
10. januar 2008 - 13:02 #5
Tror du skal rette:

//change the opacity for different browsers
function changeOpac(opacity, id) {
    var object = document.getElementById(id).style;
    object.opacity = (opacity / 100);
    object.MozOpacity = (opacity / 100);
    object.KhtmlOpacity = (opacity / 100);
    object.filter = "alpha(opacity=" + opacity + ")";
}

til:

//change the opacity for different browsers
function changeOpac(opacity, id) {
    var object = document.getElementById(id).style;
    object.opacity = (opacity / 100);
    object.MozOpacity = (opacity / 100);
    object.KhtmlOpacity = (opacity / 100);
    object.filter = "alpha(opacity=" + opacity + ")";
    if(opacity>0)document.getElementById(id).style.display="block";
    else document.getElementById(id).style.display="none";
}
Avatar billede roenving Novice
10. januar 2008 - 13:27 #6
-- og lige for at spare noget taste-arbejde (og formindske fejlmulighederne !-)

    document.getElementById(id).style.display = opacity>0 ? "block" : "none";
Avatar billede w13 Novice
10. januar 2008 - 14:13 #7
Endnu bedre, ja :)

//change the opacity for different browsers
function changeOpac(opacity, id) {
    var object = document.getElementById(id).style;
    object.opacity = (opacity / 100);
    object.MozOpacity = (opacity / 100);
    object.KhtmlOpacity = (opacity / 100);
    object.filter = "alpha(opacity=" + opacity + ")";
    document.getElementById(id).style.display=opacity>0?"block":"none"
}
Avatar billede roenving Novice
10. januar 2008 - 14:24 #8
-- og vi har jo objektet i forvejen:

object.display=opacity>0?"block":"none"; !-)
Avatar billede w13 Novice
10. januar 2008 - 14:56 #9
...

//change the opacity for different browsers
function changeOpac(opacity, id) {
    var object = document.getElementById(id).style;
    object.opacity = (opacity / 100);
    object.MozOpacity = (opacity / 100);
    object.KhtmlOpacity = (opacity / 100);
    object.filter = "alpha(opacity=" + opacity + ")";
    object.display=opacity>0?"block":"none"
}

:)
Avatar billede snappi-v Nybegynder
11. januar 2008 - 12:49 #10
Tak for hjælpen!
Avatar billede w13 Novice
11. januar 2008 - 13:47 #11
Det var så lidt og tak for point!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester