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