2013-04-22 49 views
0

好的,所以我有一个事件监听器在监听“timeupdate”事件的视频播放器上,每秒发生5到10次,每次当前时间码为视频播放器已更新。我正在编写一个函数,允许我根据视频的播放位置在特定时间内执行某些操作。 IE - 在320帧暂停视频,在420帧暂停视频。由监听器调用的Javascript函数将不会更新全局变量

为了节省处理能力,我创建了一个名为notStarted的全局变量,它基本上告诉函数是否启动事件(暂停视频)或停止事件(取消暂停视频),以便当notStarted为true时,我们开始事件,当notStarted为false时,我们结束事件。

这是函数。它在开始事件后成功地使notStarted成为假,但之后它不会将其改回为真。

更新:这里是所有相关的代码

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); 
+0

你可以请更新代码,看看你在哪里调用ketFrames()? – ricardohdz 2013-04-22 14:17:25

+0

您是在$(document).ready还是window.onload中声明变量?我知道这很愚蠢,但它曾经发生过一次,我没有注意到它们并没有在全球范围内宣布。更新了 – multimediaxp 2013-04-22 14:22:48

+0

以显示事件侦听器和所有正在调用的函数keyFrame。 conchShell是一个我不惹恼的视频播放器。我用它为页面上的所有其他玩家设置基准时间码。 – coulbourne 2013-04-22 14:29:25

回答

1

正如你可能知道,JavaScript使用功能范围,这意味着每个变量有它的内声明的功能范围。

事实上,同一个函数在一种情况下成功地改变了notStarted的值,而不是另一种情况,这表明发生了三件事之一。

1)你的内部条件的if else语句不被评估真假你所期望的方式,或

2)错误可以在函数内部发生导致它它设置变量之前停止执行你期望的方式,或者

3)其他一些代码意外地改变了你的变量的值。

如果你没有一个调试器,你可以附加到步骤通过代码,我会建议放入一些alert语句,以便您可以确定您的程序如何执行。

+0

这是我的源订单。事情发生之前有些事情正在死亡 – coulbourne 2013-04-22 22:31:14