2011-04-12 95 views
0

我想写一个函数,它会在图像数组之间改变。我对我有意义,但是当我在下面运行它时,第一个图像加载,然后第二个图像在某个点加载(透明度不会改变),然后什么都不会发生。这里是javascript代码:Javascript递归问题

 var image1 = new Image();var image2 = new Image(); var image3 = new Image(); 
     image1.src = "images/website6.jpg"; image2.src = "images/website7.jpg"; image3.src = "images/sunset.jpg"; 
     var images = new Array("images/website6.jpg","images/website7.jpg","images/sunset.jpg"); 
     /*document.slide.style.opacity = 1; 
     document.slide.stylebg.opacity = 0;*/ 
     setTimeout(function() { fade(images,0); }, 2000); 
     function delay(arr,num) 
     { 
      document.slide.src = arr[num % 3]; 
      document.slide.style.opacity = 1; 
      document.slidebg.style.opacity = 0; 
      document.slidebg.src = arr[(num+1)%3]; 
      var number = num + 1; 
      setTimeout(function() { fade(arr,number); }, 2000); 
     } 
     function fade(arr,num) 
     { 
      /*alert('fadebefore ' + (document.slide.style.opacity).toString())*/ 
      document.slide.style.opacity -= 0.1 
      /*alert('fade')*/ 
      document.slide.stylebg.opacity += 0.1 
      if (document.slide.style.opacity == 0) 
      { 
       setTimeout(function() { delay(arr,num); }, 150); 
      } 
      else 
      { 
       setTimeout(function() { fade(arr,num); }, 1500); 
      } 
     } 

HTML很简单。我有两堂课; stylestylebgstyle坐在stylebg的前面,然后根据需要更改不透明度和图像。 JavaScript似乎对我来说合乎逻辑,但它不能按预期工作。另外值得注意的是有3条评论。第一条评论(第3-4行)正在试图将阴影设置为他们应该在一开始时的样子。但是,如果我这样做,那么我会得到比上面更少的进展:第一个图像加载并且没有其他事情发生。第二个注释用于调试目的。如果我取消注释,则图像会在两次警报之间发生变化,这似乎表明图像变化是由不透明度变化引起的。

那么,任何人都可以解释为什么它没有达到我期望的效果吗?谢谢。

编辑:一些更多的代码:

HTML(这是受到影响的只是一部分):

<div style="position: relative;"> 
<img src="images/sunset.jpg" id="slide" /> 
<img src="images/website6.jpg" id="slidebg" /> 
</div> 

CSS:

#slide{ 
    display:block; 
    margin-left:5; 
    margin-right:auto; 
    border: 1px solid black; 
    z-index: 1; 
    top: 0px; 
    position: relative; 
} 
#slidebg{ 
    display:block; 
    margin-left:auto; 
    margin-right:auto; 
    border: 1px solid black; 
    z-index: 0; 
    top: 0px; 
    position: absolute; 
}
+0

显示HTML代码,请 – atlavis 2011-04-12 19:04:19

+0

你的JavaScript代码是很奇怪..你使用Internet Explorer? – atlavis 2011-04-12 19:21:27

+0

@atlavis不,我不使用Firefox。这是我第一次写javascript,这可能是为什么它很奇怪。我很乐意为你解释它的奇怪之处。 – Paul 2011-04-12 19:26:16

回答

0

回答格式化的缘故。我还没有调试过,看看会有什么效果,但这对我来说更有意义

如果要使用ID,请使用document.getElementById,如果要使用name,请使用document.images [imgname]或document。 imagename 您也在混合使用名称和样式。 document.slide.stylebg.opacity等

这样做。不知道这是你想要什么:http://jsfiddle.net/EcShW/2/

