我是javascript的新手.我写了一个简单的计数器程序,从10开始倒计时到1.
<script type="text/javascript">
function countDown(secs) {
var element = document.getElementById("status");
element.innerHTML = "Please wait for "+secs+" seconds";
if(secs < 1) {
clearTimeout(timer);
element.innerHTML = '<h2>Countdown Complete!</h2>';
element.innerHTML += '<a href="#">Click here now</a>';
}
secs--;
---> **var timer = setTimeout('countDown('secs')',1000);**
}
</script>
<div id="status"></div>
<script type="text/javascript">countDown(10);</script>
Run Code Online (Sandbox Code Playgroud)
然后我尝试将参数传递'+secs+'给countDown函数.
var timer = setTimeout('countDown('+secs+')',1000);
Run Code Online (Sandbox Code Playgroud)
以上变更有效.
我的问题是为什么我需要将参数传递为'+ secs +'而不仅仅是'secs'?它有什么不同?
为了我的用户的理智,我希望在选择器悬停半秒后而不是在它们悬停时立即运行"鼠标悬停"事件.
我首先尝试了一个setTimeout函数但是运行了很长时间,元素已经被徘徊,我猜想我没想过太多.我也花了一天(开和关)搜索(和玩Pacman)没有结果,除非我在寻找错误的东西.
如果可以的话,我想保留这个插件,纯粹是为了运行速度和可维护性.
$("#mySelector").mouseover(function(){
// Run after 500ms
$(this).addClass("hasBeen500ms");
});
Run Code Online (Sandbox Code Playgroud)
让我们看看我们是否可以解决这个问题,我知道它会有这么多应用程序!
如果用户在条形图上盘旋一秒钟,我试图在条形图上显示一些信息.这个网站上的答案让我到了这一步
var timer;
$(".session_hover").on({
'mouseover': function () {
timer = setTimeout(function () {
$(this).children('.session_info').css({'top':175,'right':20}).fadeIn('fast');
}, 1000);
},
'mouseout' : function () {
clearTimeout(timer);
}
});
Run Code Online (Sandbox Code Playgroud)
当我替换时,上面的代码工作$(this),$(".session_hover")但当然,它会触发$(".session_hover")页面上的所有其他代码.
我如何$(this)进入我的setTimeout函数,以便它只适用于我正在盘旋的div的子元素?
谢谢你的帮助!
编辑:这不是如何在setTimeout中传递参数的重复.实际上,我想知道如何编写一个函数,它将被调用作为预定义函数的方法,就像setTimeout API一样.
那么,我如何为函数'callAfter'编写一个实现,它允许在某些指定的持续时间之后使用某些参数调用任何函数,具有以下提到的语法:
示例:假设您有一个名为'sum'的函数,如下所示:
function sum(a, b) {
console.log('Sum is: ', a + b);
}
Run Code Online (Sandbox Code Playgroud)
现在你应该能够执行:sum.callAfter(5000,8,9);
应该在5秒后使用参数8和9调用函数'sum'.
尝试设置一个HTML类的innerHTML,它有四个框,每个框依次设置3秒。当innerHTML设置为加载图标时,我可以在没有setTimeout的情况下设置innerHTML。当将innerHTML放入setTimeout中时,将返回以下内容:“未捕获类型错误:无法设置未定义的属性‘innerHTML’”。
尝试调试我的代码,将消息发送到控制台并搜索 stackoverflow,但没有成功。
var x = document.getElementsByClassName("numberBox");
for (var i = 0; i < 4; i++) {
x[i].innerHTML= '';
x[i].innerHTML= "<div class='loader'></div>"
}
// function to generate array of 4 random numbers
var randomNums = generateRandomNumbers();
for (var i = 0; i < 4; i++) {
setTimeout(function () {
x[i].innerHTML= '';
x[i].innerHTML = randomNums[i];
}, 3000 * i);
}
Run Code Online (Sandbox Code Playgroud)
想知道为什么我的innerHTML 不能在这里设置setTimeout 以及我的问题的可能解决方案。
当我执行以下操作时,incidentController在10秒后调用并继续执行,每秒都没有问题10:
// This works fine in nodejs v0.11.13
setInterval(incidentController, 10 * 1000);
function incidentController () {
console.log ('executed');
}
Run Code Online (Sandbox Code Playgroud)
但是,这会立即执行并在第二次迭代时抛出以下错误:
//This doesn't. The parens which wrap (123) cause the error.
setInterval(incidentController(123), 10 * 1000);
function incidentController (someInt) {
console.log ('executed: ', someInt);
}
Run Code Online (Sandbox Code Playgroud)
错误:
timers.js:287
callback.apply(this, args);
^
TypeError: Cannot read property 'apply' of undefined
at wrapper [as _onTimeout] (timers.js:287:13)
at Timer.listOnTimeout (timers.js:133:15)
Run Code Online (Sandbox Code Playgroud)
似乎incidentController是/变得undefined某种程度.有人可以解释为什么这是预期的行为(我认为它是,无论如何)?
我可以很容易地解决这个问题,但我只是好奇它为什么会这样做 - 使得传递参数值不太方便,因为我不能在setInterval …
以下功能每5秒显示一次警报:
function foo() {
bar="foo";
alert (bar);
setTimeout(foo, 5000);
}
foo();
Run Code Online (Sandbox Code Playgroud)
但是,当我向函数添加参数并从中调用时setTimeout,它不再等待5秒,它只是无休止地发出警报而没有任何延迟:
function foo(bar) {
bar="foo";
alert (bar);
setTimeout(foo(bar), 5000);
}
foo();
Run Code Online (Sandbox Code Playgroud)
为什么这样,我怎样才能在传递参数时延迟遍历函数?
我正在尝试使用canvas API(与html5中使用的相同)在qml中创建一个计时器.我需要每隔一秒左右重绘一次屏幕.是否有任何功能可以用新馈送的参数更新屏幕?例如,我使用弧函数,我指定绘制时钟弧的角度:
ctx.arc(150, 150, 95, 0,1.57,false);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,角度会每隔一秒左右变化一次.
我的代码一直在工作,直到我将 node.js 更新到版本 8.11.3
现在,当我尝试使用 setTimeout 调用函数时,总是收到错误“回调参数必须是函数”。
function testFunction(itemid, price) {
var url = 'https://example.com';
var options = {
method: 'get',
url: url
}
request(options, function (err, res, body) {
var response = JSON.parse(body);
if(response.status == 'fail'){
setTimeout(testFunction(itemid, price), 100);
}
})
}
Run Code Online (Sandbox Code Playgroud) 我读StackOverflow上的答案在这里解释了如何使用的setTimeout来创造一种在网页上反复循环。但是,我想知道为什么 setTimeout 需要匿名函数才能工作。考虑以下代码:
trainingTimer(60,0);
function trainingTimer(duration,c) {
document.getElementById("timer").innerHTML = "Time left: "+(duration-c);
if(duration==c) {
alert("Time is up!");
}
else {
window.setTimeout(trainingTimer(duration,c+1),1000);
}
}
Run Code Online (Sandbox Code Playgroud)
我是根据上面链接的答案写的,但是当它运行时,它会trainingTimer一次遍历所有 60 个调用,并立即在我的网页上显示“剩余时间:0”。但是,如果我修改
window.setTimeout(trainingTimer(duration,c+1),1000);
并trainingTimer(duration,c+1)像这样包装一个匿名函数
window.setTimeout(function() {trainingTimer(duration,c+1)},1000);
那么代码工作得很好。
我想知道为什么我必须将命名函数包装在匿名函数中才能使 setInterval 正常工作。感谢所有的帮助。