jspsych 6.3.1 → 7.1.2
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 +36 -37
- 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 +3171 -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 +3165 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +3159 -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 +136 -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 +165 -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 -719
- package/docs/core_library/jspsych-data.md +0 -587
- package/docs/core_library/jspsych-pluginAPI.md +0 -624
- package/docs/core_library/jspsych-randomization.md +0 -389
- package/docs/core_library/jspsych-turk.md +0 -98
- package/docs/extensions/extensions.md +0 -83
- package/docs/extensions/jspsych-ext-webgazer.md +0 -137
- package/docs/img/blue.png +0 -0
- package/docs/img/devtools-change-css.png +0 -0
- package/docs/img/devtools-css-errors.png +0 -0
- package/docs/img/devtools-inspect-element.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/prolific-study-completion.png +0 -0
- package/docs/img/prolific-study-link.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 -180
- package/docs/overview/data.md +0 -281
- package/docs/overview/dynamic-parameters.md +0 -147
- package/docs/overview/exclude-browser.md +0 -32
- package/docs/overview/experiment-options.md +0 -149
- package/docs/overview/eye-tracking.md +0 -271
- package/docs/overview/fullscreen.md +0 -36
- package/docs/overview/media-preloading.md +0 -369
- package/docs/overview/mturk.md +0 -77
- package/docs/overview/plugins.md +0 -320
- package/docs/overview/progress-bar.md +0 -110
- package/docs/overview/prolific.md +0 -78
- package/docs/overview/record-browser-interactions.md +0 -23
- package/docs/overview/running-experiments.md +0 -95
- package/docs/overview/style.md +0 -293
- package/docs/overview/timeline.md +0 -457
- 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 -53
- 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 -56
- 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 -48
- package/docs/plugins/jspsych-image-keyboard-response.md +0 -58
- package/docs/plugins/jspsych-image-slider-response.md +0 -54
- package/docs/plugins/jspsych-instructions.md +0 -58
- package/docs/plugins/jspsych-maxdiff.md +0 -41
- package/docs/plugins/jspsych-preload.md +0 -128
- 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 -52
- 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 -54
- package/docs/plugins/jspsych-video-keyboard-response.md +0 -50
- package/docs/plugins/jspsych-video-slider-response.md +0 -60
- package/docs/plugins/jspsych-virtual-chinrest.md +0 -105
- 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/jspsych-webgazer-calibrate.md +0 -61
- package/docs/plugins/jspsych-webgazer-init-camera.md +0 -30
- package/docs/plugins/jspsych-webgazer-validate.md +0 -44
- package/docs/plugins/list-of-plugins.md +0 -54
- package/docs/tutorials/hello-world.md +0 -162
- package/docs/tutorials/rt-task.md +0 -1334
- package/docs/tutorials/video-tutorials.md +0 -11
- package/examples/add-to-end-of-timeline.html +0 -38
- package/examples/case-sensitive-responses.html +0 -45
- package/examples/conditional-and-loop-functions.html +0 -64
- package/examples/css/jquery-ui.css +0 -1225
- package/examples/css-classes-parameter.html +0 -145
- package/examples/data-add-properties.html +0 -44
- package/examples/data-as-function.html +0 -39
- package/examples/data-from-timeline.html +0 -52
- package/examples/data-from-url.html +0 -21
- package/examples/demo-flanker.html +0 -117
- package/examples/demo-simple-rt-task.html +0 -120
- package/examples/demos/demo_1.html +0 -35
- package/examples/demos/demo_2.html +0 -50
- package/examples/demos/demo_3.html +0 -63
- package/examples/display-element-to-embed-experiment.html +0 -79
- package/examples/end-active-node.html +0 -52
- package/examples/end-experiment.html +0 -45
- 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/card.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/js/webgazer/ridgeWorker.mjs +0 -135
- package/examples/js/webgazer/webgazer.js +0 -88909
- package/examples/js/webgazer/worker_scripts/mat.js +0 -306
- package/examples/js/webgazer/worker_scripts/util.js +0 -398
- package/examples/jspsych-RDK.html +0 -58
- package/examples/jspsych-animation.html +0 -39
- package/examples/jspsych-audio-button-response.html +0 -58
- package/examples/jspsych-audio-keyboard-response.html +0 -68
- package/examples/jspsych-audio-slider-response.html +0 -61
- 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 -49
- package/examples/jspsych-categorize-html.html +0 -33
- package/examples/jspsych-categorize-image.html +0 -44
- package/examples/jspsych-cloze.html +0 -37
- package/examples/jspsych-free-sort.html +0 -109
- package/examples/jspsych-fullscreen.html +0 -45
- package/examples/jspsych-html-button-response.html +0 -43
- package/examples/jspsych-html-keyboard-response.html +0 -42
- package/examples/jspsych-html-slider-response.html +0 -53
- package/examples/jspsych-iat.html +0 -520
- package/examples/jspsych-image-button-response.html +0 -91
- package/examples/jspsych-image-keyboard-response.html +0 -85
- package/examples/jspsych-image-slider-response.html +0 -85
- package/examples/jspsych-instructions.html +0 -37
- package/examples/jspsych-maxdiff.html +0 -33
- package/examples/jspsych-preload.html +0 -140
- 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 -39
- 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 -65
- package/examples/jspsych-video-keyboard-response.html +0 -61
- package/examples/jspsych-video-slider-response.html +0 -63
- package/examples/jspsych-virtual-chinrest.html +0 -69
- package/examples/jspsych-visual-search-circle.html +0 -64
- package/examples/jspsych-vsl-animate-occlusion.html +0 -35
- package/examples/jspsych-vsl-grid-scene.html +0 -47
- package/examples/lexical-decision.html +0 -134
- package/examples/manual-preloading.html +0 -59
- package/examples/pause-unpause.html +0 -33
- package/examples/progress-bar.html +0 -68
- package/examples/save-trial-parameters.html +0 -98
- 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 -64
- package/examples/video/sample_video.mp4 +0 -0
- package/examples/webgazer.html +0 -174
- package/examples/webgazer_audio.html +0 -90
- package/examples/webgazer_image.html +0 -60
- package/extensions/jspsych-ext-webgazer.js +0 -265
- package/jspsych.js +0 -3023
- package/license.txt +0 -21
- package/mkdocs.yml +0 -118
- package/plugins/jspsych-animation.js +0 -189
- package/plugins/jspsych-audio-button-response.js +0 -269
- package/plugins/jspsych-audio-keyboard-response.js +0 -209
- package/plugins/jspsych-audio-slider-response.js +0 -278
- 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 -478
- package/plugins/jspsych-fullscreen.js +0 -106
- 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 -327
- package/plugins/jspsych-image-keyboard-response.js +0 -263
- package/plugins/jspsych-image-slider-response.js +0 -369
- package/plugins/jspsych-instructions.js +0 -237
- package/plugins/jspsych-maxdiff.js +0 -173
- package/plugins/jspsych-preload.js +0 -345
- 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 -212
- 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 -335
- package/plugins/jspsych-video-keyboard-response.js +0 -279
- package/plugins/jspsych-video-slider-response.js +0 -351
- package/plugins/jspsych-virtual-chinrest.js +0 -471
- 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/jspsych-webgazer-calibrate.js +0 -161
- package/plugins/jspsych-webgazer-init-camera.js +0 -139
- package/plugins/jspsych-webgazer-validate.js +0 -314
- package/plugins/template/jspsych-plugin-template.js +0 -35
- package/tests/README.md +0 -7
- package/tests/jsPsych/case-sensitive-responses.test.js +0 -53
- package/tests/jsPsych/css-classes-parameter.test.js +0 -107
- 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 -606
- package/tests/jsPsych/functions-as-parameters.test.js +0 -210
- 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 -531
- package/tests/jsPsych/timelines.test.js +0 -569
- package/tests/jsPsych.data/data-csv-conversion.test.js +0 -85
- package/tests/jsPsych.data/data-json-conversion.test.js +0 -120
- package/tests/jsPsych.data/datacollection.test.js +0 -117
- 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.data/trialparameters.test.js +0 -175
- package/tests/jsPsych.extensions/extensions.test.js +0 -207
- package/tests/jsPsych.extensions/test-extension.js +0 -42
- package/tests/jsPsych.pluginAPI/pluginapi.test.js +0 -365
- package/tests/jsPsych.pluginAPI/preloads.test.js +0 -43
- package/tests/jsPsych.randomization/randomziation.test.js +0 -27
- package/tests/jsPsych.utils/utils.test.js +0 -58
- package/tests/plugins/plugin-animation.test.js +0 -34
- 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 -263
- 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 -157
- package/tests/plugins/plugin-free-sort.test.js +0 -106
- 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 -299
- package/tests/plugins/plugin-iat-image.test.js +0 -298
- package/tests/plugins/plugin-image-button-response.test.js +0 -174
- package/tests/plugins/plugin-image-keyboard-response.test.js +0 -147
- package/tests/plugins/plugin-image-slider-response.test.js +0 -174
- package/tests/plugins/plugin-instructions.test.js +0 -85
- package/tests/plugins/plugin-maxdiff.test.js +0 -39
- package/tests/plugins/plugin-preload.test.js +0 -916
- package/tests/plugins/plugin-rdk.test.js +0 -61
- 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 -109
- 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 -47
- package/tests/plugins/plugin-survey-multi-select.test.js +0 -71
- package/tests/plugins/plugin-survey-text.test.js +0 -115
- package/tests/plugins/plugin-video-button-response.test.js +0 -32
- package/tests/plugins/plugin-video-keyboard-response.test.js +0 -32
- package/tests/plugins/plugin-video-slider-response.test.js +0 -31
- 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
package/plugins/jspsych-cloze.js
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* jspsych-cloze
|
|
3
|
-
* Philipp Sprengholz
|
|
4
|
-
*
|
|
5
|
-
* Plugin for displaying a cloze test and checking participants answers against a correct solution.
|
|
6
|
-
*
|
|
7
|
-
* documentation: docs.jspsych.org
|
|
8
|
-
**/
|
|
9
|
-
|
|
10
|
-
jsPsych.plugins['cloze'] = (function () {
|
|
11
|
-
|
|
12
|
-
var plugin = {};
|
|
13
|
-
|
|
14
|
-
plugin.info = {
|
|
15
|
-
name: 'cloze',
|
|
16
|
-
description: '',
|
|
17
|
-
parameters: {
|
|
18
|
-
text: {
|
|
19
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
20
|
-
pretty_name: 'Cloze text',
|
|
21
|
-
default: undefined,
|
|
22
|
-
description: 'The cloze text to be displayed. Blanks are indicated by %% signs and automatically replaced by input fields. If there is a correct answer you want the system to check against, it must be typed between the two percentage signs (i.e. %solution%).'
|
|
23
|
-
},
|
|
24
|
-
button_text: {
|
|
25
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
26
|
-
pretty_name: 'Button text',
|
|
27
|
-
default: 'OK',
|
|
28
|
-
description: 'Text of the button participants have to press for finishing the cloze test.'
|
|
29
|
-
},
|
|
30
|
-
check_answers: {
|
|
31
|
-
type: jsPsych.plugins.parameterType.BOOL,
|
|
32
|
-
pretty_name: 'Check answers',
|
|
33
|
-
default: false,
|
|
34
|
-
description: 'Boolean value indicating if the answers given by participants should be compared against a correct solution given in the text (between % signs) after the button was clicked.'
|
|
35
|
-
},
|
|
36
|
-
mistake_fn: {
|
|
37
|
-
type: jsPsych.plugins.parameterType.FUNCTION,
|
|
38
|
-
pretty_name: 'Mistake function',
|
|
39
|
-
default: function () {},
|
|
40
|
-
description: 'Function called if check_answers is set to TRUE and there is a difference between the participants answers and the correct solution provided in the text.'
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
plugin.trial = function (display_element, trial) {
|
|
46
|
-
|
|
47
|
-
var html = '<div class="cloze">';
|
|
48
|
-
var elements = trial.text.split('%');
|
|
49
|
-
var solutions = [];
|
|
50
|
-
|
|
51
|
-
for (var i=0; i<elements.length; i++)
|
|
52
|
-
{
|
|
53
|
-
if (i%2 === 0)
|
|
54
|
-
{
|
|
55
|
-
html += elements[i];
|
|
56
|
-
}
|
|
57
|
-
else
|
|
58
|
-
{
|
|
59
|
-
solutions.push(elements[i].trim());
|
|
60
|
-
html += '<input type="text" id="input'+(solutions.length-1)+'" value="">';
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
html += '</div>';
|
|
64
|
-
|
|
65
|
-
display_element.innerHTML = html;
|
|
66
|
-
|
|
67
|
-
var check = function() {
|
|
68
|
-
|
|
69
|
-
var answers = [];
|
|
70
|
-
var answers_correct = true;
|
|
71
|
-
|
|
72
|
-
for (var i=0; i<solutions.length; i++)
|
|
73
|
-
{
|
|
74
|
-
var field = document.getElementById('input'+i);
|
|
75
|
-
answers.push(field.value.trim());
|
|
76
|
-
|
|
77
|
-
if (trial.check_answers)
|
|
78
|
-
{
|
|
79
|
-
if (answers[i] !== solutions[i])
|
|
80
|
-
{
|
|
81
|
-
field.style.color = 'red';
|
|
82
|
-
answers_correct = false;
|
|
83
|
-
}
|
|
84
|
-
else
|
|
85
|
-
{
|
|
86
|
-
field.style.color = 'black';
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if (!trial.check_answers || (trial.check_answers && answers_correct))
|
|
92
|
-
{
|
|
93
|
-
var trial_data = {
|
|
94
|
-
response: answers
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
display_element.innerHTML = '';
|
|
98
|
-
jsPsych.finishTrial(trial_data);
|
|
99
|
-
}
|
|
100
|
-
else
|
|
101
|
-
{
|
|
102
|
-
trial.mistake_fn();
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
display_element.innerHTML += '<br><button class="jspsych-html-button-response-button" type="button" id="finish_cloze_button">'+trial.button_text+'</button>';
|
|
108
|
-
display_element.querySelector('#finish_cloze_button').addEventListener('click', check);
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
return plugin;
|
|
112
|
-
})();
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
/** (July 2012, Erik Weitnauer)
|
|
2
|
-
The html-plugin will load and display an external html pages. To proceed to the next, the
|
|
3
|
-
user might either press a button on the page or a specific key. Afterwards, the page get hidden and
|
|
4
|
-
the plugin will wait of a specified time before it proceeds.
|
|
5
|
-
|
|
6
|
-
documentation: docs.jspsych.org
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
jsPsych.plugins['external-html'] = (function() {
|
|
10
|
-
|
|
11
|
-
var plugin = {};
|
|
12
|
-
|
|
13
|
-
plugin.info = {
|
|
14
|
-
name: 'external-html',
|
|
15
|
-
description: '',
|
|
16
|
-
parameters: {
|
|
17
|
-
url: {
|
|
18
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
19
|
-
pretty_name: 'URL',
|
|
20
|
-
default: undefined,
|
|
21
|
-
description: 'The url of the external html page'
|
|
22
|
-
},
|
|
23
|
-
cont_key: {
|
|
24
|
-
type: jsPsych.plugins.parameterType.KEY,
|
|
25
|
-
pretty_name: 'Continue key',
|
|
26
|
-
default: null,
|
|
27
|
-
description: 'The key to continue to the next page.'
|
|
28
|
-
},
|
|
29
|
-
cont_btn: {
|
|
30
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
31
|
-
pretty_name: 'Continue button',
|
|
32
|
-
default: null,
|
|
33
|
-
description: 'The button to continue to the next page.'
|
|
34
|
-
},
|
|
35
|
-
check_fn: {
|
|
36
|
-
type: jsPsych.plugins.parameterType.FUNCTION,
|
|
37
|
-
pretty_name: 'Check function',
|
|
38
|
-
default: function() { return true; },
|
|
39
|
-
description: ''
|
|
40
|
-
},
|
|
41
|
-
force_refresh: {
|
|
42
|
-
type: jsPsych.plugins.parameterType.BOOL,
|
|
43
|
-
pretty_name: 'Force refresh',
|
|
44
|
-
default: false,
|
|
45
|
-
description: 'Refresh page.'
|
|
46
|
-
},
|
|
47
|
-
// if execute_Script == true, then all javascript code on the external page
|
|
48
|
-
// will be executed in the plugin site within your jsPsych test
|
|
49
|
-
execute_script: {
|
|
50
|
-
type: jsPsych.plugins.parameterType.BOOL,
|
|
51
|
-
pretty_name: 'Execute scripts',
|
|
52
|
-
default: false,
|
|
53
|
-
description: 'If true, JS scripts on the external html file will be executed.'
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
plugin.trial = function(display_element, trial) {
|
|
59
|
-
|
|
60
|
-
var url = trial.url;
|
|
61
|
-
if (trial.force_refresh) {
|
|
62
|
-
url = trial.url + "?t=" + performance.now();
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
load(display_element, url, function() {
|
|
66
|
-
var t0 = performance.now();
|
|
67
|
-
var finish = function() {
|
|
68
|
-
if (trial.check_fn && !trial.check_fn(display_element)) { return };
|
|
69
|
-
if (trial.cont_key) { display_element.removeEventListener('keydown', key_listener); }
|
|
70
|
-
var trial_data = {
|
|
71
|
-
rt: performance.now() - t0,
|
|
72
|
-
url: trial.url
|
|
73
|
-
};
|
|
74
|
-
display_element.innerHTML = '';
|
|
75
|
-
jsPsych.finishTrial(trial_data);
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
// by default, scripts on the external page are not executed with XMLHttpRequest().
|
|
79
|
-
// To activate their content through DOM manipulation, we need to relocate all script tags
|
|
80
|
-
if (trial.execute_script) {
|
|
81
|
-
for (const scriptElement of display_element.getElementsByTagName("script")) {
|
|
82
|
-
const relocatedScript = document.createElement("script");
|
|
83
|
-
relocatedScript.text = scriptElement.text;
|
|
84
|
-
scriptElement.parentNode.replaceChild(relocatedScript, scriptElement);
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (trial.cont_btn) { display_element.querySelector('#'+trial.cont_btn).addEventListener('click', finish); }
|
|
89
|
-
if (trial.cont_key) {
|
|
90
|
-
var key_listener = function(e) {
|
|
91
|
-
if (jsPsych.pluginAPI.compareKeys(e.key,trial.cont_key)) finish();
|
|
92
|
-
};
|
|
93
|
-
display_element.addEventListener('keydown', key_listener);
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
// helper to load via XMLHttpRequest
|
|
99
|
-
function load(element, file, callback){
|
|
100
|
-
var xmlhttp = new XMLHttpRequest();
|
|
101
|
-
xmlhttp.open("GET", file, true);
|
|
102
|
-
xmlhttp.onload = function(){
|
|
103
|
-
if(xmlhttp.status == 200 || xmlhttp.status == 0){ //Check if loaded
|
|
104
|
-
element.innerHTML = xmlhttp.responseText;
|
|
105
|
-
callback();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
xmlhttp.send();
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
return plugin;
|
|
112
|
-
})();
|
|
@@ -1,478 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* jspsych-free-sort
|
|
3
|
-
* plugin for drag-and-drop sorting of a collection of images
|
|
4
|
-
* Josh de Leeuw
|
|
5
|
-
*
|
|
6
|
-
* documentation: docs.jspsych.org
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
jsPsych.plugins['free-sort'] = (function() {
|
|
11
|
-
|
|
12
|
-
var plugin = {};
|
|
13
|
-
|
|
14
|
-
jsPsych.pluginAPI.registerPreload('free-sort', 'stimuli', 'image');
|
|
15
|
-
|
|
16
|
-
plugin.info = {
|
|
17
|
-
name: 'free-sort',
|
|
18
|
-
description: '',
|
|
19
|
-
parameters: {
|
|
20
|
-
stimuli: {
|
|
21
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
22
|
-
pretty_name: 'Stimuli',
|
|
23
|
-
default: undefined,
|
|
24
|
-
array: true,
|
|
25
|
-
description: 'items to be displayed.'
|
|
26
|
-
},
|
|
27
|
-
stim_height: {
|
|
28
|
-
type: jsPsych.plugins.parameterType.INT,
|
|
29
|
-
pretty_name: 'Stimulus height',
|
|
30
|
-
default: 100,
|
|
31
|
-
description: 'Height of items in pixels.'
|
|
32
|
-
},
|
|
33
|
-
stim_width: {
|
|
34
|
-
type: jsPsych.plugins.parameterType.INT,
|
|
35
|
-
pretty_name: 'Stimulus width',
|
|
36
|
-
default: 100,
|
|
37
|
-
description: 'Width of items in pixels'
|
|
38
|
-
},
|
|
39
|
-
scale_factor: {
|
|
40
|
-
type: jsPsych.plugins.parameterType.FLOAT,
|
|
41
|
-
pretty_name: 'Stimulus scaling factor',
|
|
42
|
-
default: 1.5,
|
|
43
|
-
description: 'How much larger to make the stimulus while moving (1 = no scaling)'
|
|
44
|
-
},
|
|
45
|
-
sort_area_height: {
|
|
46
|
-
type: jsPsych.plugins.parameterType.INT,
|
|
47
|
-
pretty_name: 'Sort area height',
|
|
48
|
-
default: 700,
|
|
49
|
-
description: 'The height in pixels of the container that subjects can move the stimuli in.'
|
|
50
|
-
},
|
|
51
|
-
sort_area_width: {
|
|
52
|
-
type: jsPsych.plugins.parameterType.INT,
|
|
53
|
-
pretty_name: 'Sort area width',
|
|
54
|
-
default: 700,
|
|
55
|
-
description: 'The width in pixels of the container that subjects can move the stimuli in.'
|
|
56
|
-
},
|
|
57
|
-
sort_area_shape: {
|
|
58
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
59
|
-
pretty_name: 'Sort area shape',
|
|
60
|
-
options: ['square','ellipse'],
|
|
61
|
-
default: 'ellipse',
|
|
62
|
-
description: 'The shape of the sorting area'
|
|
63
|
-
},
|
|
64
|
-
prompt: {
|
|
65
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
66
|
-
pretty_name: 'Prompt',
|
|
67
|
-
default: '',
|
|
68
|
-
description: 'It can be used to provide a reminder about the action the subject is supposed to take.'
|
|
69
|
-
},
|
|
70
|
-
prompt_location: {
|
|
71
|
-
type: jsPsych.plugins.parameterType.SELECT,
|
|
72
|
-
pretty_name: 'Prompt location',
|
|
73
|
-
options: ['above','below'],
|
|
74
|
-
default: 'above',
|
|
75
|
-
description: 'Indicates whether to show prompt "above" or "below" the sorting area.'
|
|
76
|
-
},
|
|
77
|
-
button_label: {
|
|
78
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
79
|
-
pretty_name: 'Button label',
|
|
80
|
-
default: 'Continue',
|
|
81
|
-
description: 'The text that appears on the button to continue to the next trial.'
|
|
82
|
-
},
|
|
83
|
-
change_border_background_color: {
|
|
84
|
-
type: jsPsych.plugins.parameterType.BOOL,
|
|
85
|
-
pretty_name: 'Change border background color',
|
|
86
|
-
default: true,
|
|
87
|
-
description: 'If true, the sort area border color will change while items are being moved in and out of '+
|
|
88
|
-
'the sort area, and the background color will change once all items have been moved into the '+
|
|
89
|
-
'sort area. If false, the border will remain black and the background will remain white throughout the trial.'
|
|
90
|
-
},
|
|
91
|
-
border_color_in: {
|
|
92
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
93
|
-
pretty_name: 'Border color - in',
|
|
94
|
-
default: '#a1d99b',
|
|
95
|
-
description: 'If change_border_background_color is true, the sort area border will change to this color '+
|
|
96
|
-
'when an item is being moved into the sort area, and the background will change to this color '+
|
|
97
|
-
'when all of the items have been moved into the sort area.'
|
|
98
|
-
},
|
|
99
|
-
border_color_out: {
|
|
100
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
101
|
-
pretty_name: 'Border color - out',
|
|
102
|
-
default: '#fc9272',
|
|
103
|
-
description: 'If change_border_background_color is true, this will be the color of the sort area border '+
|
|
104
|
-
'when there are one or more items that still need to be moved into the sort area.'
|
|
105
|
-
},
|
|
106
|
-
border_width: {
|
|
107
|
-
type: jsPsych.plugins.parameterType.INT,
|
|
108
|
-
pretty_name: 'Border width',
|
|
109
|
-
default: null,
|
|
110
|
-
description: 'The width in pixels of the border around the sort area. If null, the border width '+
|
|
111
|
-
'defaults to 3% of the sort area height.'
|
|
112
|
-
},
|
|
113
|
-
counter_text_unfinished: {
|
|
114
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
115
|
-
pretty_name: 'Counter text unfinished',
|
|
116
|
-
default: 'You still need to place %n% item%s% inside the sort area.',
|
|
117
|
-
description: 'Text to display when there are one or more items that still need to be placed in the sort area. '+
|
|
118
|
-
'If "%n%" is included in the string, it will be replaced with the number of items that still need to be moved inside. '+
|
|
119
|
-
'If "%s%" is included in the string, a "s" will be included when the number of items remaining is greater than one.'
|
|
120
|
-
},
|
|
121
|
-
counter_text_finished: {
|
|
122
|
-
type: jsPsych.plugins.parameterType.STRING,
|
|
123
|
-
pretty_name: 'Counter text finished',
|
|
124
|
-
default: 'All items placed. Feel free to reposition items if necessary.',
|
|
125
|
-
description: 'Text that will take the place of the counter_text_unfinished text when all items have been moved inside the sort area.'
|
|
126
|
-
},
|
|
127
|
-
stim_starts_inside: {
|
|
128
|
-
type: jsPsych.plugins.parameterType.BOOL,
|
|
129
|
-
pretty_name: 'Stim starts inside',
|
|
130
|
-
default: false,
|
|
131
|
-
description: 'If false, the images will be positioned to the left and right of the sort area when the trial loads. '+
|
|
132
|
-
'If true, the images will be positioned at random locations inside the sort area when the trial loads.'
|
|
133
|
-
},
|
|
134
|
-
column_spread_factor: {
|
|
135
|
-
type: jsPsych.plugins.parameterType.FLOAT,
|
|
136
|
-
pretty_name: 'column spread factor',
|
|
137
|
-
default: 1,
|
|
138
|
-
description: 'When the images appear outside the sort area, this determines the x-axis spread of the image columns. '+
|
|
139
|
-
'Default value is 1. Values less than 1 will compress the image columns along the x-axis, and values greater than 1 will spread them farther apart.'
|
|
140
|
-
},
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
plugin.trial = function(display_element, trial) {
|
|
145
|
-
|
|
146
|
-
var start_time = performance.now();
|
|
147
|
-
|
|
148
|
-
if (trial.change_border_background_color == false) {
|
|
149
|
-
trial.border_color_out = "#000000";
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
if (trial.border_width == null) {
|
|
153
|
-
trial.border_width = trial.sort_area_height*.03;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
let html =
|
|
157
|
-
'<div '+
|
|
158
|
-
'id="jspsych-free-sort-arena" '+
|
|
159
|
-
'class="jspsych-free-sort-arena" '+
|
|
160
|
-
'style="position: relative; width:'+trial.sort_area_width+'px; height:'+trial.sort_area_height+'px; margin: auto;"</div>';
|
|
161
|
-
|
|
162
|
-
// another div for border
|
|
163
|
-
html += '<div '+
|
|
164
|
-
'id="jspsych-free-sort-border" '+
|
|
165
|
-
'class="jspsych-free-sort-border" '+
|
|
166
|
-
'style="position: relative; width:'+trial.sort_area_width*.94+'px; height:'+trial.sort_area_height*.94+'px; '+
|
|
167
|
-
'border:'+trial.border_width+'px solid '+trial.border_color_out+'; margin: auto; line-height: 0em; ';
|
|
168
|
-
|
|
169
|
-
if ( trial.sort_area_shape == "ellipse") {
|
|
170
|
-
html += 'webkit-border-radius: 50%; moz-border-radius: 50%; border-radius: 50%"></div>'
|
|
171
|
-
} else {
|
|
172
|
-
html += 'webkit-border-radius: 0%; moz-border-radius: 0%; border-radius: 0%"></div>'
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// variable that has the prompt text and counter
|
|
176
|
-
const html_text = '<div style="line-height: 1.0em;">' + trial.prompt +
|
|
177
|
-
'<p id="jspsych-free-sort-counter" style="display: inline-block;">'+get_counter_text(trial.stimuli.length)+'</p></div>';
|
|
178
|
-
|
|
179
|
-
// position prompt above or below
|
|
180
|
-
if (trial.prompt_location == "below") {
|
|
181
|
-
html += html_text
|
|
182
|
-
} else {
|
|
183
|
-
html = html_text + html
|
|
184
|
-
}
|
|
185
|
-
// add button
|
|
186
|
-
html += '<div><button id="jspsych-free-sort-done-btn" class="jspsych-btn" '+
|
|
187
|
-
'style="margin-top: 5px; margin-bottom: 15px; visibility: hidden;">' +
|
|
188
|
-
trial.button_label+'</button></div>';
|
|
189
|
-
|
|
190
|
-
display_element.innerHTML = html;
|
|
191
|
-
|
|
192
|
-
// store initial location data
|
|
193
|
-
let init_locations = [];
|
|
194
|
-
|
|
195
|
-
if (!trial.stim_starts_inside) {
|
|
196
|
-
// determine number of rows and colums, must be a even number
|
|
197
|
-
let num_rows = Math.ceil(Math.sqrt(trial.stimuli.length))
|
|
198
|
-
if ( num_rows % 2 != 0) {
|
|
199
|
-
num_rows = num_rows + 1
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// compute coords for left and right side of arena
|
|
203
|
-
var r_coords = [];
|
|
204
|
-
var l_coords = [];
|
|
205
|
-
for (const x of make_arr(0, trial.sort_area_width - trial.stim_width, num_rows) ) {
|
|
206
|
-
for (const y of make_arr(0, trial.sort_area_height - trial.stim_height, num_rows) ) {
|
|
207
|
-
if ( x > ( (trial.sort_area_width - trial.stim_width) * .5 ) ) {
|
|
208
|
-
//r_coords.push({ x:x, y:y } )
|
|
209
|
-
r_coords.push({ x:x + (trial.sort_area_width) * (.5*trial.column_spread_factor) , y:y });
|
|
210
|
-
} else {
|
|
211
|
-
l_coords.push({ x:x - (trial.sort_area_width) * (.5*trial.column_spread_factor) , y:y });
|
|
212
|
-
//l_coords.push({ x:x, y:y } )
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// repeat coordinates until you have enough coords (may be obsolete)
|
|
218
|
-
while ( ( r_coords.length + l_coords.length ) < trial.stimuli.length ) {
|
|
219
|
-
r_coords = r_coords.concat(r_coords)
|
|
220
|
-
l_coords = l_coords.concat(l_coords)
|
|
221
|
-
}
|
|
222
|
-
// reverse left coords, so that coords closest to arena is used first
|
|
223
|
-
l_coords = l_coords.reverse()
|
|
224
|
-
|
|
225
|
-
// shuffle stimuli, so that starting positions are random
|
|
226
|
-
trial.stimuli = shuffle(trial.stimuli);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
let inside = []
|
|
230
|
-
for (let i = 0; i < trial.stimuli.length; i++) {
|
|
231
|
-
var coords;
|
|
232
|
-
if (trial.stim_starts_inside) {
|
|
233
|
-
coords = random_coordinate(trial.sort_area_width - trial.stim_width, trial.sort_area_height - trial.stim_height);
|
|
234
|
-
} else {
|
|
235
|
-
if ( (i % 2) == 0 ) {
|
|
236
|
-
coords = r_coords[Math.floor(i * .5)];
|
|
237
|
-
} else {
|
|
238
|
-
coords = l_coords[Math.floor(i * .5)];
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
display_element.querySelector("#jspsych-free-sort-arena").innerHTML += '<img '+
|
|
243
|
-
'src="'+trial.stimuli[i]+'" '+
|
|
244
|
-
'data-src="'+trial.stimuli[i]+'" '+
|
|
245
|
-
'class="jspsych-free-sort-draggable" '+
|
|
246
|
-
'draggable="false" '+
|
|
247
|
-
'id="jspsych-free-sort-draggable-'+i+'" '+
|
|
248
|
-
'style="position: absolute; cursor: move; width:'+trial.stim_width+'px; height:'+trial.stim_height+'px; top:'+coords.y+'px; left:'+coords.x+'px;">'+
|
|
249
|
-
'</img>';
|
|
250
|
-
|
|
251
|
-
init_locations.push({
|
|
252
|
-
src: trial.stimuli[i],
|
|
253
|
-
x: coords.x,
|
|
254
|
-
y: coords.y
|
|
255
|
-
});
|
|
256
|
-
if (trial.stim_starts_inside) {
|
|
257
|
-
inside.push(true);
|
|
258
|
-
} else {
|
|
259
|
-
inside.push(false);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// moves within a trial
|
|
264
|
-
let moves = [];
|
|
265
|
-
|
|
266
|
-
// are objects currently inside
|
|
267
|
-
let cur_in = false
|
|
268
|
-
|
|
269
|
-
// draggable items
|
|
270
|
-
const draggables = display_element.querySelectorAll('.jspsych-free-sort-draggable');
|
|
271
|
-
|
|
272
|
-
// button (will show when all items are inside) and border (will change color)
|
|
273
|
-
const border = display_element.querySelector("#jspsych-free-sort-border")
|
|
274
|
-
const button = display_element.querySelector('#jspsych-free-sort-done-btn')
|
|
275
|
-
|
|
276
|
-
// when trial starts, modify text and border/background if all items are inside (stim_starts_inside: true)
|
|
277
|
-
if (inside.some(Boolean) && trial.change_border_background_color) {
|
|
278
|
-
border.style.borderColor = trial.border_color_in;
|
|
279
|
-
}
|
|
280
|
-
if (inside.every(Boolean)) {
|
|
281
|
-
if (trial.change_border_background_color) {
|
|
282
|
-
border.style.background = trial.border_color_in;
|
|
283
|
-
}
|
|
284
|
-
button.style.visibility = "visible";
|
|
285
|
-
display_element.querySelector("#jspsych-free-sort-counter").innerHTML = trial.counter_text_finished;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
let start_event_name = 'mousedown';
|
|
289
|
-
let move_event_name = 'mousemove';
|
|
290
|
-
let end_event_name = 'mouseup';
|
|
291
|
-
if (typeof document.ontouchend !== 'undefined'){ // for touch devices
|
|
292
|
-
start_event_name = 'touchstart'
|
|
293
|
-
move_event_name = 'touchmove'
|
|
294
|
-
end_event_name = 'touchend'
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
for(let i=0; i<draggables.length; i++){
|
|
298
|
-
draggables[i].addEventListener(start_event_name, function(event){
|
|
299
|
-
let pageX = event.pageX;
|
|
300
|
-
let pageY = event.pageY;
|
|
301
|
-
if (typeof document.ontouchend !== 'undefined'){ // for touch devices
|
|
302
|
-
event.preventDefault();
|
|
303
|
-
const touchObject = event.changedTouches[0]
|
|
304
|
-
pageX = touchObject.pageX
|
|
305
|
-
pageY = touchObject.pageY
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
let x = pageX - event.currentTarget.offsetLeft;
|
|
309
|
-
let y = pageY - event.currentTarget.offsetTop - window.scrollY;
|
|
310
|
-
let elem = event.currentTarget;
|
|
311
|
-
elem.style.transform = "scale(" + trial.scale_factor + "," + trial.scale_factor + ")";
|
|
312
|
-
|
|
313
|
-
let move_event = function(e){
|
|
314
|
-
let clientX = e.clientX;
|
|
315
|
-
let clientY = e.clientY;
|
|
316
|
-
if (typeof document.ontouchend !== 'undefined'){ // for touch devices
|
|
317
|
-
const touchObject = e.changedTouches[0]
|
|
318
|
-
clientX = touchObject.clientX
|
|
319
|
-
clientY = touchObject.clientY
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
cur_in = inside_ellipse(clientX - x, clientY - y,
|
|
323
|
-
trial.sort_area_width*.5 - trial.stim_width*.5, trial.sort_area_height*.5 - trial.stim_height*.5,
|
|
324
|
-
trial.sort_area_width*.5, trial.sort_area_height*.5,
|
|
325
|
-
trial.sort_area_shape == "square");
|
|
326
|
-
elem.style.top = Math.min(trial.sort_area_height - trial.stim_height*.5, Math.max(- trial.stim_height*.5, (clientY - y))) + 'px';
|
|
327
|
-
elem.style.left = Math.min(trial.sort_area_width*1.5 - trial.stim_width, Math.max(-trial.sort_area_width*.5, (clientX - x)))+ 'px';
|
|
328
|
-
|
|
329
|
-
// modify border while items is being moved
|
|
330
|
-
if (trial.change_border_background_color) {
|
|
331
|
-
if (cur_in) {
|
|
332
|
-
border.style.borderColor = trial.border_color_in;
|
|
333
|
-
border.style.background = "None";
|
|
334
|
-
} else {
|
|
335
|
-
border.style.borderColor = trial.border_color_out;
|
|
336
|
-
border.style.background = "None";
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
// replace in overall array, grab index from item id
|
|
341
|
-
var elem_number = elem.id.split("jspsych-free-sort-draggable-")[1];
|
|
342
|
-
inside.splice(elem_number, true, cur_in)
|
|
343
|
-
|
|
344
|
-
// modify text and background if all items are inside
|
|
345
|
-
if (inside.every(Boolean)) {
|
|
346
|
-
if (trial.change_border_background_color) {
|
|
347
|
-
border.style.background = trial.border_color_in;
|
|
348
|
-
}
|
|
349
|
-
button.style.visibility = "visible";
|
|
350
|
-
display_element.querySelector("#jspsych-free-sort-counter").innerHTML = trial.counter_text_finished;
|
|
351
|
-
} else {
|
|
352
|
-
border.style.background = "none";
|
|
353
|
-
button.style.visibility = "hidden";
|
|
354
|
-
display_element.querySelector("#jspsych-free-sort-counter").innerHTML = get_counter_text(inside.length - inside.filter(Boolean).length);
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
document.addEventListener(move_event_name, move_event);
|
|
358
|
-
|
|
359
|
-
var end_event = function(e){
|
|
360
|
-
document.removeEventListener(move_event_name, move_event);
|
|
361
|
-
elem.style.transform = "scale(1, 1)";
|
|
362
|
-
if (trial.change_border_background_color) {
|
|
363
|
-
if (inside.every(Boolean)) {
|
|
364
|
-
border.style.background = trial.border_color_in;
|
|
365
|
-
border.style.borderColor = trial.border_color_in;
|
|
366
|
-
} else {
|
|
367
|
-
border.style.background = "none";
|
|
368
|
-
border.style.borderColor = trial.border_color_out;
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
moves.push({
|
|
372
|
-
src: elem.dataset.src,
|
|
373
|
-
x: elem.offsetLeft,
|
|
374
|
-
y: elem.offsetTop
|
|
375
|
-
});
|
|
376
|
-
document.removeEventListener(end_event_name, end_event);
|
|
377
|
-
}
|
|
378
|
-
document.addEventListener(end_event_name, end_event);
|
|
379
|
-
});
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
display_element.querySelector('#jspsych-free-sort-done-btn').addEventListener('click', function(){
|
|
383
|
-
if (inside.every(Boolean)) {
|
|
384
|
-
const end_time = performance.now();
|
|
385
|
-
const rt = end_time - start_time;
|
|
386
|
-
// gather data
|
|
387
|
-
const items = display_element.querySelectorAll('.jspsych-free-sort-draggable');
|
|
388
|
-
// get final position of all items
|
|
389
|
-
let final_locations = [];
|
|
390
|
-
for(let i=0; i<items.length; i++){
|
|
391
|
-
final_locations.push({
|
|
392
|
-
src: items[i].dataset.src,
|
|
393
|
-
x: parseInt(items[i].style.left),
|
|
394
|
-
y: parseInt(items[i].style.top)
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
const trial_data = {
|
|
399
|
-
init_locations: init_locations,
|
|
400
|
-
moves: moves,
|
|
401
|
-
final_locations: final_locations,
|
|
402
|
-
rt: rt
|
|
403
|
-
};
|
|
404
|
-
|
|
405
|
-
// advance to next part
|
|
406
|
-
display_element.innerHTML = '';
|
|
407
|
-
jsPsych.finishTrial(trial_data);
|
|
408
|
-
}
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
function get_counter_text(n) {
|
|
412
|
-
var text_out = '';
|
|
413
|
-
var text_bits = trial.counter_text_unfinished.split("%");
|
|
414
|
-
for (var i=0; i<text_bits.length; i++) {
|
|
415
|
-
if (i%2 === 0) {
|
|
416
|
-
text_out += text_bits[i];
|
|
417
|
-
} else {
|
|
418
|
-
if (text_bits[i] == "n") {
|
|
419
|
-
text_out += n.toString();
|
|
420
|
-
} else if (text_bits[i] == "s" && n > 1) {
|
|
421
|
-
text_out += "s";
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
return text_out;
|
|
426
|
-
}
|
|
427
|
-
};
|
|
428
|
-
|
|
429
|
-
// helper functions
|
|
430
|
-
|
|
431
|
-
function shuffle(array) {
|
|
432
|
-
// define three variables
|
|
433
|
-
let cur_idx = array.length, tmp_val, rand_idx;
|
|
434
|
-
|
|
435
|
-
// While there remain elements to shuffle...
|
|
436
|
-
while (0 !== cur_idx) {
|
|
437
|
-
// Pick a remaining element...
|
|
438
|
-
rand_idx = Math.floor(Math.random() * cur_idx);
|
|
439
|
-
cur_idx -= 1;
|
|
440
|
-
|
|
441
|
-
// And swap it with the current element.
|
|
442
|
-
tmp_val = array[cur_idx];
|
|
443
|
-
array[cur_idx] = array[rand_idx];
|
|
444
|
-
array[rand_idx] = tmp_val;
|
|
445
|
-
}
|
|
446
|
-
return array;
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
function make_arr(startValue, stopValue, cardinality) {
|
|
450
|
-
const step = (stopValue - startValue) / (cardinality - 1);
|
|
451
|
-
let arr = [];
|
|
452
|
-
for (let i = 0; i < cardinality; i++) {
|
|
453
|
-
arr.push(startValue + (step * i));
|
|
454
|
-
}
|
|
455
|
-
return arr;
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
function inside_ellipse(x, y, x0, y0, rx, ry, square=false) {
|
|
459
|
-
const results = [];
|
|
460
|
-
if (square) {
|
|
461
|
-
result = ( Math.abs(x - x0) <= rx ) && ( Math.abs(y - y0) <= ry )
|
|
462
|
-
} else {
|
|
463
|
-
result = (( x - x0 ) * ( x - x0 )) * (ry * ry) + ((y - y0) * ( y - y0 )) * ( rx * rx ) <= ( (rx * rx) * (ry * ry) )
|
|
464
|
-
}
|
|
465
|
-
return result
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
function random_coordinate(max_width, max_height) {
|
|
469
|
-
const rnd_x = Math.floor(Math.random() * (max_width - 1));
|
|
470
|
-
const rnd_y = Math.floor(Math.random() * (max_height - 1));
|
|
471
|
-
return {
|
|
472
|
-
x: rnd_x,
|
|
473
|
-
y: rnd_y
|
|
474
|
-
};
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
return plugin;
|
|
478
|
-
})();
|