侦听器调用的Javascript函数不能更新全局变量
Javascript function called by listener won't update global variable
好的,所以我在视频播放器上有一个事件监听器,监听"timeupdate"事件,每秒发生5 - 10次,每次更新视频播放器的当前时间码。我在写一个函数,它允许我在一段时间内根据视频的播放位置做一些事情。也就是说——在第320帧暂停视频,在第420帧取消。
为了节省处理能力,我创建了一个名为notStarted的全局变量,它基本上告诉函数是启动事件(暂停视频)还是停止事件(取消视频),所以当notStarted为真时,我们开始事件,当notStarted为假时,我们结束事件。
这是函数。在事件开始后,它成功地将notStarted设置为false,但之后它不会将其更改回true。
更新:这里是所有相关代码
var frameRate = 30;
var players=new Array(_V_("video_canvas_1"), _V_("video_canvas_2"));
var canv1 = players[0];
var canv2 = players[1];
var canv1Play = 1; // Autoplay is enabled, so we set the Play state to 1 off the bat.
var canv2Play = 1; // Autoplay is enabled, so we set the Play state to 1 off the bat.
var conchShell = _V_("conch"); // Lord of the Flies, Bitch!
var token = 0;
function currentFrame(e) {
return frameRate * e.currentTime();
console.log('currentTime * frameRate:' + frameRate * e.currentTime());
}
// Accepts player objects as arguments - canv1, canv2
function pause(){
for (var i = 0, j = arguments.length; i < j; i++){
arguments[i].pause();
console.log( arguments[i] + '1 is paused' ); /* TODO: REMOVE CONSOLE LOGS BEFORE DEPLOYMENT */
}
}
function play(){
for (var i = 0, j = arguments.length; i < j; i++){
arguments[i].play();
console.log( arguments[i] + '1 is playing' );
}
}
function syncSingleToConch(e) {
e.currentTime(conchShell.currentTime());
}
function syncToConchShell() {
async.parallel([
async.each(players, syncSingleToConch, function(err){ console.log('error with the each function'); }),
conchShell.currentTime(arguments[0].currentTime()),
async.each(players, playSingle, function(err){ console.log('error with the each function'); })
]);
}
function pauseAtKeyFrame(startStop, player, frameStart, frameEnd) {
if (startStop === "start") {
pause(player);
console.log('pausing player');
}
if (startStop === "stop") {
play(conchShell, canv1, canv2);
setTimeout(syncToConchShell(canv1), 3500);
startStop = "start";
console.log('playing player');
}
}
var currentEvent = 0;
var notStarted = true;
var frameEvents = [
{
"type": pauseShowModal,
"frameStart": 200,
"frameEnd": 220,
"canvas": canv1
},
{
"type": pauseAtKeyFrame,
"frameStart": 320,
"frameEnd": 420,
"canvas": canv1
},
{
"type": showDivAtTime,
"frameStart": 111,
"frameEnd": 311,
"canvas": canv1,
"div": "frame100"
}
];
function keyFrames() {
if (notStarted === true && frameEvents[currentEvent].frameStart < currentFrame(conchShell) && frameEvents[currentEvent].frameEnd > currentFrame(conchShell)) {
frameEvents[currentEvent].type("start", frameEvents[currentEvent].canvas, frameEvents[currentEvent].div);
notStarted = false;
console.log(notStarted);
} else if (notStarted === false && frameEvents[currentEvent].frameEnd < currentFrame(conchShell)) {
console.log(notStarted);
frameEvents[currentEvent].type("stop", frameEvents[currentEvent].canvas, frameEvents[currentEvent].div);
currentEvent++;
notStarted = true;
}
}
conchShell.addEvent("timeupdate", keyFrames);
你可能知道,Javascript使用函数作用域,这意味着每个变量都有它在其中声明的函数的作用域。
相同的函数在一种情况下成功地改变了notStarted的值,而在另一种情况下却没有,这表明发生了三种情况之一。
1) if else语句中的条件没有按照您期望的方式计算为真或假,或者
2)函数内部可能发生错误,导致它在按您期望的方式设置变量之前停止执行,或者3)其他代码意外地改变了变量的值。
如果你没有一个调试器,你可以附加到一步通过代码,我建议放入一些alert
语句,这样你就可以确定你的程序是如何执行的。
相关文章:
- Highcharts可以从服务器加载数据,但不能更新
- MYSQL更新没有'我不能始终如一地工作
- 可以从控制器更新工厂,但不能从指令更新
- jquery html更新可以在电脑上使用,但不能在智能手机上使用
- 为什么在Firefox更新之后JQuery不能在我的MVC 4应用程序中工作
- 用户不能在从 Heroku 节点.js应用程序在解析上更新 PFUser 时出错
- CouchDB更新处理程序:文档id不能为空
- Flash播放器”;数据“;更新在FF中工作,但不能在x浏览器(twitch)中工作
- 不能在ReactJS中更新现有的输入组件值
- 使用jQuery更新网页.为什么这段代码不能工作?
- 为什么我不能在Javascript中使用赋值语句简单地更新数组[I] ?
- 事件在用AJAX更新之后就不能工作了
- 融合表过滤器不能更新地图
- Mysql UPDATE使用PHP和AJAX,不能更新数据库
- 不能更新指令中的$scope值
- D3图表不能更新——选择的enter和exit属性都为空
- 侦听器调用的Javascript函数不能更新全局变量
- 不能更新或推送数据到mongodb数组
- 不能更新融合表超过30行
- AJAX调用成功后不能更新td数据