我正在开发一个项目,该项目要求我的用户脚本在页面上运行,而不会执行任何页面的JavaScript.也就是说,我们需要禁用JavaScript浏览.
当我尝试延迟脚本中的函数执行时,我遇到了一个问题.每当我打电话时window.setTimeout
,我传入的函数永远不会被执行.
我想也许这个函数实际上是调用unsafeWindow
而不是窗口.这有什么解决方法吗?
我应该提一下,setTimeout
当启用JavaScript并且我的脚本中的其他所有内容在没有启用JavaScript的情况下工作正常时,调用工作正常.
谢谢你的帮助!
我打算在打开后三秒钟自动关闭对话框.我尝试了以下方法:
setTimeout($("#mydialog").dialog('close'), 3000);
Run Code Online (Sandbox Code Playgroud)
这是在上下文中:
$("#acknowledged-dialog").dialog({
height: 140,
modal: true
});
setTimeout($("#acknowledged-dialog").dialog('close'), 3000);
Run Code Online (Sandbox Code Playgroud)
但是用这种方法,它甚至都没有显示出来!我猜测close方法在页面显示后立即被调用.日志显示没有错误.
我也试过绑定到dialogopen事件:
$("#acknowledged-dialog").bind('dialogopen', function(event, ui) {
setTimeout($(this).dialog('close'), 3000);
});
$("#acknowledged-dialog").dialog({
height: 140,
modal: true
});
Run Code Online (Sandbox Code Playgroud)
对话框显示,但不会自动关闭.这里的日志也没有错误.
我无法在setTimeout中的$参数中使用'this'吗?
我想知道我是否应该将游戏切换到requestAnimationFrame.如果还有理由再这样做了,正如我读到的那样,当你在主流浏览器中切换标签时,setTimeout()现在也会暂停.
无论如何,说我想控制动画的FPS.
目前我可以这样做:
k.state.loopinterval =
window.setInterval(renderLoop(), 1000 / k.settings.engine.fps );
Run Code Online (Sandbox Code Playgroud)
k.settings.engine.fps
想要的fps 在哪里?
如果我这样做requestAnimationFrame
,我就失去了这种可能性,它只会给我任何可以给予的东西:
window.requestAnimFrame(k.operations.startLoop);
renderLoop();
Run Code Online (Sandbox Code Playgroud)
我看到有人建议将requestAnimFrame放在另一个循环中:
setInterval( function () {
requestAnimationFrame( draw );
}, 1000 / 60 );
Run Code Online (Sandbox Code Playgroud)
那么......我该怎么办?保持原状?
requestAnimationFrame有什么好处,现在切换标签时setTimeout也暂停了?
window.onload = ->
boxOrig1 = 10
boxOrig2 = 30
canvasW = 400
canvasH = 300
ctx = $("#canvas")[0].getContext('2d');
draw = (origin,dimension) ->
ctx.clearRect(0, 0, canvasW, canvasH)
ctx.fillStyle = 'rgb(200,0,0)'
ctx.fillRect(origin + boxOrig1, boxOrig1, dimension, dimension)
ctx.fillStyle = 'rgba(0, 0, 200, 0.5)'
ctx.fillRect(origin + boxOrig2, boxOrig2, dimension, dimension)
for m in [10..100] by 10
t = setTimeout (-> draw(m, 150)), 1000
t.clearTimeout
# draw(m,150)
# alert m
Run Code Online (Sandbox Code Playgroud)
作为练习,上面的代码是在画布上绘制一个小设计,暂停一秒,然后再向右重绘10个像素.
我可以看到,当我用警报中断循环时,机制工作正常(如最后两条注释行),但我没有得到setTimeout函数的预期行为.设计只是在超时后出现在最右边的位置,跳过两者之间的增量步骤.
我从其他例子中尝试了许多不同的方法,但它只是在融化我的大脑.有什么建议?
我已经看过类似的问题,但提供的答案涉及按钮而不是div元素.当我单击带有id的div元素时click
,单击事件处理程序将被禁用,unbind()
并将计时器设置为2秒.2秒后,应再次启用click事件处理程序bind()
.问题是click事件处理程序似乎没有"反弹".我将文本附加到另一个div元素以检查click事件处理程序是否处于活动状态.
这是我的jsfiddle:
关于nodejs的Timers的文档说setTimeout将返回timeoutId http://nodejs.org/api/timers.html#timers_cleartimeout_timeoutid
当我在web broswer中使用javascript时,我得到一个整数作为返回值.
var b = setTimeout(function(){console.log("Taco Bell")})
// b = 20088
Run Code Online (Sandbox Code Playgroud)
当我使用节点并做同样的事情时,返回是
var b = setTimeout(function(){console.log("Taco Bell")})
// { _idleTimeout: 60000,
// _idlePrev:
// { _idleNext: [Circular],
// _idlePrev: [Circular],
// ontimeout: [Function] },
// _idleNext:
// { _idleNext: [Circular],
// _idlePrev: [Circular],
// ontimeout: [Function] },
// _onTimeout: [Function],
// _idleStart: Wed Jan 30 2013 08:23:39 GMT-0800 (PST) }
Run Code Online (Sandbox Code Playgroud)
我想要做的是将setTimeout整数存储到redis中,然后再将其清除.所以我尝试做这样的事情
var redis = require('redis');
var redisClient = redis.createClient();
var delay = setTimeout(function(){console.log("hey")}, 20000);
var envelope = { …
Run Code Online (Sandbox Code Playgroud) 我使用了这段代码(后跟一个填充"tcap"textarea的xmlhttprequest):
st=setTimeout(checkme(),4000)
Run Code Online (Sandbox Code Playgroud)
在哪里checkme()
:
function checkme() {
if (typeof (st) != 'undefined') clearTimeout(st)
if (document.getElementById("tcap").innerHTML.length > 0) {
document.getElementById('waitmsg').style.display = 'none'
} else {
st = setTimeout(checkme(), 1000)
}
}
Run Code Online (Sandbox Code Playgroud)
如果我运行它,它冻结Firefox 19没有错误消息.但是如果我用第一个参数替换(在代码和checkme()函数中):
st=setTimeout(function(){checkme()},4000)
Run Code Online (Sandbox Code Playgroud)
它工作正常.所以我的问题是:checkme()
使用或不使用anon函数调用函数有什么区别?为什么在第一种情况下会冻结Firefox?
谢谢
我从堆栈溢出中获取以下代码:
function doSomething() {
var d = new Date(),
h = new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours() + 1, 0, 0, 0),
e = h - d;
window.setTimeout(doSomething, e);
//code to be run
alert("On the hour")
}
doSomething();
Run Code Online (Sandbox Code Playgroud)
这完美地工作,并在每小时产生一个警报.我希望该功能每隔15分钟运行一次,分别为00,15,30和45
function test(){
setTimeout(function(){
var now=new Date();
while((new Date()).getTime() < now.getTime()+5000){ }
console.log('p')
}, 0);
}
test();
test(); //it takes 10 seconds,the second test function runs after the first finished.
Run Code Online (Sandbox Code Playgroud)
谁可以向我解释它是如何工作的?
在有关前端工程师性能最佳实践的mozilla文档中,建议结合setTimeout
使用requestAnimationFrame
以在重新绘制后立即运行某些东西:
requestAnimationFrame(() => {
setTimeout(() => {
// This code will be run ASAP after Style and Layout information have
// been calculated and the paint has occurred. Unless something else
// has dirtied the DOM very early, querying for style and layout information
// here should be cheap.
}, 0);
});
Run Code Online (Sandbox Code Playgroud)
为什么这是推荐的解决方案?究竟是什么使它成为在重画后立即安排某些事情的最佳方式?
javascript ×10
settimeout ×10
jquery ×3
asynchronous ×1
bind ×1
browser ×1
coffeescript ×1
greasemonkey ×1
html5 ×1
jquery-ui ×1
node.js ×1
redis ×1
repaint ×1
unbind ×1