Ergebnis 1 bis 8 von 8
  1. #1
    JULm3 ist offline Foren As
    registriert
    08-03-2010
    Beiträge
    96

    Angry setTimeout "extern"

    Hallo!

    Hier mein Code:
    PHP-Code:
    var timer;
    var 
    anz_up 0;
    var 
    anz_down 0;



    document.onmousedown = function(event) {

    if (
    anz_up == 0) {
        
    move_up();
        
    timer setTimeout("move_up()"0); // <--- Funktioniert nicht.
        

        
    }
    };




    function 
    move_up() {
            var 
    helicopterdocument.getElementById("helicopter");
            var 
    top helicopter.offsetTop;
            
            
    helicopter.style.top top "px";
            
    timer;
            
        } 
    Ich möchte, dass das Element "helicopter" bei gedrückter Maustaste um 1px steigt. So weit so gut. Wenn ich das "setTimeout("move_up()", 0);" gleich in die Funktion "move_up()" schreibe, funktioniert das auch.

    Ich muss jedoch später den Timeout wieder aufheben. Und um das zu erreichen muss ich ihn "extern" halten. Richtig?

    So. Ich habe mir einige Forenbeiträge angeschaut, und im einen ist es so beschrieben, wie ich es oben in meinem Code auch angewendet habe. Jedoch "fährt" das Element "helicopter" nur 1px hinauf. Also so, als ob der setTimeout garnicht da wäre.

    Also irgendwo muss etwas falsch sein.

    Ich hoffe jemand kann einen Fehler finden.

    (PS: Die Fehlerkonsole bring weder einen Fehler, noch eine Warnung )

  2. #2
    Jodli ist offline Jungspund
    registriert
    24-06-2006
    Beiträge
    21

    AW: setTimeout "extern"

    Wenn man dein Script durchgeht:
    In der onmousedown-Funktion wird die Funktion move_up aufgerufen.
    In der nächsten Zeile wird ein setTimeout mit der Zeitangabe 0 aufgerufen. Der Wert 0 bedeutet, dass die Funktion sofort aufgerufen wird. Das führt das setTimeout ein wenig ad absurdum
    Der Rückgabewert der setTimeout-Funktion wird in der Variable "timer" gespeichert (Bei dem Rückgabewert handelt es sich um einen Integer-Wert welcher dazu verwendet werden kann, das Timeout vorzeitig zu löschen).

    In der move_up-Funktion wird die Variable einfach nur angesprochen. Das hat aber keinerlei Effekt.

    Wenn sich in einer Variable ein Pointer auf eine Funktion befindet, und du diese ausführen möchtest, musst du das mit () kennzeichnen (also: fuVar(); ).
    Ansonsten wird einfach der Inhalt der Variable zurückgegeben. Und wenn mit dem Rückgabewert nichts passiert (er in eine Variable gespeichert wird, oder einer Funktion übergeben, oder ...), passiert auch sonst nichts.

    In diesem Fall befindet sich aber in der timer-Variable sowieso keine Funktion, sondern nur ein Integer-Wert.

    Wenn du also möchtest, dass die Funktion wieder aufgerufen wird, musst du das setTimeout in der Funktion aufrufen.
    Code:
    function move_up() {
            var helicopter= document.getElementById("helicopter");
            var top = helicopter.offsetTop;
            
            helicopter.style.top = top - 1 + "px";
            setTimeout("move_up();", 500); //hab hier mal 500ms eingetragen
            
    }

    Eine andere Lösung wäre, dass du, wie du es scheinbar vor hattest, die Variable "timer" ausführst (diese Lösung wäre aber ziemlich unschön. Ich gebe sie nur zu Erklärungszwecken an - wie gewünscht funktionieren, werden beide Varianten nicht, siehe unten):
    Code:
    function move_up() {
            var helicopter= document.getElementById("helicopter");
            var top = helicopter.offsetTop;
            
            helicopter.style.top = top - 1 + "px";
            timer();//noch ist in timer ein Integer-Wert.
            
    }
    Da aber im timer noch ein Integer-Wert gespeichert ist, würde das einen Fehler auslösen.
    Also muss in "timer" noch ein Pointer auf eine Funktion.
    Eine mögliche Lösung wäre eine anonyme Funktion:

    Code:
    document.onmousedown = function(event) {
        if (anz_up == 0) {
            move_up();
            timer = function() {setTimeout("move_up()", 500);}; // anonyme Funktion mit setTimeout nach 500 ms
        }
    };

    Beachte aber, dass beide Lösungen eine Endlos-Schleife erzeugen.
    Du wirst also nicht umhin kommen, dein Sriptkonzept nocheinmal zu überdenken.
    Ein onmouseup wird wohl auch unumgänglich sein (zur Erklärung: onmousedown feuert nur einmal, wenn eine Maustaste gedrückt wird. Nicht wiederholt).


    Du könntest beispielsweise in eine Variable speichern, wenn eine Maustaste gedrückt bzw losgelassen wird und davon abhängig das setTimeout auslösen.
    Eine andere Möglichkeit wäre, wenn du mit invar=setIntervall("move_up();", 500); arbeitest und diesen mit clearIntervall(intvar); wieder entfernst, sobald onmouseup aufgerufen wird.
    Geändert von Jodli (02-05-2011 um 17:41 Uhr)

  3. #3
    JULm3 ist offline Foren As
    registriert
    08-03-2010
    Beiträge
    96

    AW: setTimeout "extern"

    So erstellt es zwar wieder den Endlosdurchgang, aber er lässt sich nicht abbrechen.
    Code:
    document.onmousedown = function() {
    	
    	var ival_up=window.setInterval("move_up()", 10);
    
    };
    
    document.onmouseup = function() {
    
    	window.clearIntervall(ival_up); 
    	var ival_down=window.setInterval("move_down()", 10);
    
    };
    
    
    
    
    function move_up() {
    		var helicopter= document.getElementById("helicopter");
    		var top = helicopter.offsetTop;
    		
    		helicopter.style.top = top - 1 + "px";
    		
    	}
    
    function move_down() {
    		var helicopter= document.getElementById("helicopter");
    		var top = helicopter.offsetTop;
    		
    		helicopter.style.top = top + 1 + "px" ; 		
    	}
    Geändert von JULm3 (02-05-2011 um 19:09 Uhr)

  4. #4
    Max Matti ist offline Foren As
    registriert
    01-04-2011
    Beiträge
    75

    AW: setTimeout "extern"

    also ich würde in zeile 1 "var timer;" schreiben und die nur unten verändern, dann ist sie global.

  5. #5
    JULm3 ist offline Foren As
    registriert
    08-03-2010
    Beiträge
    96

    AW: setTimeout "extern"

    Und was stimmt hier schon wieder nicht?!
    Ich hab doch alles richtig gemacht! -.-

    Code:
    var timer;
    
    document.onmousedown = function(){
    	
    	var timer=setInterval("move_up()", 10);
    
    };
    
    document.onmouseup = function() {
    
    	clearInterval(timer);
    	var timer=setInterval("move_down()", 10);
    
    
    };
    Geändert von JULm3 (02-05-2011 um 20:07 Uhr)

  6. #6
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.687

    AW: setTimeout "extern"

    Wenn timer global sein soll, darf in den Funktionen kein "var" davor stehen.

  7. #7
    JULm3 ist offline Foren As
    registriert
    08-03-2010
    Beiträge
    96

    AW: setTimeout "extern"

    Vielen vielen Dank "Jodli, Max Matti, und Kkapsner"!!
    Endlich funktionierts!

  8. #8
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.687

    AW: setTimeout "extern"

    Bitte - gern geschehen.

Ähnliche Themen

  1. Antworten: 7
    Letzter Beitrag: 28-09-2010, 13:02
  2. Antworten: 3
    Letzter Beitrag: 07-09-2009, 12:23
  3. Antworten: 9
    Letzter Beitrag: 20-03-2008, 13:22
  4. Antworten: 7
    Letzter Beitrag: 10-02-2008, 10:20
  5. Antworten: 6
    Letzter Beitrag: 22-05-2003, 11:20

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •