Javascript - 记录用户在整个访问过程中按下给定按钮的时间
Javascript - register how long user pressed a given button during whole visit
我正在用Qualtrics编写一个实验,我基本上需要使用Javascript创建一个变量,告诉我参与者按住任何按钮的时间(总数)。按下一个按钮会向参与者显示文本,释放它会使文本消失,所以基本上它会告诉我他们有多少时间阅读文本。因此,假设他们按下按钮三次,第一次按住 30 秒,第二次按下 10 秒,第三次按下 2 秒,此代码应存储值 42。
到目前为止,我所拥有的是这样的:
addEventListener("keydown", function(event) {
if (event.keyCode == 86)
document.getElementById("text").innerHTML = "Text to show";
var d1 = new Date();
document.getElementById("div1").innerHTML = d1.getTime();
});
addEventListener("keyup", function(event) {
if (event.keyCode == 86)
document.getElementById("text").innerHTML = "";
var d2 = new Data();
var d1 = parseFloat(document.getElementById("div1"));
var diff = d2 - d1.getTime();
var old = parseFloat(document.getElementById("div2"));
var old = old + diff;
document.getElementById("div2").innerHTML = old;
Qualtrics.SurveyEngine.setEmbeddedData("readingtime", totalTime);
});
我将值存储在divs 中,因为我似乎无法将值从一个事件侦听器重用到另一个事件侦听器(这可能是因为我对 javascript 和作用域了解不够)。哦,最后一个函数只是一个特定于 Qualtrics 的函数,用于将值存储在数据库中。无论如何,我无法让它工作,当我检查数据库中的变量时,它只是空的。任何人都能发现我做错了什么?
我对你的代码做了一些更改:
- 添加了全局变量
- 添加了几个缺失的括号
- 将侦听器附加到窗口
- 删除了对 DOM 元素的多个调用
- 为每个事件侦听器创建了一个函数
- 将经过的时间四舍五入到秒
var d0;
var d1;
var subtotal = 0;
var total = 0;
var div1 = document.getElementById("div1");
var text = document.getElementById("text");
window.addEventListener("keydown", dealWithKeyDown, false);
window.addEventListener("keyup", dealWithKeyUp, false);
function dealWithKeyDown(event) {
if (event.keyCode == 86) {
if (typeof d0 === 'undefined') {
d0 = new Date();
}
d1 = new Date();
subtotal = Math.round((d1.getTime() - d0.getTime()) / 1000);
div1.innerHTML = subtotal;
text.innerHTML = "Text to show";
}
}
function dealWithKeyUp(event) {
if (event.keyCode == 86) {
total = total + subtotal;
text.innerHTML = "";
d0 = undefined;
Qualtrics.SurveyEngine.setEmbeddedData("readingtime", total);
}
}
Okey dokey,由于发布的答案似乎都没有被接受,我将发布我自己的答案。
关于这个解决方案真的没什么好说的,它非常简单,很好地放入对象中,以便我们知道发生了什么,我什至给你一个小提琴!
有一个问题我不知道我是否解决了,但有时按钮会显示它已被按下数百万秒,我认为这是因为 Key 没有正确初始化,这很奇怪,但它很少发生足以让我把修复它的负担放在你身上。
代码在这里:https://jsfiddle.net/vo2n1jw1/
粘贴到:
var Key = function(code)
{
this.code = code;
};
Key.prototype.time = 0;
Key.prototype.pressedAt = 0;
Key.prototype.getTimeInSeconds = function()
{
return this.time / 1000;
};
var Keyboard = function()
{
this.keys = [];
};
Keyboard.prototype.addOrGetKey = function(code)
{
var key = this.getKey(code);
if(!key)
{
key = new Key(code);
this.addKey(key);
}
return key;
};
Keyboard.prototype.addKey = function(key)
{
this.getKeys()[key.code] = key;
};
Keyboard.prototype.getKey = function(code)
{
return this.getKeys()[code];
};
Keyboard.prototype.getKeys = function()
{
return this.keys;
};
Keyboard.prototype.printAllKeysIntoElement = function(element)
{
var keys = this.getKeys();
var length = keys.length;
element.innerHTML = "";
for(var i = 0; i < length; i++)
{
var key = keys[i];
if(!key)
{
continue;
}
var keyElement = document.createElement("div");
keyElement.innerHTML = "Button: " + key.code + " has been pressed for " + key.getTimeInSeconds() + " seconds";
element.appendChild(keyElement);
}
};
var KeyboardListener = function(keyboard, element)
{
this.keyboard = keyboard;
this.container = element;
this.onKeyDownThis = this.onKeyDown.bind(this);
document.addEventListener("keydown", this.onKeyDownThis, false);
document.addEventListener("keyup", this.onKeyUp.bind(this), false);
};
KeyboardListener.prototype.onKeyDown = function(event)
{
console.log("press");
var keyboard = this.getKeyboard();
var code = event.keyCode;
var key = keyboard.addOrGetKey(code);
key.pressedAt = Date.now();
document.removeEventListener("keydown", this.onKeyDownThis, false);
return false;
};
KeyboardListener.prototype.onKeyUp = function(event)
{
console.log("release");
var keyboard = this.getKeyboard();
var code = event.keyCode;
var key = keyboard.addOrGetKey(code);
if(key.pressedAt)
{
key.time += Date.now() - key.pressedAt;
keyboard.printAllKeysIntoElement(this.container);
}
document.addEventListener("keydown", this.onKeyDownThis, false);
return false;
};
KeyboardListener.prototype.getKeyboard = function()
{
return this.keyboard;
};
var resultsElement = document.getElementById("results");
var keyboard = new Keyboard();
var listener = new KeyboardListener(keyboard, resultsElement);
有 3 个对象:
钥匙键盘键盘监听
器他们真的做他们听起来像的样子。
告诉我,如果你想解释什么。
哦,有一件事,我知道你不应该使用这样的数组,但我很懒。
您可以尝试在侦听器和函数外部创建一个变量,以便您可以在任何地方使用它。而且我认为你通过获得日期的时间做得很好。
var firstTime = new Date();
var totalTime = 0;
addEventListener("keydown", function(event) {
if (event.keyCode == 86) {
document.getElementById("text").innerHTML = "Text to show";
firstTime = new Date();
}
});
addEventListener("keyup", function(event) {
if (event.keyCode == 86) {
document.getElementById("text").innerHTML = "";
var d2 = new Date();
var diff = d2.getTime() - firstTime.getTime();
totalTime += diff;
Qualtrics.SurveyEngine.setEmbeddedData("readingtime", totalTime);
}
});
最好将 d1 和 d2 变量声明为全局变量,而不是使用 html 元素作为存储。
var d1, d2;
var total_time = 0;
var key_pressed = false;
addEventListener("keydown", function(event) {
if (event.keyCode == 86) {
if (!key_pressed)
d1 = new Date();
key_pressed = true;
}
});
addEventListener("keyup", function(event) {
if (event.keyCode == 86) {
key_pressed = false;
d2 = new Date();
total_time += d2.getTime() - d1.getTime();
Qualtrics.SurveyEngine.setEmbeddedData("readingtime", total_time);
}
});
当按住"v"键时,会反复调用 keydown 侦听器。这就是为什么有布尔变量,即"key_pressed"来检测第一时间的保持键。
"总时间"在哪里分配?
您的总时间是否有任何价值?您是否尝试使用浏览器控制台调试 javascript?
如果不想将数据存储到div,可以将其存储在全局变量中。
var times = {
start: 0,
total: 0
}
addEventListener("keydown", function(event) {
if (event.keyCode == 86) {
// i think your hole code should be executed only on releasing this one button
document.getElementById("text").innerHTML = "Text to show";
times.start = new Date();
}
});
addEventListener("keyup", function(event) {
if (event.keyCode == 86) {
// i think your hole code should be executed only on releasing this one button
document.getElementById("text").innerHTML = "";
var diff = new Date().getTime() - times.start.getTime();
times.total = times.total + diff;
Qualtrics.SurveyEngine.setEmbeddedData("readingtime", times.total);
}
});
因此,您可以使用事件侦听器函数外部的 var 时间来声明其全局。
我注意到你使用了没有 { 和 } 的 if ()..,所以只有下一行受到影响,如果你想要,我不会舒尔。
- 如何禁用引导程序时间选择器中的按钮
- 当点击今天按钮时,Bootstrap Date Time Picker未选择当前时间
- 按时间启用HTML按钮
- 根据服务器时间禁用启用单选按钮
- Javascript按钮禁用并启用特定时间
- 一段时间后自动点击提交按钮
- 尝试使用jquery设置鼠标按下的时间来更改按钮触发器以控制音量滑块
- 如何使用java脚本代码计算禁用按钮的时间
- 使用setTimeout为按钮添加冷却时间
- 当当前时间距数据库中设置的时间不到一小时时,如何禁用按钮
- 只显示潜水时悬停按钮X时间-可以'我不能使它正常工作
- 在javascript中每隔一段时间自动更改按钮的背景
- 通过带有jQuery的按钮跳到HTML5视频中的特定时间
- 单击“在时间存储变量”按钮,以便在触发 ajaxComplete 事件时使用
- 离子按钮点击,持续时间长
- 每次用户点击按钮时,将“时间”存储在Firebase中
- 将两个函数绑定到一个按钮,具体取决于按钮的按下时间长短
- JavaScript:通过单击按钮来捕获系统时间的代码
- Javascript - 记录用户在整个访问过程中按下给定按钮的时间
- 如何使用javascript记录两次按钮按下之间的响应时间(以秒为单位)