in datawig-js/static/jspsych-6.1.0/plugins/jspsych-video-keyboard-response.js [103:233]
plugin.trial = function(display_element, trial) {
// setup stimulus
var video_html = '<div>'
video_html += '<video id="jspsych-video-keyboard-response-stimulus"';
if(trial.width) {
video_html += ' width="'+trial.width+'"';
}
if(trial.height) {
video_html += ' height="'+trial.height+'"';
}
if(trial.autoplay){
video_html += " autoplay ";
}
if(trial.controls){
video_html +=" controls ";
}
video_html +=">";
var video_preload_blob = jsPsych.pluginAPI.getVideoBuffer(trial.sources[0]);
if(!video_preload_blob) {
for(var i=0; i<trial.sources.length; i++){
var file_name = trial.sources[i];
if(file_name.indexOf('?') > -1){
file_name = file_name.substring(0, file_name.indexOf('?'));
}
var type = file_name.substr(file_name.lastIndexOf('.') + 1);
type = type.toLowerCase();
video_html+='<source src="' + file_name + '" type="video/'+type+'">';
}
}
video_html += "</video>";
video_html += "</div>";
// add prompt if there is one
if (trial.prompt !== null) {
video_html += trial.prompt;
}
display_element.innerHTML = video_html;
if(video_preload_blob){
display_element.querySelector('#jspsych-video-keyboard-response-stimulus').src = video_preload_blob;
}
display_element.querySelector('#jspsych-video-keyboard-response-stimulus').onended = function(){
if(trial.trial_ends_after_video){
end_trial();
}
}
if(trial.start !== null){
display_element.querySelector('#jspsych-video-keyboard-response-stimulus').currentTime = trial.start;
}
if(trial.stop !== null){
display_element.querySelector('#jspsych-video-keyboard-response-stimulus').addEventListener('timeupdate', function(e){
var currenttime = display_element.querySelector('#jspsych-video-keyboard-response-stimulus').currentTime;
if(currenttime >= trial.stop){
display_element.querySelector('#jspsych-video-keyboard-response-stimulus').pause();
}
})
}
display_element.querySelector('#jspsych-video-keyboard-response-stimulus').playbackRate = trial.rate;
// store response
var response = {
rt: null,
key: null
};
// function to end trial when it is time
function end_trial() {
// kill any remaining setTimeout handlers
jsPsych.pluginAPI.clearAllTimeouts();
// kill keyboard listeners
jsPsych.pluginAPI.cancelAllKeyboardResponses();
// gather the data to store for the trial
var trial_data = {
"rt": response.rt,
"stimulus": trial.stimulus,
"key_press": response.key
};
// clear the display
display_element.innerHTML = '';
// move on to the next trial
jsPsych.finishTrial(trial_data);
};
// function to handle responses by the subject
var after_response = function(info) {
// after a valid response, the stimulus will have the CSS class 'responded'
// which can be used to provide visual feedback that a response was recorded
display_element.querySelector('#jspsych-video-keyboard-response-stimulus').className += ' responded';
// only record the first response
if (response.key == null) {
response = info;
}
if (trial.response_ends_trial) {
end_trial();
}
};
// start the response listener
if (trial.choices != jsPsych.NO_KEYS) {
var keyboardListener = jsPsych.pluginAPI.getKeyboardResponse({
callback_function: after_response,
valid_responses: trial.choices,
rt_method: 'performance',
persist: false,
allow_held_key: false,
});
}
// end trial if time limit is set
if (trial.trial_duration !== null) {
jsPsych.pluginAPI.setTimeout(function() {
end_trial();
}, trial.trial_duration);
}
};