ugrás a tartalomhoz

Scriptaculous és ciklus

rrd · 2007. Ápr. 17. (K), 19.27
Az alábbi függvényben a ciklus az utolsó elemen hajtódik végre többször. Miért lehet ez?

function collectmcthumbs(mcEffect){
	var mcR;
	var i;
	var mcthumb = document.getElementsByClassName('mcthumb');
	for(i=0;i<mcthumb.length;i++){
		Event.observe(mcthumb[i], 'mouseover', mcnavicimShow);
		Event.observe(mcthumb[i], 'mouseout', mcnavicimClear);
		if(mcEffect == 'SlideDown'){
			mcR = 1000*Math.random();
			setTimeout('Effect.SlideDown('+mcthumb[i]+')', mcR);
			}
		}
	}
 
1

paraméter átadás

Sulik Szabolcs · 2007. Ápr. 17. (K), 20.47
Nálam teljesen jól megy. Készítettem egy tesztet és ott a setTimeout()-ban a paraméterátadás okozza a hibát (ha van FireBug-od, az azonnal megmondja). Csak id-vel sikerült megadni neki.

Egyébként miért nem használod ki a prototypeot ha már úgyis ott van

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <title>test page</title>
	<script type="text/javascript" src="prototype.js"></script>
	<script type="text/javascript" src="scriptaculous.js"></script>
	<script type="text/javascript">
	    //<![CDATA[
	    collectmcthumbs = function(mcEffect){
			var mcR
			var mcthumbs = $$('.mcthumb');
			mcthumbs.each(function(thumb) {
				//Effect.SlideUp(thumb)
				Event.observe(thumb, 'mouseover', testShow)
				Event.observe(thumb, 'mouseout', testClear)
				if (mcEffect == 'SlideDown') {
					mcR = 1000*Math.random()
					setTimeout('Effect.SlideDown('+thumb.getAttribute('id')+')', mcR)
				}
			});
		}
		
		testShow = function() { }
		testClear = function() { }
		
		startUp = function() {
			collectmcthumbs('SlideDown')
		}
				
		Event.observe(window, 'load', startUp)
	    //]]>
	</script>
</head>
<body>
    <div id='t1' class="mcthumb">
		<div>
		    first thumb
		</div>
	</div>
	<div id='t2' class="mcthumb">
	    <div>
		    second thumb
		</div>
	</div>
	<div id='t3' class="mcthumb">
	    <div>
		    third thumb
		</div>
	</div>
</body>
</html>
(created with Intype - fantasztikus ez az editor; Eclipse után a nagy kedvenc)
2

akkor mégsem ott a bibi mint gondoltam

rrd · 2007. Ápr. 18. (Sze), 10.05

function collectmcthumbs(mcEffect){
	var mcR;
	var i;
	var mcthumb = $$('.mcthumb');
	mcthumb.each(function(aThumb){
		Event.observe(aThumb, 'mouseover', mcnavicimShow);
		Event.observe(aThumb, 'mouseout', mcnavicimClear);
		mcR = Math.round(1000*Math.random());
		setTimeout('Effect.SlideDown('+aThumb.getAttribute('id')+')', mcR);
		});
	}
de erre a Firebug ezt adja:
mcthumb127 is not defined
[Break on this error] setTimeout('Effect.SlideDown('+aThumb.getAttribute('id')+')', mcR);
3

megvan de nem értem egyáltalán az okát

rrd · 2007. Ápr. 18. (Sze), 11.08
Szóval ha a file elején szerepel a doctype
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
akkor a fenti hibaüzenettel elhalálozik a script. Ellenben ha törlöm a doctypeot akkor meg fut szépen

MI EZ?
4

Hiba..

Sulik Szabolcs · 2007. Ápr. 18. (Sze), 16.04
... amit én követtem el, ugyanis a
setTimeout('Effect.SlideDown('+aThumb.getAttribute('id')+')', mcR);
sorban az id-t idézőjelek közé kell tenni, amit elfelejtettem.
Ha megteszed, akkor menni fog xhtml 1.1 doctype-al is.
5

valóban

rrd · 2007. Ápr. 19. (Cs), 14.43
de miért?
6

mit miért?

Sulik Szabolcs · 2007. Ápr. 19. (Cs), 16.19
Miért követtem el hibát? Mert én is emberből vagyok. :)

Hogy miért okozott ez ekkora galibát. Mert az Effect.SlideDown() első paramétere vagy egy object (referencia), vagy egy id (string)

Effect.SlideDown(object)
vagy

Effect.SlideDown('object_id')
Az én eredeti scriptemben pedig

Effect.SlideDown(object_id)
volt.
Ennyi. Gondolom a 4.0 feletti doctype (azzal megy az eredeti is, 4.01-gyel már nem) már szigorúbb.