【发布时间】:2012-12-02 22:57:36
【问题描述】:
这是一个快速(坏掉的)jsfiddle:http://jsfiddle.net/wH2qF/
由于某种原因这不起作用...是因为我在另一个 setTimeout 的处理程序中有一个 setTimeout 吗?
$(function() {
$("#Volume").click(function() {
setTimeout(triggerVolumeChange, 4000);
function triggerVolumeChange()
{
var volumeDiv = document.getElementById("volumeNumber");
var volumeOld = 8;
var volumeNew = 37;
var timeNew = (1000/(volumeNew-volumeOld));
changeVolume();
function changeVolume()
{
volumeDiv.innerHTML = volumeOld;
volumeOld++;
if (volumeOld <= volumeNew) setTimeout(changeVolume, timeNew);
};
});
});
应该指定,为了清楚起见,我从该 Click 函数中删除了其他内容,并且还澄清了哪些不完全有效,好吧,基本上,我点击并没有任何反应,而如果我删掉这段代码它可以很好...实际上 vars 的设置也可以正常工作(我自然认为)但是当我粘贴或取消注释 changeVolume() 函数时,点击再次停止工作...有什么想法吗?
--
另一个澄清:我想要做的是,在点击时,在一个字符串中模拟从 8 到 37 的音量。因此该函数内部的 setTimeout。
--
根据你的要求,这是整个代码...我怀疑它是否有意义,但这里是...仅供参考,点击这将触发一些动画来模拟应用程序的流程我'我在设计..
<script>
$(function() {
$("#Volume").click(function() {
var userPrompt = document.getElementById("userPrompt")
userPrompt.innerHTML = "Change volume to 37";
var avatarIcon = document.getElementById("avatarIcon");
avatarIcon.innerHTML = "<img src='imgs/haloIcons-volume_82x76.png' alt='Volume'/>";
var hints = document.getElementById("hints");
hints.style.opacity = 0;
$(".dragonTvOut").toggleClass("dragonTvIn");
setTimeout(triggerP, 1000);
function triggerP()
{
var halo = document.getElementById('avatar');
if( 'process' in halo ) {
halo.process();
};
};
setTimeout(triggerUserPrompt, 2000);
function triggerUserPrompt()
{
document.getElementById("userPrompt").className = "userPromptIn";
};
setTimeout(triggerVolumeChange, 4000);
function triggerVolumeChange()
{
document.getElementById("userPrompt").className = "userPromptEnd";
var halo = document.getElementById('avatar');
if( 'resume' in halo ) {
halo.resume();
}
document.getElementById("avatarIcon").className = "avatarIconEnd";
var volumeDiv = document.getElementById("volumeNumber");
var volumeOld = 8;
var volumeNew = 37;
var timeNew = (1000/(volumeNew-volumeOld));
changeVolume();
function changeVolume()
{
volumeDiv.innerHTML = volumeOld;
volumeOld++;
if (volumeOld <= volumeNew) setTimeout(changeVolume, timeNew);
};
var side = 100;
var paper = new Raphael(volumeArcAnim, 100, 300);
paper.customAttributes.arc = function (xloc, yloc, value, total, R) {
var alpha = 360 / total * value,
a = (90 - alpha) * Math.PI / 180,
x = xloc + R * Math.cos(a),
y = yloc - R * Math.sin(a),
path;
if (total == value) {
path = [
["M", xloc, yloc - R],
["A", R, R, 0, 1, 1, xloc - 0.01, yloc - R]
];
} else {
path = [
["M", xloc, yloc - R],
["A", R, R, 0, +(alpha > 180), 1, x, y]
];
}
return {
path: path
};
};
var arcWidth = 87;
var strokeRadius = arcWidth/2;
var indicatorArc = paper.path().attr({
"stroke": "#ffffff",
"stroke-width": 3,
arc: [side/2, side/2, 12, 100, strokeRadius]
});
indicatorArc.animate({
arc: [side/2, side/2, 60, 100, strokeRadius]
}, 1500, "<>", function(){
// anim complete here
});
};
});
});
</script>
【问题讨论】:
-
您遇到了什么错误?我认为
setTimeout()需要一个字符串来进行方法调用。 -
@Knownasilya - 它需要一个字符串或一个函数。
-
@Knownasilya never pass strings to setTimeout.
-
您可能需要考虑重构您的函数,使它们相互传递参数,而不是依赖于在父函数的范围内执行。
-
@Knownasilya 有几个原因:它必须
eval你的字符串,这由于其自身原因而被认为是一种不好的做法。此外,它会强制您的“代码”(字符串)在全局上下文中执行,在诸如 OPs 代码之类的示例中,这会破坏代码(triggerVolumeChange和changeVolume都不会在全局上下文中定义)
标签: javascript settimeout