Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript设置超时、循环和闭包_Javascript_Settimeout - Fatal编程技术网

Javascript设置超时、循环和闭包

Javascript设置超时、循环和闭包,javascript,settimeout,Javascript,Settimeout,下面的代码把我弄糊涂了。我的目标是在一段时间内将HTML元素从一个不透明级别淡入另一个不透明级别。下面是我的dimScreen方法,用于创建一个变暗的覆盖层并淡入 var overlay; function dimScreen() { if(!overlay) { overlay = document.createElement('div'); overlay.setAttribute('id', 'overlay'); overlay.styl

下面的代码把我弄糊涂了。我的目标是在一段时间内将HTML元素从一个不透明级别淡入另一个不透明级别。下面是我的dimScreen方法,用于创建一个变暗的覆盖层并淡入

var overlay;

function dimScreen()
{
   if(!overlay)
   {
      overlay = document.createElement('div');
      overlay.setAttribute('id', 'overlay');
      overlay.style.width = '100%';
      overlay.style.height = '100%';
      overlay.style.zindex = '1000';
      overlay.style.background = '#000013';
      overlay.style.position = 'fixed';
      overlay.style.left = '0';
      overlay.style.top = '0';
      overlay.style.opacity = '.0';

      document.body.appendChild(overlay);
      fade('overlay', 0, 75, 200);
   }
}
以下是我的工作淡入淡出功能:

function fade(eID, startOpacity, stopOpacity, duration)
{
   var speed = Math.round(duration / 100);
   var timer = 0;
   if (startOpacity < stopOpacity)
   {     // fade in
      for (var i=startOpacity; i<=stopOpacity; i++)
      {
         setTimeout("setOpacity('"+eID+"',"+i+")", timer * speed);
         timer++;
      } return;
   }
   for (var i=startOpacity; i>=stopOpacity; i--)
   {     // fade out
      setTimeout("setOpacity('"+eID+"',"+i+")", timer * speed);
      timer++;
   }
}
但是,我想将淡入淡出功能更改为用户闭包,形式如下:

setTimeout(function(){setOpacity(eID,i)}, timer * speed);
然后我可以传入实际的overlay div,而不是id“overlay”。然而,当我这样做时,它并没有设置叠加div逐渐淡入的动画,而是直接进入最后一个不透明度值,而没有过渡。为什么会发生这种情况


我有一种感觉,这是一个简单的东西,我错过了,因为我已经看了这么久。任何帮助都将不胜感激

现在在这里想太多已经太迟了,仍然太热了。凌晨2时30分,28摄氏度 如果我的解释没有达到预期,请原谅

基本上,因为您构造了要传递给setTimeout的文本字符串,所以每次调用都会获得i的正确值。由于要传递一个实际的元素,不能使用字符串技巧,因此每次调用setOpacity都会使用相同的i值

正如您的问题标题表明您理解的那样,您需要使用闭包使其正常工作。我无法找到一个好的tute/S.O问题的2或3个链接,用一种似乎相关和清晰的方式来解释它

希望代码会有用

var overlay;
function dimScreen()
{
   if(!overlay)
   {
      overlay = document.createElement('div');
      overlay.setAttribute('id', 'overlay');
      overlay.style.width = '100%';
      overlay.style.height = '100%';
      overlay.style.zindex = '1000';
      overlay.style.background = '#000013';
      overlay.style.position = 'fixed';
      overlay.style.left = '0';
      overlay.style.top = '0';
      overlay.style.opacity = '.0';

      document.body.appendChild(overlay);
      myFade(overlay, 0, 75, 2000);
   }
}
function myFade(element, startOpacity, stopOpacity, duration)
{
   var speed = Math.round(duration / 100);
   var timer = 0;
   if (startOpacity < stopOpacity)
   {     // fade in
      for (var i=startOpacity; i<=stopOpacity; i++)
      {
        (
            function()
            {
                var myI = i;
                setTimeout(function(){mySetOpacity(element,myI)}, timer * speed);
            }
        )()
         timer++;
      }
   }

   else
   for (var i=startOpacity; i>=stopOpacity; i--)
   {     // fade out
      for (var i=startOpacity; i<=stopOpacity; i++)
      {
        (
            function()
            {
                var myI = i;
                setTimeout(function(){mySetOpacity(element,myI)}, timer * speed);
            }
        )()
         timer++;
      }
   }
}

function mySetOpacity(el, opacityLevel)
{
   var eStyle = el.style;
   eStyle.opacity = opacityLevel / 100;
   eStyle.filter = 'alpha(opacity='+opacityLevel+')';
}

你能提供一个JSFIDLE吗?出于某种原因,如果我复制/粘贴我的代码,它不会做任何事情。如果我把它作为一种外部资源,它会显示出不同。是的,这就是我最终想要做的。我宁愿传入元素本身,而不是发送元素的id,并且必须从文档中获取它。它仍然会使显示器变暗,但它会一次全部变暗,而不是从0变暗到75%。这非常有效,您的解释也非常好。非常感谢。
var overlay;
function dimScreen()
{
   if(!overlay)
   {
      overlay = document.createElement('div');
      overlay.setAttribute('id', 'overlay');
      overlay.style.width = '100%';
      overlay.style.height = '100%';
      overlay.style.zindex = '1000';
      overlay.style.background = '#000013';
      overlay.style.position = 'fixed';
      overlay.style.left = '0';
      overlay.style.top = '0';
      overlay.style.opacity = '.0';

      document.body.appendChild(overlay);
      myFade(overlay, 0, 75, 2000);
   }
}
function myFade(element, startOpacity, stopOpacity, duration)
{
   var speed = Math.round(duration / 100);
   var timer = 0;
   if (startOpacity < stopOpacity)
   {     // fade in
      for (var i=startOpacity; i<=stopOpacity; i++)
      {
        (
            function()
            {
                var myI = i;
                setTimeout(function(){mySetOpacity(element,myI)}, timer * speed);
            }
        )()
         timer++;
      }
   }

   else
   for (var i=startOpacity; i>=stopOpacity; i--)
   {     // fade out
      for (var i=startOpacity; i<=stopOpacity; i++)
      {
        (
            function()
            {
                var myI = i;
                setTimeout(function(){mySetOpacity(element,myI)}, timer * speed);
            }
        )()
         timer++;
      }
   }
}

function mySetOpacity(el, opacityLevel)
{
   var eStyle = el.style;
   eStyle.opacity = opacityLevel / 100;
   eStyle.filter = 'alpha(opacity='+opacityLevel+')';
}