<div style="position: relative;"> 
<img src="images/sunset.jpg" id="slide" name="slide" /> 
<img src="images/website6.jpg" id="slidebg" name="slidebg" /> 
</div> 


    var images = []; // can be more elegant, but this is simpler 
    images[0]=new Image(); images[0].src="images/website6.jpg"; 
    images[1]=new Image(); images[1].src="images/website7.jpg"; 
    images[2]=new Image(); images[2].src="images/sunset.jpg"; 
    var tid1,tid2,tid3 
    tid1=setTimeout(function() { fade(images,0); }, 2000); 
    function delay(arr,num) 
    { 
     document.slide.src = arr[num % 3].src; 
     document.slide.style.opacity = 1; 
     document.slidebg.style.opacity = 0; 
     document.slidebg.src = arr[(num+1)%3].src; 
     var number = num + 1; 
     tid2=setTimeout(function() { fade(arr,number); }, 2000); 
    } 
    function fade(arr,num) 
    { 
     document.slide.style.opacity -= 0.1 
     document.stylebg.style.opacity += 0.1 
     if (document.slide.style.opacity == 0) 
     { 
      tid3=setTimeout(function() { delay(arr,num); }, 150); 
     } 
     else 
     { 
      tid3=setTimeout(function() { fade(arr,num); }, 1500); 
     } 
    } 
+0

I已经完全按照你所说的去尝试,它没有改变任何东西。另外,如下所述,我知道我混合了id /名字,但为什么以下工作? http://jsfiddle.net/E3H8G/1/ – Paul 2011-04-12 20:19:35

+1

你在原始代码中有TYPOS。 'document.slide.stylebg.opacity + = 0.1'应该是 'document.slide.style.opacity'或'document.slidebg.style.opacity' 看看我的小提琴。它确实工作http://jsfiddle.net/EcShW/2/ – mplungjan 2011-04-12 20:20:42

+0

非常感谢你,我看到问题的大部分。它仍然不起作用,但我认为我应该能够从这里弄清楚。 – Paul 2011-04-12 20:33:19

0

你不能只是指页面元素通过“id”这样的值;您必须使用 “的document.getElementById()”:

var slideElement = document.getElementById('slide'), slidebgElement = document.getElementById('slidebg'); 

然后你会用 “slideElement.style” 等来代替 “document.slide.style” 工作。

+0

当然他可以。 ' mplungjan 2011-04-12 19:49:30

+0

@mplungian - look again - his images don't have "name" attributes! – Pointy 2011-04-12 19:50:04

+0

@mplunjan [here is a jsfiddle](http://jsfiddle.net/LTag6/) to make clear that ''只有**“id”值且没有“名称”值的元素不能被称为“文档”对象的成员。 – Pointy 2011-04-12 19:58:34

-2

EDIT2

这对我的作品(铬)

var images = new Array(); 
images[0] = new Image(); 
images[0].src = "images/website6.jpg"; 
images[1] = new Image(); 
images[1].src = "images/website7.jpg"; 
images[2] = new Image(); 
images[2].src = "images/sunset.jpg"; 

function delay (arr, num) 
{ 
    slide.src = arr[num % 3].src; 
    slide.style.opacity = 1; 
    slidebg.style.opacity = 0; 
    slidebg.src = arr[(num+1)%3].src; 
    var number = num + 1; 
    setTimeout(function() { fade(arr,number); }, 2000); 
} 

function fade(arr, num) 
{ 
    if (slide.style.opacity == 0) 
    setTimeout(function(){ delay(arr, num); }, 150); 
    else 
    { 
    slide.style.opacity = (slide.style.opacity*10 - 1)/10 ; 
    slidebg.style.opacity -= -0.1; 
    setTimeout (function(){fade(arr,num);}, 1500); 
    } 
} 
fade (images, 0); 

AHA!

<img id="img_id"/>我们可以通过document.img_id得到,即使是在铬



OK,OK,辗转联系到该WE TEACH YOU TO FAIL AT WEB DEV网站..

+0

他对setTimeout的使用很好。此外,[w3schools应避免](http://w3schools.com)。 – Pointy 2011-04-12 19:53:59

+0

'window.setInterval()'更适合(它的名字)IMO。无论如何,我真的很好奇为什么应该避免w3schools。 – atlavis 2011-04-12 20:00:14

+0

它充满了错误的信息。 – Pointy 2011-04-12 20:02:36