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?
  1. function collectmcthumbs(mcEffect){  
  2.     var mcR;  
  3.     var i;  
  4.     var mcthumb = document.getElementsByClassName('mcthumb');  
  5.     for(i=0;i<mcthumb.length;i++){  
  6.         Event.observe(mcthumb[i], 'mouseover', mcnavicimShow);  
  7.         Event.observe(mcthumb[i], 'mouseout', mcnavicimClear);  
  8.         if(mcEffect == 'SlideDown'){  
  9.             mcR = 1000*Math.random();  
  10.             setTimeout('Effect.SlideDown('+mcthumb[i]+')', mcR);  
  11.             }  
  12.         }  
  13.     }  
 
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
  1. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">  
  2. <head>  
  3.     <title>test page</title>  
  4.     <script type="text/javascript" src="prototype.js"></script>  
  5.     <script type="text/javascript" src="scriptaculous.js"></script>  
  6.     <script type="text/javascript">  
  7.         //<![CDATA[ 
  8.         collectmcthumbs = function(mcEffect){ 
  9.             var mcR 
  10.             var mcthumbs = $$('.mcthumb'); 
  11.             mcthumbs.each(function(thumb) { 
  12.                 //Effect.SlideUp(thumb) 
  13.                 Event.observe(thumb, 'mouseover', testShow) 
  14.                 Event.observe(thumb, 'mouseout', testClear) 
  15.                 if (mcEffect == 'SlideDown') { 
  16.                     mcR = 1000*Math.random() 
  17.                     setTimeout('Effect.SlideDown('+thumb.getAttribute('id')+')', mcR) 
  18.                 } 
  19.             }); 
  20.         } 
  21.          
  22.         testShow = function() { } 
  23.         testClear = function() { } 
  24.          
  25.         startUp = function() { 
  26.             collectmcthumbs('SlideDown') 
  27.         } 
  28.                  
  29.         Event.observe(window, 'load', startUp) 
  30.         //]]>  
  31.     </script>  
  32. </head>  
  33. <body>  
  34.     <div id='t1' class="mcthumb">  
  35.         <div>  
  36.             first thumb  
  37.         </div>  
  38.     </div>  
  39.     <div id='t2' class="mcthumb">  
  40.         <div>  
  41.             second thumb  
  42.         </div>  
  43.     </div>  
  44.     <div id='t3' class="mcthumb">  
  45.         <div>  
  46.             third thumb  
  47.         </div>  
  48.     </div>  
  49. </body>  
  50. </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
  1. function collectmcthumbs(mcEffect){  
  2.     var mcR;  
  3.     var i;  
  4.     var mcthumb = $$('.mcthumb');  
  5.     mcthumb.each(function(aThumb){  
  6.         Event.observe(aThumb, 'mouseover', mcnavicimShow);  
  7.         Event.observe(aThumb, 'mouseout', mcnavicimClear);  
  8.         mcR = Math.round(1000*Math.random());  
  9.         setTimeout('Effect.SlideDown('+aThumb.getAttribute('id')+')', mcR);  
  10.         });  
  11.     }  
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
  1. <!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
  1. 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)
  1. Effect.SlideDown(object)  
vagy
  1. Effect.SlideDown('object_id')  
Az én eredeti scriptemben pedig
  1. 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.