2014-05-16 32 views
0

好的。我一直在考虑这一整天,并可能失去了概述,并永远不会提出解决方案。背景:我的脚本(下面摘录)反复显示“WORD”(快速淡入,可变淡出),并记录外观和按键之间经过的时间。看到这FIDDLE正确记录jquery中两个事件之间的时间

但是,我认为我的t1和t2没有放置/定时精确。我想要的是:它应该记录从出现到按键的时间间隔,并且WORD应始终显示1500ms(除非按键按下时间间隔),因此理论最大响应时间为1499毫秒。

我怀疑我的变量randomisi是一个问题,不是吗?我试图考虑到这一点,但有时会得到负面反应时间。

var isi = [250, 500, 750]; var RT = []; 
var showwords = function() { 
    var randomisi = isi[Math.floor((Math.random() * isi.length))]; 

    $("#words").fadeOut(randomisi, function() { 
     $("#words").text("WORD").fadeIn(10); 
    }); 

    t1 = (new Date()).getTime(); 
}; 


INT = setInterval(showwords, 1500); 

$(document).keypress(function(e) { 
    clearInterval(INT); 
    var t2 = (new Date()).getTime(); 
    reac = t2 - t1;RT.push(reac); $("#RT").val(RT); 
    t1 = t2; 
    INT = setInterval(showwords, 1500); 
}); 

有人可以解释这对我来说太复杂的时间问题?

+1

什么不能正常工作? – PeterKA

回答

1

之一三件事关闭在你的脚本似乎是这部分

$("#words").fadeOut(randomisi, function() { 
    $("#words").text("WORD").fadeIn(10); 
}); 

t1 = (new Date()).getTime(); 

.fadeOut实际上并没有阻止脚本,所以t1被设置,即使前面的单词淡出,给你一个大的RT值。
Relacing此代码

$("#words").fadeOut(randomisi, function() { 
    $("#words").text("WORD").fadeIn(10, function(){ 
     t1 = (new Date()).getTime(); 
    }); 
}); 

将解决问题1

第二个问题是,它保持监听,即使这个词淡出KEYDOWN。您可以通过向代码添加新的标志来防止这种情况。

你fix1和FIX2后代码

var isi = [250, 500, 750], 
    RT = [], 
    listen = false; 

var showwords = function() { 
    listen = false; 
    var randomisi = isi[Math.floor((Math.random() * isi.length))]; 
    $("#words").fadeOut(randomisi, function() { 
     $("#words").text("WORD").fadeIn(10, function() { 
      t1 = (new Date()).getTime(); 
      listen = true; 
     }); 
    }); 
}; 

INT = setInterval(showwords, 1500); 
$(document).keypress(function (e) { 

    if(listen == false) return; 

    clearInterval(INT); 

    var t2 = (new Date()).getTime(); 
    reac = t2 - t1; 
    RT.push(reac); 
    $("#RT").val(RT); 
    INT = setInterval(showwords, 1500); 
}); 

第三期似乎是这个词会出现1500 - randomisi - 10毫秒,而不是正好1500毫秒。

+0

这很棒,1和2完美地工作。谢谢。我试图用变量randomisi动态设置Interval。但我似乎没有访问showwords函数以外的时间间隔的“最近的”randomisi。任何想法? –

+0

使它成为一个全局变量而不是函数的私有变量,即除去'randomisi'旁边的'var'(第7行)并放置'var randomisi = isi [Math.floor((Math.random()* isi.length))] ;'在RT = []之后,'第2行) – Ejaz

+0

,但对于'setInterval'和'.fadeout'使用相同的'randomisi'值将会产生意想不到的结果,因为新单词需要'(randomisi + 10)ms'出现,但你会每隔'randomisi'ms切换单词。我会'setInterval'每个'randomisi * 2'ms – Ejaz

0

唯一的原因,我可以看到其他比负时钟偏差,可能导致t2是小于t1是,如果JavaScript实现是多线程和showwords已经被按键事件触发时执行,t1showwords后更新t2由按键处理程序设置,但在计算reac之前。

如果添加一个锁变量,以消除这种可能性,你可以确认或排除这种可能性:

var isi = [250, 500, 750]; var RT = []; 
var inShowWords = 0; 
var showwords = function() { 
    inShowWords = 1; 
    var randomisi = isi[Math.floor((Math.random() * isi.length))]; 

    $("#words").fadeOut(randomisi, function() { 
     $("#words").text("WORD").fadeIn(10); 
    }); 

    t1 = (new Date()).getTime(); 
    inShowWords = 0; 
}; 


INT = setInterval(showwords, 1500); 

$(document).keypress(function(e) { 
    if (inShowWords == 0) { 
     clearInterval(INT); 
     var t2 = (new Date()).getTime(); 
     reac = t2 - t1;RT.push(reac); $("#RT").val(RT); 
     t1 = t2; 
     INT = setInterval(showwords, 1500); 
    } else { 
     RT.push('locked'); $("#RT").val(RT); 
    } 
}); 
+0

这看起来是一个很好的解决方案。 (1)在顶部声明't1'和'INT'并且(2)移动't1 =(new Date())。getTime()(eqv。t1 = Date.now())'放入'.fadeOut()'回调函数中,以便在'.fadeIn()'启动时立即启动。 – PeterKA