Kom ihåg mig?
Home Menu

Menu


window.setTimeout exekverar direkt... vet ej varför

Ämnesverktyg Visningsalternativ
Oläst 2010-04-24, 10:51 #1
Althalos Althalos är inte uppkopplad
Medlem
 
Reg.datum: Jan 2006
Inlägg: 282
Althalos Althalos är inte uppkopplad
Medlem
 
Reg.datum: Jan 2006
Inlägg: 282
Standard window.setTimeout exekverar direkt... vet ej varför

Jag försöker skapa ett memory. När två är öppna samtidigt ska de stängas igen efter två sekunder. För att man ska kunna öppna andra under tiden så får de en status "pending" så att de särskiljs. Såhär ser koden ut:

Kod:
	this.find('li div').addClass(hidden).click(function() {
	
	$(this).removeClass(hidden).addClass('open');
		
	function hideit(el) {
		el.removeClass('pending').addClass(hidden);
	}
	
	if($('.open').length>1) {
	var el = $('.open');
	el.removeClass('open').addClass('pending');
	window.setTimeout(hideit(el), 2000);
	}

	});
Problemet är hideit(el) exekveras direkt. Alltså resultatet blir korrekt, men den väntar inte i två sekunder. Någon som ser vad problemet kan bero på?
Althalos är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-24, 10:58 #2
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
Testa att byta
window.setTimeout(hideit(el), 2000);
mot
window.setTimeout('hideit(el)', 2000);
Lindahl är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-24, 11:00 #3
Althalos Althalos är inte uppkopplad
Medlem
 
Reg.datum: Jan 2006
Inlägg: 282
Althalos Althalos är inte uppkopplad
Medlem
 
Reg.datum: Jan 2006
Inlägg: 282
Då händer ingenting :/

Här är sidan:
http://www.cekdahl.com/files/memory_plugin/

Senast redigerad av Althalos den 2010-04-24 klockan 11:02
Althalos är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-24, 11:26 #4
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
En gissning är att variabeln 'el' inte är definierad när funktionen hideit körs. Det är ju en lokalt definierad variabel på raden före setTimeout körs, alltså finns den inte definierad när hideit anropas 2000 ms senare.
Om du däremot kör hideit(el) utan fnuttar så evalueras ju uttrycket omedelbart på raden setTimeout(..), det är därför du upplever att bilden vänds tillbaka direkt. Dessutom ger det ju ett javascriptfel.
Lindahl är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-24, 11:42 #5
Althalos Althalos är inte uppkopplad
Medlem
 
Reg.datum: Jan 2006
Inlägg: 282
Althalos Althalos är inte uppkopplad
Medlem
 
Reg.datum: Jan 2006
Inlägg: 282
På följande sida kör man utan fnuttar när man använder funktioner:
https://developer.mozilla.org/en/DOM/window.setTimeout

Här är ett exempel på en kod som inte ger fel men som har fnuttar, och dessutom inte är beroende av någon variabel (den exekverar funktionen direkt):

Kod:
/*
 *
 *
 */
(function($) {
 
	$.fn.memorize = function(classes, hidden, q) {

	classes.sort(function() {return 0.5 - Math.random()});
	classes = classes.slice(0, 8);
	classes = classes.concat(classes);
	classes.sort(function() {return 0.5 - Math.random()});

	for(var i=0; i<q*2; i++) {
		this.prepend('<li><div class="'+classes[i]+'"></div></li>');
	};
	
	this.find('li div').addClass(hidden).click(function() {
	
	$(this).removeClass(hidden).addClass('open');
		
	function hideit(el) {
		el.removeClass('pending').addClass(hidden);
	}
	
	if($('.open').length>1) {
	var el = $('.pending');
	el.removeClass('open').addClass('pending');
	window.setTimeout("hideit($('.pending'))", 2000);
	}

	});
	
	
	
	return this;

	};
 
})(jQuery);
Althalos är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-24, 11:55 #6
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
Citat:
Ursprungligen postat av Althalos Visa inlägg
Kod:
	this.find('li div').addClass(hidden).click(function() {
	
	$(this).removeClass(hidden).addClass('open');
		
	function hideit(el) {
		el.removeClass('pending').addClass(hidden);
	}
	
	if($('.open').length>1) {
	var el = $('.open');
	el.removeClass('open').addClass('pending');
	window.setTimeout(hideit(el), 2000);
	}

	});
Problemet är hideit(el) exekveras direkt. Alltså resultatet blir korrekt, men den väntar inte i två sekunder. Någon som ser vad problemet kan bero på?
hideit(el) kommer funktionen att köras eftersom du anropat funktionen med (..).
Vad du vill göra är att skicka med funktionen till setTimeout så den själv för köra funktionen. Finns två sätt:

Kod:
window.setTimeout(hideit, 2000);
Detta skickar funktionen till setTimeout, inte resultatet av funktionen. Problemet här är att du inte kan skicka med en parameter.

Kod:
window.setTimeout(function(){hideit(el),2000)});
Här skapar du en ny funktion som skickas med till setTimeout och den körs inte förrän setTimeout anropar den. Här kan du alltså skicka med parametrar.

Hoppas det hjälpte dig lite på traven
qson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-04-24, 12:04 #7
Althalos Althalos är inte uppkopplad
Medlem
 
Reg.datum: Jan 2006
Inlägg: 282
Althalos Althalos är inte uppkopplad
Medlem
 
Reg.datum: Jan 2006
Inlägg: 282
Det fungerar, tack.
Althalos är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 14:06.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017