jspsych 6.2.0 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -29
- package/css/jspsych.css +39 -39
- package/dist/JsPsych.d.ts +112 -0
- package/dist/TimelineNode.d.ts +34 -0
- package/dist/index.browser.js +3164 -0
- package/dist/index.browser.js.map +1 -0
- package/dist/index.browser.min.js +2 -0
- package/dist/index.browser.min.js.map +1 -0
- package/dist/index.cjs +3158 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +3152 -0
- package/dist/index.js.map +1 -0
- package/dist/migration.d.ts +3 -0
- package/dist/modules/data/DataCollection.d.ts +45 -0
- package/dist/modules/data/DataColumn.d.ts +15 -0
- package/dist/modules/data/index.d.ts +25 -0
- package/dist/modules/data/utils.d.ts +3 -0
- package/dist/modules/extensions.d.ts +22 -0
- package/dist/modules/plugin-api/HardwareAPI.d.ts +15 -0
- package/dist/modules/plugin-api/KeyboardListenerAPI.d.ts +34 -0
- package/dist/modules/plugin-api/MediaAPI.d.ts +27 -0
- package/dist/modules/plugin-api/SimulationAPI.d.ts +41 -0
- package/dist/modules/plugin-api/TimeoutAPI.d.ts +5 -0
- package/dist/modules/plugin-api/index.d.ts +8 -0
- package/dist/modules/plugins.d.ts +129 -0
- package/dist/modules/randomization.d.ts +35 -0
- package/dist/modules/turk.d.ts +40 -0
- package/dist/modules/utils.d.ts +7 -0
- package/package.json +32 -15
- package/src/JsPsych.ts +884 -0
- package/src/TimelineNode.ts +536 -0
- package/src/index.ts +71 -0
- package/src/migration.ts +37 -0
- package/src/modules/data/DataCollection.ts +198 -0
- package/src/modules/data/DataColumn.ts +86 -0
- package/src/modules/data/index.ts +174 -0
- package/src/modules/data/utils.ts +75 -0
- package/src/modules/extensions.ts +23 -0
- package/src/modules/plugin-api/HardwareAPI.ts +32 -0
- package/src/modules/plugin-api/KeyboardListenerAPI.ts +165 -0
- package/src/modules/plugin-api/MediaAPI.ts +337 -0
- package/src/modules/plugin-api/SimulationAPI.ts +181 -0
- package/src/modules/plugin-api/TimeoutAPI.ts +16 -0
- package/src/modules/plugin-api/index.ts +28 -0
- package/src/modules/plugins.ts +158 -0
- package/src/modules/randomization.ts +327 -0
- package/src/modules/turk.ts +99 -0
- package/src/modules/utils.ts +30 -0
- package/.github/workflows/jest.yml +0 -20
- package/code-of-conduct.md +0 -56
- package/contributors.md +0 -61
- package/docs/CNAME +0 -1
- package/docs/about/about.md +0 -18
- package/docs/about/contributing.md +0 -43
- package/docs/about/license.md +0 -25
- package/docs/about/support.md +0 -7
- package/docs/core_library/jspsych-core.md +0 -661
- package/docs/core_library/jspsych-data.md +0 -589
- package/docs/core_library/jspsych-pluginAPI.md +0 -510
- package/docs/core_library/jspsych-randomization.md +0 -397
- package/docs/core_library/jspsych-turk.md +0 -102
- package/docs/img/blue.png +0 -0
- package/docs/img/folder-setup.png +0 -0
- package/docs/img/folder-with-html.png +0 -0
- package/docs/img/githubreleases.jpg +0 -0
- package/docs/img/jspsych-favicon.png +0 -0
- package/docs/img/jspsych-logo-no-text-mono.svg +0 -493
- package/docs/img/jspsych-logo.jpg +0 -0
- package/docs/img/orange.png +0 -0
- package/docs/img/palmer_stim.png +0 -0
- package/docs/img/progress_bar.png +0 -0
- package/docs/img/visual_search_example.jpg +0 -0
- package/docs/index.md +0 -9
- package/docs/overview/browser-device-support.md +0 -35
- package/docs/overview/callbacks.md +0 -140
- package/docs/overview/data.md +0 -281
- package/docs/overview/exclude-browser.md +0 -32
- package/docs/overview/experiment-options.md +0 -121
- package/docs/overview/fullscreen.md +0 -36
- package/docs/overview/media-preloading.md +0 -91
- package/docs/overview/mturk.md +0 -77
- package/docs/overview/progress-bar.md +0 -110
- package/docs/overview/record-browser-interactions.md +0 -23
- package/docs/overview/running-experiments.md +0 -95
- package/docs/overview/timeline.md +0 -387
- package/docs/overview/trial.md +0 -142
- package/docs/plugins/creating-a-plugin.md +0 -79
- package/docs/plugins/jspsych-animation.md +0 -40
- package/docs/plugins/jspsych-audio-button-response.md +0 -60
- package/docs/plugins/jspsych-audio-keyboard-response.md +0 -58
- package/docs/plugins/jspsych-audio-slider-response.md +0 -53
- package/docs/plugins/jspsych-call-function.md +0 -81
- package/docs/plugins/jspsych-canvas-button-response.md +0 -66
- package/docs/plugins/jspsych-canvas-keyboard-response.md +0 -68
- package/docs/plugins/jspsych-canvas-slider-response.md +0 -89
- package/docs/plugins/jspsych-categorize-animation.md +0 -60
- package/docs/plugins/jspsych-categorize-html.md +0 -52
- package/docs/plugins/jspsych-categorize-image.md +0 -53
- package/docs/plugins/jspsych-cloze.md +0 -45
- package/docs/plugins/jspsych-external-html.md +0 -70
- package/docs/plugins/jspsych-free-sort.md +0 -55
- package/docs/plugins/jspsych-fullscreen.md +0 -57
- package/docs/plugins/jspsych-html-button-response.md +0 -42
- package/docs/plugins/jspsych-html-keyboard-response.md +0 -51
- package/docs/plugins/jspsych-html-slider-response.md +0 -45
- package/docs/plugins/jspsych-iat-html.md +0 -64
- package/docs/plugins/jspsych-iat-image.md +0 -64
- package/docs/plugins/jspsych-image-button-response.md +0 -46
- package/docs/plugins/jspsych-image-keyboard-response.md +0 -57
- package/docs/plugins/jspsych-image-slider-response.md +0 -52
- package/docs/plugins/jspsych-instructions.md +0 -58
- package/docs/plugins/jspsych-maxdiff.md +0 -42
- package/docs/plugins/jspsych-rdk.md +0 -119
- package/docs/plugins/jspsych-reconstruction.md +0 -48
- package/docs/plugins/jspsych-resize.md +0 -39
- package/docs/plugins/jspsych-same-different-html.md +0 -53
- package/docs/plugins/jspsych-same-different-image.md +0 -66
- package/docs/plugins/jspsych-serial-reaction-time-mouse.md +0 -50
- package/docs/plugins/jspsych-serial-reaction-time.md +0 -57
- package/docs/plugins/jspsych-survey-html-form.md +0 -50
- package/docs/plugins/jspsych-survey-likert.md +0 -70
- package/docs/plugins/jspsych-survey-multi-choice.md +0 -48
- package/docs/plugins/jspsych-survey-multi-select.md +0 -53
- package/docs/plugins/jspsych-survey-text.md +0 -63
- package/docs/plugins/jspsych-video-button-response.md +0 -52
- package/docs/plugins/jspsych-video-keyboard-response.md +0 -48
- package/docs/plugins/jspsych-video-slider-response.md +0 -58
- package/docs/plugins/jspsych-visual-search-circle.md +0 -52
- package/docs/plugins/jspsych-vsl-animate-occlusion.md +0 -55
- package/docs/plugins/jspsych-vsl-grid-scene.md +0 -62
- package/docs/plugins/overview.md +0 -111
- package/docs/tutorials/hello-world.md +0 -144
- package/docs/tutorials/rt-task.md +0 -1107
- package/examples/add-to-end-of-timeline.html +0 -32
- package/examples/conditional-and-loop-functions.html +0 -63
- package/examples/css/jquery-ui.css +0 -1225
- package/examples/data-add-properties.html +0 -40
- package/examples/data-as-function.html +0 -36
- package/examples/data-from-timeline.html +0 -45
- package/examples/data-from-url.html +0 -21
- package/examples/demo-flanker.html +0 -108
- package/examples/demo-simple-rt-task.html +0 -104
- package/examples/demos/demo_1.html +0 -29
- package/examples/demos/demo_2.html +0 -43
- package/examples/demos/demo_3.html +0 -58
- package/examples/display-element-to-embed-experiment.html +0 -73
- package/examples/end-active-node.html +0 -52
- package/examples/end-experiment.html +0 -43
- package/examples/exclusions.html +0 -32
- package/examples/external_html/simple_consent.html +0 -4
- package/examples/img/1.gif +0 -0
- package/examples/img/10.gif +0 -0
- package/examples/img/11.gif +0 -0
- package/examples/img/12.gif +0 -0
- package/examples/img/2.gif +0 -0
- package/examples/img/3.gif +0 -0
- package/examples/img/4.gif +0 -0
- package/examples/img/5.gif +0 -0
- package/examples/img/6.gif +0 -0
- package/examples/img/7.gif +0 -0
- package/examples/img/8.gif +0 -0
- package/examples/img/9.gif +0 -0
- package/examples/img/age/of1.jpg +0 -0
- package/examples/img/age/of2.jpg +0 -0
- package/examples/img/age/of3.jpg +0 -0
- package/examples/img/age/om1.jpg +0 -0
- package/examples/img/age/om2.jpg +0 -0
- package/examples/img/age/om3.jpg +0 -0
- package/examples/img/age/yf1.jpg +0 -0
- package/examples/img/age/yf4.jpg +0 -0
- package/examples/img/age/yf5.jpg +0 -0
- package/examples/img/age/ym2.jpg +0 -0
- package/examples/img/age/ym3.jpg +0 -0
- package/examples/img/age/ym5.jpg +0 -0
- package/examples/img/backwardN.gif +0 -0
- package/examples/img/blue.png +0 -0
- package/examples/img/con1.png +0 -0
- package/examples/img/con2.png +0 -0
- package/examples/img/fixation.gif +0 -0
- package/examples/img/happy_face_1.jpg +0 -0
- package/examples/img/happy_face_2.jpg +0 -0
- package/examples/img/happy_face_3.jpg +0 -0
- package/examples/img/happy_face_4.jpg +0 -0
- package/examples/img/inc1.png +0 -0
- package/examples/img/inc2.png +0 -0
- package/examples/img/normalN.gif +0 -0
- package/examples/img/orange.png +0 -0
- package/examples/img/redX.png +0 -0
- package/examples/img/ribbon.jpg +0 -0
- package/examples/img/sad_face_1.jpg +0 -0
- package/examples/img/sad_face_2.jpg +0 -0
- package/examples/img/sad_face_3.jpg +0 -0
- package/examples/img/sad_face_4.jpg +0 -0
- package/examples/js/snap.svg-min.js +0 -21
- package/examples/jspsych-RDK.html +0 -58
- package/examples/jspsych-animation.html +0 -33
- package/examples/jspsych-audio-button-response.html +0 -52
- package/examples/jspsych-audio-keyboard-response.html +0 -62
- package/examples/jspsych-audio-slider-response.html +0 -55
- package/examples/jspsych-call-function.html +0 -32
- package/examples/jspsych-canvas-button-response.html +0 -95
- package/examples/jspsych-canvas-keyboard-response.html +0 -78
- package/examples/jspsych-canvas-slider-response.html +0 -67
- package/examples/jspsych-categorize-animation.html +0 -46
- package/examples/jspsych-categorize-html.html +0 -38
- package/examples/jspsych-categorize-image.html +0 -38
- package/examples/jspsych-cloze.html +0 -42
- package/examples/jspsych-free-sort.html +0 -97
- package/examples/jspsych-fullscreen.html +0 -44
- package/examples/jspsych-html-button-response.html +0 -46
- package/examples/jspsych-html-keyboard-response.html +0 -42
- package/examples/jspsych-html-slider-response.html +0 -53
- package/examples/jspsych-iat.html +0 -510
- package/examples/jspsych-image-button-response.html +0 -84
- package/examples/jspsych-image-keyboard-response.html +0 -78
- package/examples/jspsych-image-slider-response.html +0 -76
- package/examples/jspsych-instructions.html +0 -37
- package/examples/jspsych-maxdiff.html +0 -33
- package/examples/jspsych-reconstruction.html +0 -43
- package/examples/jspsych-resize.html +0 -34
- package/examples/jspsych-same-different-html.html +0 -28
- package/examples/jspsych-same-different-image.html +0 -33
- package/examples/jspsych-serial-reaction-time-mouse.html +0 -98
- package/examples/jspsych-serial-reaction-time.html +0 -54
- package/examples/jspsych-survey-html-form.html +0 -33
- package/examples/jspsych-survey-likert.html +0 -42
- package/examples/jspsych-survey-multi-choice.html +0 -40
- package/examples/jspsych-survey-multi-select.html +0 -42
- package/examples/jspsych-survey-text.html +0 -34
- package/examples/jspsych-video-button-response.html +0 -57
- package/examples/jspsych-video-keyboard-response.html +0 -53
- package/examples/jspsych-video-slider-response.html +0 -55
- package/examples/jspsych-visual-search-circle.html +0 -58
- package/examples/jspsych-vsl-animate-occlusion.html +0 -29
- package/examples/jspsych-vsl-grid-scene.html +0 -41
- package/examples/lexical-decision.html +0 -132
- package/examples/manual-preloading.html +0 -53
- package/examples/pause-unpause.html +0 -33
- package/examples/progress-bar.html +0 -62
- package/examples/sound/hammer.mp3 +0 -0
- package/examples/sound/sound.mp3 +0 -0
- package/examples/sound/speech_blue.mp3 +0 -0
- package/examples/sound/speech_green.mp3 +0 -0
- package/examples/sound/speech_joke.mp3 +0 -0
- package/examples/sound/speech_red.mp3 +0 -0
- package/examples/sound/tone.mp3 +0 -0
- package/examples/timeline-variables-sampling.html +0 -50
- package/examples/timeline-variables.html +0 -55
- package/examples/video/sample_video.mp4 +0 -0
- package/jspsych.js +0 -2796
- package/license.txt +0 -21
- package/mkdocs.yml +0 -104
- package/plugins/jspsych-animation.js +0 -189
- package/plugins/jspsych-audio-button-response.js +0 -247
- package/plugins/jspsych-audio-keyboard-response.js +0 -204
- package/plugins/jspsych-audio-slider-response.js +0 -262
- package/plugins/jspsych-call-function.js +0 -58
- package/plugins/jspsych-canvas-button-response.js +0 -199
- package/plugins/jspsych-canvas-keyboard-response.js +0 -155
- package/plugins/jspsych-canvas-slider-response.js +0 -207
- package/plugins/jspsych-categorize-animation.js +0 -266
- package/plugins/jspsych-categorize-html.js +0 -220
- package/plugins/jspsych-categorize-image.js +0 -222
- package/plugins/jspsych-cloze.js +0 -112
- package/plugins/jspsych-external-html.js +0 -112
- package/plugins/jspsych-free-sort.js +0 -444
- package/plugins/jspsych-fullscreen.js +0 -104
- package/plugins/jspsych-html-button-response.js +0 -188
- package/plugins/jspsych-html-keyboard-response.js +0 -149
- package/plugins/jspsych-html-slider-response.js +0 -202
- package/plugins/jspsych-iat-html.js +0 -284
- package/plugins/jspsych-iat-image.js +0 -286
- package/plugins/jspsych-image-button-response.js +0 -311
- package/plugins/jspsych-image-keyboard-response.js +0 -247
- package/plugins/jspsych-image-slider-response.js +0 -353
- package/plugins/jspsych-instructions.js +0 -237
- package/plugins/jspsych-maxdiff.js +0 -174
- package/plugins/jspsych-rdk.js +0 -1373
- package/plugins/jspsych-reconstruction.js +0 -134
- package/plugins/jspsych-resize.js +0 -166
- package/plugins/jspsych-same-different-html.js +0 -168
- package/plugins/jspsych-same-different-image.js +0 -169
- package/plugins/jspsych-serial-reaction-time-mouse.js +0 -213
- package/plugins/jspsych-serial-reaction-time.js +0 -247
- package/plugins/jspsych-survey-html-form.js +0 -171
- package/plugins/jspsych-survey-likert.js +0 -195
- package/plugins/jspsych-survey-multi-choice.js +0 -208
- package/plugins/jspsych-survey-multi-select.js +0 -232
- package/plugins/jspsych-survey-text.js +0 -185
- package/plugins/jspsych-video-button-response.js +0 -320
- package/plugins/jspsych-video-keyboard-response.js +0 -279
- package/plugins/jspsych-video-slider-response.js +0 -351
- package/plugins/jspsych-visual-search-circle.js +0 -259
- package/plugins/jspsych-vsl-animate-occlusion.js +0 -196
- package/plugins/jspsych-vsl-grid-scene.js +0 -103
- package/plugins/template/jspsych-plugin-template.js +0 -35
- package/tests/README.md +0 -7
- package/tests/jsPsych/default-iti.test.js +0 -51
- package/tests/jsPsych/default-parameters.test.js +0 -58
- package/tests/jsPsych/endexperiment.test.js +0 -49
- package/tests/jsPsych/events.test.js +0 -369
- package/tests/jsPsych/init.test.js +0 -48
- package/tests/jsPsych/loads.test.js +0 -7
- package/tests/jsPsych/min-rt.test.js +0 -58
- package/tests/jsPsych/progressbar.test.js +0 -202
- package/tests/jsPsych/timeline-variables.test.js +0 -254
- package/tests/jsPsych/timelines.test.js +0 -498
- package/tests/jsPsych.data/datacollection.test.js +0 -116
- package/tests/jsPsych.data/datacolumn.test.js +0 -50
- package/tests/jsPsych.data/datamodule.test.js +0 -152
- package/tests/jsPsych.data/dataparameter.test.js +0 -251
- package/tests/jsPsych.data/interactions.test.js +0 -109
- package/tests/jsPsych.pluginAPI/pluginapi.test.js +0 -144
- package/tests/jsPsych.randomization/randomziation.test.js +0 -27
- package/tests/jsPsych.utils/utils.test.js +0 -58
- package/tests/media/blue.png +0 -0
- package/tests/media/orange.png +0 -0
- package/tests/media/sample_video.mp4 +0 -0
- package/tests/media/sound.mp3 +0 -0
- package/tests/plugins/plugin-animation.test.js +0 -35
- package/tests/plugins/plugin-audio-button-response.test.js +0 -15
- package/tests/plugins/plugin-audio-keyboard-response.test.js +0 -15
- package/tests/plugins/plugin-audio-slider-response.test.js +0 -15
- package/tests/plugins/plugin-call-function.test.js +0 -49
- package/tests/plugins/plugin-categorize-animation.test.js +0 -274
- package/tests/plugins/plugin-categorize-html.test.js +0 -17
- package/tests/plugins/plugin-categorize-image.test.js +0 -17
- package/tests/plugins/plugin-cloze.test.js +0 -140
- package/tests/plugins/plugin-free-sort.test.js +0 -112
- package/tests/plugins/plugin-fullscreen.test.js +0 -41
- package/tests/plugins/plugin-html-button-response.test.js +0 -161
- package/tests/plugins/plugin-html-keyboard-response.test.js +0 -139
- package/tests/plugins/plugin-html-slider-response.test.js +0 -155
- package/tests/plugins/plugin-iat-html.test.js +0 -328
- package/tests/plugins/plugin-iat-image.test.js +0 -308
- package/tests/plugins/plugin-image-button-response.test.js +0 -183
- package/tests/plugins/plugin-image-keyboard-response.test.js +0 -154
- package/tests/plugins/plugin-image-slider-response.test.js +0 -183
- package/tests/plugins/plugin-instructions.test.js +0 -66
- package/tests/plugins/plugin-maxdiff.test.js +0 -39
- package/tests/plugins/plugin-rdk.test.js +0 -17
- package/tests/plugins/plugin-reconstruction.test.js +0 -16
- package/tests/plugins/plugin-resize.test.js +0 -16
- package/tests/plugins/plugin-same-different-html.test.js +0 -17
- package/tests/plugins/plugin-same-different-image.test.js +0 -17
- package/tests/plugins/plugin-serial-reaction-time-mouse.test.js +0 -42
- package/tests/plugins/plugin-serial-reaction-time.test.js +0 -69
- package/tests/plugins/plugin-survey-html-form.test.js +0 -44
- package/tests/plugins/plugin-survey-likert.test.js +0 -48
- package/tests/plugins/plugin-survey-multi-choice.test.js +0 -48
- package/tests/plugins/plugin-survey-multi-select.test.js +0 -72
- package/tests/plugins/plugin-survey-text.test.js +0 -115
- package/tests/plugins/plugin-video-button-response.test.js +0 -35
- package/tests/plugins/plugin-video-keyboard-response.test.js +0 -35
- package/tests/plugins/plugin-video-slider-response.test.js +0 -34
- package/tests/plugins/plugin-visual-search-circle.test.js +0 -16
- package/tests/plugins/plugin-vsl-animate-occlusion.test.js +0 -16
- package/tests/plugins/plugin-vsl-grid-scene.test.js +0 -16
- package/tests/testing-utils.js +0 -13
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* jspsych-survey-text
|
|
3
|
-
* a jspsych plugin for free response survey questions
|
|
4
|
-
*
|
|
5
|
-
* Josh de Leeuw
|
|
6
|
-
*
|
|
7
|
-
* documentation: docs.jspsych.org
|
|
8
|
-
*
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
jsPsych.plugins['survey-text'] = (function() {
|
|
13
|
-
|
|
14
|
-
var plugin = {};
|
|
15
|
-
|
|
16
|
-
plugin.info = {
|
|
17
|
-
name: 'survey-text',
|
|
18
|
-
description: '',
|
|
19
|
-
parameters: {
|
|
20
|
-
questions: {
|
|
21
|
-
type: jsPsych.plugins.parameterType.COMPLEX,
|
|
22
|
-
array: true,
|
|
23
|
-
pretty_name: 'Questions',
|
|
24
|
-
default: undefined,
|
|
25
|
-
nested: {
|
|
26
|
-
prompt: {
|
|
27
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
28
|
-
pretty_name: 'Prompt',
|
|
29
|
-
default: undefined,
|
|
30
|
-
description: 'Prompt for the subject to response'
|
|
31
|
-
},
|
|
32
|
-
placeholder: {
|
|
33
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
34
|
-
pretty_name: 'Value',
|
|
35
|
-
default: "",
|
|
36
|
-
description: 'Placeholder text in the textfield.'
|
|
37
|
-
},
|
|
38
|
-
rows: {
|
|
39
|
-
type: jsPsych.plugins.parameterType.INT,
|
|
40
|
-
pretty_name: 'Rows',
|
|
41
|
-
default: 1,
|
|
42
|
-
description: 'The number of rows for the response text box.'
|
|
43
|
-
},
|
|
44
|
-
columns: {
|
|
45
|
-
type: jsPsych.plugins.parameterType.INT,
|
|
46
|
-
pretty_name: 'Columns',
|
|
47
|
-
default: 40,
|
|
48
|
-
description: 'The number of columns for the response text box.'
|
|
49
|
-
},
|
|
50
|
-
required: {
|
|
51
|
-
type: jsPsych.plugins.parameterType.BOOL,
|
|
52
|
-
pretty_name: 'Required',
|
|
53
|
-
default: false,
|
|
54
|
-
description: 'Require a response'
|
|
55
|
-
},
|
|
56
|
-
name: {
|
|
57
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
58
|
-
pretty_name: 'Question Name',
|
|
59
|
-
default: '',
|
|
60
|
-
description: 'Controls the name of data values associated with this question'
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
|
-
preamble: {
|
|
65
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
66
|
-
pretty_name: 'Preamble',
|
|
67
|
-
default: null,
|
|
68
|
-
description: 'HTML formatted string to display at the top of the page above all the questions.'
|
|
69
|
-
},
|
|
70
|
-
button_label: {
|
|
71
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
72
|
-
pretty_name: 'Button label',
|
|
73
|
-
default: 'Continue',
|
|
74
|
-
description: 'The text that appears on the button to finish the trial.'
|
|
75
|
-
},
|
|
76
|
-
autocomplete: {
|
|
77
|
-
type: jsPsych.plugins.parameterType.BOOL,
|
|
78
|
-
pretty_name: 'Allow autocomplete',
|
|
79
|
-
default: false,
|
|
80
|
-
description: "Setting this to true will enable browser auto-complete or auto-fill for the form."
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
plugin.trial = function(display_element, trial) {
|
|
86
|
-
|
|
87
|
-
for (var i = 0; i < trial.questions.length; i++) {
|
|
88
|
-
if (typeof trial.questions[i].rows == 'undefined') {
|
|
89
|
-
trial.questions[i].rows = 1;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
for (var i = 0; i < trial.questions.length; i++) {
|
|
93
|
-
if (typeof trial.questions[i].columns == 'undefined') {
|
|
94
|
-
trial.questions[i].columns = 40;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
for (var i = 0; i < trial.questions.length; i++) {
|
|
98
|
-
if (typeof trial.questions[i].value == 'undefined') {
|
|
99
|
-
trial.questions[i].value = "";
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
var html = '';
|
|
104
|
-
// show preamble text
|
|
105
|
-
if(trial.preamble !== null){
|
|
106
|
-
html += '<div id="jspsych-survey-text-preamble" class="jspsych-survey-text-preamble">'+trial.preamble+'</div>';
|
|
107
|
-
}
|
|
108
|
-
// start form
|
|
109
|
-
if (trial.autocomplete) {
|
|
110
|
-
html += '<form id="jspsych-survey-text-form">';
|
|
111
|
-
} else {
|
|
112
|
-
html += '<form id="jspsych-survey-text-form" autocomplete="off">';
|
|
113
|
-
}
|
|
114
|
-
// generate question order
|
|
115
|
-
var question_order = [];
|
|
116
|
-
for(var i=0; i<trial.questions.length; i++){
|
|
117
|
-
question_order.push(i);
|
|
118
|
-
}
|
|
119
|
-
if(trial.randomize_question_order){
|
|
120
|
-
question_order = jsPsych.randomization.shuffle(question_order);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// add questions
|
|
124
|
-
for (var i = 0; i < trial.questions.length; i++) {
|
|
125
|
-
var question = trial.questions[question_order[i]];
|
|
126
|
-
var question_index = question_order[i];
|
|
127
|
-
html += '<div id="jspsych-survey-text-'+question_index+'" class="jspsych-survey-text-question" style="margin: 2em 0em;">';
|
|
128
|
-
html += '<p class="jspsych-survey-text">' + question.prompt + '</p>';
|
|
129
|
-
var autofocus = i == 0 ? "autofocus" : "";
|
|
130
|
-
var req = question.required ? "required" : "";
|
|
131
|
-
if(question.rows == 1){
|
|
132
|
-
html += '<input type="text" id="input-'+question_index+'" name="#jspsych-survey-text-response-' + question_index + '" data-name="'+question.name+'" size="'+question.columns+'" '+autofocus+' '+req+' placeholder="'+question.placeholder+'"></input>';
|
|
133
|
-
} else {
|
|
134
|
-
html += '<textarea id="input-'+question_index+'" name="#jspsych-survey-text-response-' + question_index + '" data-name="'+question.name+'" cols="' + question.columns + '" rows="' + question.rows + '" '+autofocus+' '+req+' placeholder="'+question.placeholder+'"></textarea>';
|
|
135
|
-
}
|
|
136
|
-
html += '</div>';
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// add submit button
|
|
140
|
-
html += '<input type="submit" id="jspsych-survey-text-next" class="jspsych-btn jspsych-survey-text" value="'+trial.button_label+'"></input>';
|
|
141
|
-
|
|
142
|
-
html += '</form>'
|
|
143
|
-
display_element.innerHTML = html;
|
|
144
|
-
|
|
145
|
-
// backup in case autofocus doesn't work
|
|
146
|
-
display_element.querySelector('#input-'+question_order[0]).focus();
|
|
147
|
-
|
|
148
|
-
display_element.querySelector('#jspsych-survey-text-form').addEventListener('submit', function(e) {
|
|
149
|
-
e.preventDefault();
|
|
150
|
-
// measure response time
|
|
151
|
-
var endTime = performance.now();
|
|
152
|
-
var response_time = endTime - startTime;
|
|
153
|
-
|
|
154
|
-
// create object to hold responses
|
|
155
|
-
var question_data = {};
|
|
156
|
-
|
|
157
|
-
for(var index=0; index < trial.questions.length; index++){
|
|
158
|
-
var id = "Q" + index;
|
|
159
|
-
var q_element = document.querySelector('#jspsych-survey-text-'+index).querySelector('textarea, input');
|
|
160
|
-
var val = q_element.value;
|
|
161
|
-
var name = q_element.attributes['data-name'].value;
|
|
162
|
-
if(name == ''){
|
|
163
|
-
name = id;
|
|
164
|
-
}
|
|
165
|
-
var obje = {};
|
|
166
|
-
obje[name] = val;
|
|
167
|
-
Object.assign(question_data, obje);
|
|
168
|
-
}
|
|
169
|
-
// save data
|
|
170
|
-
var trialdata = {
|
|
171
|
-
"rt": response_time,
|
|
172
|
-
"responses": JSON.stringify(question_data)
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
display_element.innerHTML = '';
|
|
176
|
-
|
|
177
|
-
// next trial
|
|
178
|
-
jsPsych.finishTrial(trialdata);
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
var startTime = performance.now();
|
|
182
|
-
};
|
|
183
|
-
|
|
184
|
-
return plugin;
|
|
185
|
-
})();
|
|
@@ -1,320 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* jspsych-video-button-response
|
|
3
|
-
* Josh de Leeuw
|
|
4
|
-
*
|
|
5
|
-
* plugin for playing a video file and getting a button response
|
|
6
|
-
*
|
|
7
|
-
* documentation: docs.jspsych.org
|
|
8
|
-
*
|
|
9
|
-
**/
|
|
10
|
-
|
|
11
|
-
jsPsych.plugins["video-button-response"] = (function() {
|
|
12
|
-
|
|
13
|
-
var plugin = {};
|
|
14
|
-
|
|
15
|
-
jsPsych.pluginAPI.registerPreload('video-button-response', 'stimulus', 'video');
|
|
16
|
-
|
|
17
|
-
plugin.info = {
|
|
18
|
-
name: 'video-button-response',
|
|
19
|
-
description: '',
|
|
20
|
-
parameters: {
|
|
21
|
-
stimulus: {
|
|
22
|
-
type: jsPsych.plugins.parameterType.VIDEO,
|
|
23
|
-
pretty_name: 'Video',
|
|
24
|
-
default: undefined,
|
|
25
|
-
description: 'The video file to play.'
|
|
26
|
-
},
|
|
27
|
-
choices: {
|
|
28
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
29
|
-
pretty_name: 'Choices',
|
|
30
|
-
default: undefined,
|
|
31
|
-
array: true,
|
|
32
|
-
description: 'The labels for the buttons.'
|
|
33
|
-
},
|
|
34
|
-
button_html: {
|
|
35
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
36
|
-
pretty_name: 'Button HTML',
|
|
37
|
-
default: '<button class="jspsych-btn">%choice%</button>',
|
|
38
|
-
array: true,
|
|
39
|
-
description: 'The html of the button. Can create own style.'
|
|
40
|
-
},
|
|
41
|
-
prompt: {
|
|
42
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
43
|
-
pretty_name: 'Prompt',
|
|
44
|
-
default: null,
|
|
45
|
-
description: 'Any content here will be displayed below the buttons.'
|
|
46
|
-
},
|
|
47
|
-
width: {
|
|
48
|
-
type: jsPsych.plugins.parameterType.INT,
|
|
49
|
-
pretty_name: 'Width',
|
|
50
|
-
default: '',
|
|
51
|
-
description: 'The width of the video in pixels.'
|
|
52
|
-
},
|
|
53
|
-
height: {
|
|
54
|
-
type: jsPsych.plugins.parameterType.INT,
|
|
55
|
-
pretty_name: 'Height',
|
|
56
|
-
default: '',
|
|
57
|
-
description: 'The height of the video display in pixels.'
|
|
58
|
-
},
|
|
59
|
-
autoplay: {
|
|
60
|
-
type: jsPsych.plugins.parameterType.BOOL,
|
|
61
|
-
pretty_name: 'Autoplay',
|
|
62
|
-
default: true,
|
|
63
|
-
description: 'If true, the video will begin playing as soon as it has loaded.'
|
|
64
|
-
},
|
|
65
|
-
controls: {
|
|
66
|
-
type: jsPsych.plugins.parameterType.BOOL,
|
|
67
|
-
pretty_name: 'Controls',
|
|
68
|
-
default: false,
|
|
69
|
-
description: 'If true, the subject will be able to pause the video or move the playback to any point in the video.'
|
|
70
|
-
},
|
|
71
|
-
start: {
|
|
72
|
-
type: jsPsych.plugins.parameterType.FLOAT,
|
|
73
|
-
pretty_name: 'Start',
|
|
74
|
-
default: null,
|
|
75
|
-
description: 'Time to start the clip.'
|
|
76
|
-
},
|
|
77
|
-
stop: {
|
|
78
|
-
type: jsPsych.plugins.parameterType.FLOAT,
|
|
79
|
-
pretty_name: 'Stop',
|
|
80
|
-
default: null,
|
|
81
|
-
description: 'Time to stop the clip.'
|
|
82
|
-
},
|
|
83
|
-
rate: {
|
|
84
|
-
type: jsPsych.plugins.parameterType.FLOAT,
|
|
85
|
-
pretty_name: 'Rate',
|
|
86
|
-
default: 1,
|
|
87
|
-
description: 'The playback rate of the video. 1 is normal, <1 is slower, >1 is faster.'
|
|
88
|
-
},
|
|
89
|
-
trial_ends_after_video: {
|
|
90
|
-
type: jsPsych.plugins.parameterType.BOOL,
|
|
91
|
-
pretty_name: 'End trial after video finishes',
|
|
92
|
-
default: false,
|
|
93
|
-
description: 'If true, the trial will end immediately after the video finishes playing.'
|
|
94
|
-
},
|
|
95
|
-
trial_duration: {
|
|
96
|
-
type: jsPsych.plugins.parameterType.INT,
|
|
97
|
-
pretty_name: 'Trial duration',
|
|
98
|
-
default: null,
|
|
99
|
-
description: 'How long to show trial before it ends.'
|
|
100
|
-
},
|
|
101
|
-
margin_vertical: {
|
|
102
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
103
|
-
pretty_name: 'Margin vertical',
|
|
104
|
-
default: '0px',
|
|
105
|
-
description: 'The vertical margin of the button.'
|
|
106
|
-
},
|
|
107
|
-
margin_horizontal: {
|
|
108
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
109
|
-
pretty_name: 'Margin horizontal',
|
|
110
|
-
default: '8px',
|
|
111
|
-
description: 'The horizontal margin of the button.'
|
|
112
|
-
},
|
|
113
|
-
response_ends_trial: {
|
|
114
|
-
type: jsPsych.plugins.parameterType.BOOL,
|
|
115
|
-
pretty_name: 'Response ends trial',
|
|
116
|
-
default: true,
|
|
117
|
-
description: 'If true, the trial will end when subject makes a response.'
|
|
118
|
-
},
|
|
119
|
-
response_allowed_while_playing: {
|
|
120
|
-
type: jsPsych.plugins.parameterType.BOOL,
|
|
121
|
-
pretty_name: 'Response allowed while playing',
|
|
122
|
-
default: true,
|
|
123
|
-
description: 'If true, then responses are allowed while the video is playing. '+
|
|
124
|
-
'If false, then the video must finish playing before a response is accepted.'
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
plugin.trial = function(display_element, trial) {
|
|
130
|
-
|
|
131
|
-
// setup stimulus
|
|
132
|
-
var video_html = '<div>'
|
|
133
|
-
video_html += '<video id="jspsych-video-button-response-stimulus"';
|
|
134
|
-
|
|
135
|
-
if(trial.width) {
|
|
136
|
-
video_html += ' width="'+trial.width+'"';
|
|
137
|
-
}
|
|
138
|
-
if(trial.height) {
|
|
139
|
-
video_html += ' height="'+trial.height+'"';
|
|
140
|
-
}
|
|
141
|
-
if(trial.autoplay & (trial.start == null)){
|
|
142
|
-
// if autoplay is true and the start time is specified, then the video will start automatically
|
|
143
|
-
// via the play() method, rather than the autoplay attribute, to prevent showing the first frame
|
|
144
|
-
video_html += " autoplay ";
|
|
145
|
-
}
|
|
146
|
-
if(trial.controls){
|
|
147
|
-
video_html +=" controls ";
|
|
148
|
-
}
|
|
149
|
-
if (trial.start !== null) {
|
|
150
|
-
// hide video element when page loads if the start time is specified,
|
|
151
|
-
// to prevent the video element from showing the first frame
|
|
152
|
-
video_html += ' style="visibility: hidden;"';
|
|
153
|
-
}
|
|
154
|
-
video_html +=">";
|
|
155
|
-
|
|
156
|
-
var video_preload_blob = jsPsych.pluginAPI.getVideoBuffer(trial.stimulus[0]);
|
|
157
|
-
if(!video_preload_blob) {
|
|
158
|
-
for(var i=0; i<trial.stimulus.length; i++){
|
|
159
|
-
var file_name = trial.stimulus[i];
|
|
160
|
-
if(file_name.indexOf('?') > -1){
|
|
161
|
-
file_name = file_name.substring(0, file_name.indexOf('?'));
|
|
162
|
-
}
|
|
163
|
-
var type = file_name.substr(file_name.lastIndexOf('.') + 1);
|
|
164
|
-
type = type.toLowerCase();
|
|
165
|
-
if (type == "mov") {
|
|
166
|
-
console.warn('Warning: video-button-response plugin does not reliably support .mov files.')
|
|
167
|
-
}
|
|
168
|
-
video_html+='<source src="' + file_name + '" type="video/'+type+'">';
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
video_html += "</video>";
|
|
172
|
-
video_html += "</div>";
|
|
173
|
-
|
|
174
|
-
//display buttons
|
|
175
|
-
var buttons = [];
|
|
176
|
-
if (Array.isArray(trial.button_html)) {
|
|
177
|
-
if (trial.button_html.length == trial.choices.length) {
|
|
178
|
-
buttons = trial.button_html;
|
|
179
|
-
} else {
|
|
180
|
-
console.error('Error in video-button-response plugin. The length of the button_html array does not equal the length of the choices array');
|
|
181
|
-
}
|
|
182
|
-
} else {
|
|
183
|
-
for (var i = 0; i < trial.choices.length; i++) {
|
|
184
|
-
buttons.push(trial.button_html);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
video_html += '<div id="jspsych-video-button-response-btngroup">';
|
|
188
|
-
for (var i = 0; i < trial.choices.length; i++) {
|
|
189
|
-
var str = buttons[i].replace(/%choice%/g, trial.choices[i]);
|
|
190
|
-
video_html += '<div class="jspsych-video-button-response-button" style="display: inline-block; margin:'+trial.margin_vertical+' '+trial.margin_horizontal+'" id="jspsych-video-button-response-button-' + i +'" data-choice="'+i+'">'+str+'</div>';
|
|
191
|
-
}
|
|
192
|
-
video_html += '</div>';
|
|
193
|
-
|
|
194
|
-
// add prompt if there is one
|
|
195
|
-
if (trial.prompt !== null) {
|
|
196
|
-
video_html += trial.prompt;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
display_element.innerHTML = video_html;
|
|
200
|
-
|
|
201
|
-
var start_time = performance.now();
|
|
202
|
-
|
|
203
|
-
var video_element = display_element.querySelector('#jspsych-video-button-response-stimulus');
|
|
204
|
-
|
|
205
|
-
if(video_preload_blob){
|
|
206
|
-
video_element.src = video_preload_blob;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
video_element.onended = function(){
|
|
210
|
-
if(trial.trial_ends_after_video){
|
|
211
|
-
end_trial();
|
|
212
|
-
} else if (!trial.response_allowed_while_playing) {
|
|
213
|
-
// enable response buttons
|
|
214
|
-
for (var i=0; i<trial.choices.length; i++) {
|
|
215
|
-
display_element.querySelector('#jspsych-video-button-response-button-' + i).querySelector('button').disabled = false;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
video_element.playbackRate = trial.rate;
|
|
221
|
-
|
|
222
|
-
// if video start time is specified, hide the video and set the starting time
|
|
223
|
-
// before showing and playing, so that the video doesn't automatically show the first frame
|
|
224
|
-
if(trial.start !== null){
|
|
225
|
-
video_element.pause();
|
|
226
|
-
video_element.currentTime = trial.start;
|
|
227
|
-
video_element.onseeked = function() {
|
|
228
|
-
video_element.style.visibility = "visible";
|
|
229
|
-
if (trial.autoplay) {
|
|
230
|
-
video_element.play();
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
if(trial.stop !== null){
|
|
236
|
-
video_element.addEventListener('timeupdate', function(e){
|
|
237
|
-
var currenttime = video_element.currentTime;
|
|
238
|
-
if(currenttime >= trial.stop){
|
|
239
|
-
video_element.pause();
|
|
240
|
-
}
|
|
241
|
-
})
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// add event listeners to buttons
|
|
245
|
-
for (var i = 0; i < trial.choices.length; i++) {
|
|
246
|
-
display_element.querySelector('#jspsych-video-button-response-button-' + i).addEventListener('click', function(e){
|
|
247
|
-
var choice = e.currentTarget.getAttribute('data-choice'); // don't use dataset for jsdom compatibility
|
|
248
|
-
after_response(choice);
|
|
249
|
-
});
|
|
250
|
-
if (!trial.response_allowed_while_playing) {
|
|
251
|
-
display_element.querySelector('#jspsych-video-button-response-button-' + i).querySelector('button').disabled = true;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
// store response
|
|
256
|
-
var response = {
|
|
257
|
-
rt: null,
|
|
258
|
-
button: null
|
|
259
|
-
};
|
|
260
|
-
|
|
261
|
-
// function to end trial when it is time
|
|
262
|
-
function end_trial() {
|
|
263
|
-
|
|
264
|
-
// kill any remaining setTimeout handlers
|
|
265
|
-
jsPsych.pluginAPI.clearAllTimeouts();
|
|
266
|
-
|
|
267
|
-
// stop the video file if it is playing
|
|
268
|
-
// remove any remaining end event handlers
|
|
269
|
-
display_element.querySelector('#jspsych-video-button-response-stimulus').pause();
|
|
270
|
-
display_element.querySelector('#jspsych-video-button-response-stimulus').onended = function() {};
|
|
271
|
-
|
|
272
|
-
// gather the data to store for the trial
|
|
273
|
-
var trial_data = {
|
|
274
|
-
"rt": response.rt,
|
|
275
|
-
"stimulus": JSON.stringify(trial.stimulus),
|
|
276
|
-
"button_pressed": response.button
|
|
277
|
-
};
|
|
278
|
-
|
|
279
|
-
// clear the display
|
|
280
|
-
display_element.innerHTML = '';
|
|
281
|
-
|
|
282
|
-
// move on to the next trial
|
|
283
|
-
jsPsych.finishTrial(trial_data);
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// function to handle responses by the subject
|
|
287
|
-
function after_response(choice) {
|
|
288
|
-
|
|
289
|
-
// measure rt
|
|
290
|
-
var end_time = performance.now();
|
|
291
|
-
var rt = end_time - start_time;
|
|
292
|
-
response.button = parseInt(choice);
|
|
293
|
-
response.rt = rt;
|
|
294
|
-
|
|
295
|
-
// after a valid response, the stimulus will have the CSS class 'responded'
|
|
296
|
-
// which can be used to provide visual feedback that a response was recorded
|
|
297
|
-
video_element.className += ' responded';
|
|
298
|
-
|
|
299
|
-
// disable all the buttons after a response
|
|
300
|
-
var btns = document.querySelectorAll('.jspsych-video-button-response-button button');
|
|
301
|
-
for(var i=0; i<btns.length; i++){
|
|
302
|
-
//btns[i].removeEventListener('click');
|
|
303
|
-
btns[i].setAttribute('disabled', 'disabled');
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
if (trial.response_ends_trial) {
|
|
307
|
-
end_trial();
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
// end trial if time limit is set
|
|
312
|
-
if (trial.trial_duration !== null) {
|
|
313
|
-
jsPsych.pluginAPI.setTimeout(function() {
|
|
314
|
-
end_trial();
|
|
315
|
-
}, trial.trial_duration);
|
|
316
|
-
}
|
|
317
|
-
};
|
|
318
|
-
|
|
319
|
-
return plugin;
|
|
320
|
-
})();
|