为什么在 jQuery 中传递给我的回调函数的参数不断更改
Why does a parameter passed to my callback function in jQuery keep getting changed?
我正在研究不同的方法来解决jQuery中众所周知的有争议的"requestAnimationFrame"删除问题,其中animate被恢复为使用setTimeout/setInterval而不是即将到来的requestAnimationFrame API。这当然会导致一些已知问题,当该页面的浏览器选项卡不在焦点中时,动画会排队(因为我希望当页面的选项卡失焦时动画停止的这种效果,所以它成为一个问题(。一种解决方案是将所有内容包装在真正的"requestAnimationFrame"的跨浏览器请求AnimFrame填充码中,另一种解决方案是为动画元素生成唯一的ID加上时间戳,并且仅在窗口聚焦时运行动画。
这是我在焦点侦听器和 ID 传递的第二种方法中遇到的令人沮丧的问题的快速而肮脏的演示:http://jsfiddle.net/bcmoney/NMgsc/17
更新(主要问题已解决(:http://jsfiddle.net/bcmoney/NMgsc/
准系统代码:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>window.focus listener EXAMPLE - jsFiddle demo by bcmoney</title>
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'></script>
<style type='text/css'>
body { overflow:hidden; }
#container { width:100%; height:100%; }
#animated { width:120px; position:absolute; left:2px; top:20px; padding:50px; background:skyblue; color:white }
</style>
<script type='text/javascript'>//<![CDATA[
$(function(){
var animation = 1;
var startTime = undefined;
var FPS = 60; //frames per second
var AVAILABLE_WIDTH = $("#container").width() || "800px";
var animation = null;
var FOCUSED = false;
var timestamp = new Date().getTime();
var PAGE_ID = $("body").attr("id") + "-animated-"+timestamp;
function continueScrolling(p) {
console.log('FUNCTION p: '+p);
if (FOCUSED === true && p === PAGE_ID) {
animation = setTimeout(scrollRight.bind(p), FPS);
} else {
clearTimeout(animation);
$('#animated').stop(true, true);
}
}
var scrollRight = function(p) {
time = +new Date;
startTime = (startTime !== undefined) ? startTime : time-FPS;
move = ((time - startTime)/10 % AVAILABLE_WIDTH)+"px";
console.log('P:'+p+' | T:'+time+' | ST:'+startTime+' | W:'+AVAILABLE_WIDTH+''n'+move);
$('#animated').animate({
"left":move
},
1000/FPS,
"linear",
function() {
console.log('CALLBACK p: '+p);
continueScrolling(p);
}
);
}
$(window).blur(function(){
FOCUSED = false;
$('#stop').click();
});
$(window).focus(function(){
FOCUSED = true;
$('#start').click();
});
$('#start').click(function() {
scrollRight(PAGE_ID);
});
$('#stop').click(function() {
$('#animated').stop(true, true);
clearTimeout(animation);
});
});//]]>
</script>
</head>
<body id="slider">
<a id="start" href="#start">Start</a> | <a id="stop" href="#stop">Stop</a>
<div id="container">
<div id="animated">Animated content</div>
</div>
</body>
</html>
我最近才意识到唯一 ID 可能不是必需的,并抛弃了我对焦点侦听器的初步调查,现在支持填充方法;然而,这种修补指出了 jQuery 的另一个潜在问题(或者更可能是我对它的理解(,将参数传递给 jQuery 中的回调函数并确保参数的值通过动画上下文传播。
如您所见,动画启动和停止是因为不再传递值"p"。我不是闭包方面的专家,但我看到它们在这里作为一种解决方案提出,并使用 $.proxy(我在休息并沮丧地发布到 SO 之前从这里尝试过(。即使在链接 API 调用时,我也从未遇到过 $.ajax 或 $.getJSON 回调的问题,但由于某种原因,我似乎无法让回调参数保持其值,以便后续调用 continueScrolling 函数。一些JS/jQuery忍者的任何帮助将不胜感激......
setTimeout需要一个函数作为第一个参数:
animation = setTimeout(function(){scrollRight(p)}, FPS);
http://jsfiddle.net/K2nfM/
- 函数参数中的数据与指定变量之间的任何性能差异
- AngularJS:我可以跳过函数参数回调吗
- 函数未将值作为参数传递
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 为什么不'我们在javascript中使用函数参数的数据类型
- 你好,这是测试用例,我必须在函数中传递n个参数
- JavaScript - 多参数函数,它是多个图像库的字符串
- 如何从两个参数函数返回随机整数
- 以无点风格在Ramda中编写一个无参数函数
- JS:将单参数函数转换为可链接函数
- 正则表达式类似于Javascript中的参数函数
- 将 $' 值传递给替换的关联参数函数
- "这个“;在参数函数中
- 如何向jquery插件发送参数函数
- 将参数函数Node.js从一个js传递到另一个js
- 如何在javascript参数函数中传递PHP post方法字符串
- 装饰 Javascript Promise.then 以便参数函数接收附加参数
- 正在分析setInterval ID'是的's参数函数
- 如何根据一个参数函数计算年龄
- 对象参数/函数和/或三元运算符混淆