-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjspsych-single-stim.js
137 lines (110 loc) · 3.81 KB
/
jspsych-single-stim.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/**
* jspsych-single-stim
* Josh de Leeuw
*
* plugin for displaying a stimulus and getting a keyboard response
*
* documentation: docs.jspsych.org
*
**/
jsPsych.plugins["single-stim"] = (function() {
var plugin = {};
jsPsych.pluginAPI.registerPreload('single-stim', 'stimulus', 'image');
plugin.trial = function(display_element, trial) {
// if any trial variables are functions
// this evaluates the function and replaces
// it with the output of the function
trial = jsPsych.pluginAPI.evaluateFunctionParameters(trial);
// set default values for the parameters
trial.choices = trial.choices || [];
trial.response_ends_trial = (typeof trial.response_ends_trial == 'undefined') ? true : trial.response_ends_trial;
trial.timing_stim = trial.timing_stim || -1;
trial.timing_response = trial.timing_response || -1;
trial.is_html = (typeof trial.is_html == 'undefined') ? false : trial.is_html;
trial.prompt = trial.prompt || "";
// this array holds handlers from setTimeout calls
// that need to be cleared if the trial ends early
var setTimeoutHandlers = [];
// display stimulus
if (!trial.is_html) {
display_element.append($('<img>', {
src: trial.stimulus,
id: 'jspsych-single-stim-stimulus'
}));
} else {
display_element.append($('<div>', {
html: trial.stimulus,
id: 'jspsych-single-stim-stimulus'
}));
}
//show prompt if there is one
if (trial.prompt !== "") {
display_element.append(trial.prompt);
}
// store response
var response = {
rt: -1,
key: -1
};
// function to end trial when it is time
var end_trial = function() {
// kill any remaining setTimeout handlers
for (var i = 0; i < setTimeoutHandlers.length; i++) {
clearTimeout(setTimeoutHandlers[i]);
}
// kill keyboard listeners
if (typeof keyboardListener !== 'undefined') {
jsPsych.pluginAPI.cancelKeyboardResponse(keyboardListener);
}
// gather the data to store for the trial
var trial_data = {
"rt": response.rt,
"stimulus": trial.stimulus,
"key_press": response.key
};
//jsPsych.data.write(trial_data);
// clear the display
display_element.html('');
// 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
$("#jspsych-single-stim-stimulus").addClass('responded');
// only record the first response
if (response.key == -1) {
response = info;
}
if (trial.response_ends_trial) {
end_trial();
}
};
// start the response listener
if (JSON.stringify(trial.choices) != JSON.stringify(["none"])) {
var keyboardListener = jsPsych.pluginAPI.getKeyboardResponse({
callback_function: after_response,
valid_responses: trial.choices,
rt_method: 'date',
persist: false,
allow_held_key: false
});
}
// hide image if timing is set
if (trial.timing_stim > 0) {
var t1 = setTimeout(function() {
$('#jspsych-single-stim-stimulus').css('visibility', 'hidden');
}, trial.timing_stim);
setTimeoutHandlers.push(t1);
}
// end trial if time limit is set
if (trial.timing_response > 0) {
var t2 = setTimeout(function() {
end_trial();
}, trial.timing_response);
setTimeoutHandlers.push(t2);
}
};
return plugin;
})();