Skip to content

Releases: jspsych/jsPsych

@jspsych/[email protected]

02 Oct 01:06
Compare
Choose a tag to compare

Major Changes

  • #2183 c8760b1 Thanks @jodeleeuw, @becky-gilbert, @bjoluc! - jsPsych is now fully modular, with individual NPM packages for the core library, plugins, and extensions.

    To support this change, we've made a number of breaking changes. We've added a guide for migrating from version 6.x to 7.x to the documentation, and updated the hello world tutorial with instructions for configuring jsPsych in three different ways. In addition to enabling package management, some of the benefits that this change provides include an improved developer experience with IntelliSense code hints, proper encapsulation of jsPsych so that multiple instances can be run on the same page, and easier integration with modern JavaScript tools like bundlers.

Patch Changes

@jspsych/[email protected]

02 Oct 01:06
Compare
Choose a tag to compare

Major Changes

  • #2183 c8760b1 Thanks @jodeleeuw, @becky-gilbert, @bjoluc! - jsPsych is now fully modular, with individual NPM packages for the core library, plugins, and extensions.

    To support this change, we've made a number of breaking changes. We've added a guide for migrating from version 6.x to 7.x to the documentation, and updated the hello world tutorial with instructions for configuring jsPsych in three different ways. In addition to enabling package management, some of the benefits that this change provides include an improved developer experience with IntelliSense code hints, proper encapsulation of jsPsych so that multiple instances can be run on the same page, and easier integration with modern JavaScript tools like bundlers.

Minor Changes

  • #2130 2802430 Thanks @jodeleeuw! - Added the option for plugins to return a Promise and delay the execution of the on_load event handler for the trial until the plugin manually invokes it. This allows for plugins that have asynchronous components to finish loading before triggering the on_load event. Added this functionality to all plugins that currently require it.

  • #2143 7fa8f26 Thanks @jodeleeuw! - When require_movement is true a 'touchstart' event or a 'mousedown' event will now enable the button. This means that this parameter will work on mobile devices, and that the button will become enabled as soon as the paricipant interacts with the slider rather than after they click and release the slider.

  • #2129 f37f64a Thanks @jodeleeuw! - All duration measurements, including response times, are now rounded to the nearest millisecond. We changed this because the precision that performance.now() generates is misleading in this context and removing the (often very long) decimal component of the measurement will save space in the data files.

Patch Changes

@jspsych/[email protected]

02 Oct 01:06
Compare
Choose a tag to compare

Major Changes

  • #2183 c8760b1 Thanks @jodeleeuw, @becky-gilbert, @bjoluc! - jsPsych is now fully modular, with individual NPM packages for the core library, plugins, and extensions.

    To support this change, we've made a number of breaking changes. We've added a guide for migrating from version 6.x to 7.x to the documentation, and updated the hello world tutorial with instructions for configuring jsPsych in three different ways. In addition to enabling package management, some of the benefits that this change provides include an improved developer experience with IntelliSense code hints, proper encapsulation of jsPsych so that multiple instances can be run on the same page, and easier integration with modern JavaScript tools like bundlers.

Minor Changes

  • #2130 2802430 Thanks @jodeleeuw! - Added the option for plugins to return a Promise and delay the execution of the on_load event handler for the trial until the plugin manually invokes it. This allows for plugins that have asynchronous components to finish loading before triggering the on_load event. Added this functionality to all plugins that currently require it.

Patch Changes

@jspsych/[email protected]

02 Oct 01:06
Compare
Choose a tag to compare

Major Changes

  • #2183 c8760b1 Thanks @jodeleeuw, @becky-gilbert, @bjoluc! - jsPsych is now fully modular, with individual NPM packages for the core library, plugins, and extensions.

    To support this change, we've made a number of breaking changes. We've added a guide for migrating from version 6.x to 7.x to the documentation, and updated the hello world tutorial with instructions for configuring jsPsych in three different ways. In addition to enabling package management, some of the benefits that this change provides include an improved developer experience with IntelliSense code hints, proper encapsulation of jsPsych so that multiple instances can be run on the same page, and easier integration with modern JavaScript tools like bundlers.

Minor Changes

  • #2130 2802430 Thanks @jodeleeuw! - Added the option for plugins to return a Promise and delay the execution of the on_load event handler for the trial until the plugin manually invokes it. This allows for plugins that have asynchronous components to finish loading before triggering the on_load event. Added this functionality to all plugins that currently require it.

  • #2129 f37f64a Thanks @jodeleeuw! - All duration measurements, including response times, are now rounded to the nearest millisecond. We changed this because the precision that performance.now() generates is misleading in this context and removing the (often very long) decimal component of the measurement will save space in the data files.

Patch Changes

@jspsych/[email protected]

02 Oct 01:06
Compare
Choose a tag to compare

Major Changes

  • #2183 c8760b1 Thanks @jodeleeuw, @becky-gilbert, @bjoluc! - jsPsych is now fully modular, with individual NPM packages for the core library, plugins, and extensions.

    To support this change, we've made a number of breaking changes. We've added a guide for migrating from version 6.x to 7.x to the documentation, and updated the hello world tutorial with instructions for configuring jsPsych in three different ways. In addition to enabling package management, some of the benefits that this change provides include an improved developer experience with IntelliSense code hints, proper encapsulation of jsPsych so that multiple instances can be run on the same page, and easier integration with modern JavaScript tools like bundlers.

Minor Changes

  • #2129 f37f64a Thanks @jodeleeuw! - All duration measurements, including response times, are now rounded to the nearest millisecond. We changed this because the precision that performance.now() generates is misleading in this context and removing the (often very long) decimal component of the measurement will save space in the data files.

Patch Changes

@jspsych/[email protected]

02 Oct 01:06
Compare
Choose a tag to compare

Major Changes

  • #2183 c8760b1 Thanks @jodeleeuw, @becky-gilbert, @bjoluc! - jsPsych is now fully modular, with individual NPM packages for the core library, plugins, and extensions.

    To support this change, we've made a number of breaking changes. We've added a guide for migrating from version 6.x to 7.x to the documentation, and updated the hello world tutorial with instructions for configuring jsPsych in three different ways. In addition to enabling package management, some of the benefits that this change provides include an improved developer experience with IntelliSense code hints, proper encapsulation of jsPsych so that multiple instances can be run on the same page, and easier integration with modern JavaScript tools like bundlers.

Patch Changes

@jspsych/[email protected]

02 Oct 01:06
Compare
Choose a tag to compare

Major Changes

v6.3.1

10 Apr 20:53
Compare
Choose a tag to compare

This minor release is focused on improvements to the eye tracking features added in version 6.3.0.

New Features

  • We have forked WebGazer to make some minor changes to improve compatibility with jsPsych. These changes allow jsPsych to sample eye movements at a faster rate without disrupting jsPsych's display timing. Thanks to @moltaire for identifying this issue (#1700).
  • WebGazer no longer initializes automatically when the page loads. Instead, the webgazer-init-camera plugin will initialize WebGazer and ask for camera access permissions. Added an auto_initialize parameter to the WebGazer extension to allow users to initialize on page load if desired.
  • The sampling interval can be set in the WebGazer extension. By default the extension aims for 30Hz. Faster intervals are probably not possible until browsers provide better interfaces to synchronize processing with video feeds.
  • Improved the timing measurements reported by WebGazer by ~30 milliseconds. Timing is now based on an estimate of when the video frame was recorded, instead of when WebGazer finished computational work on the video frame.
  • jsPsych.pluginAPI.compareKeys can now handle null values: it will return true if both key arguments are null, and return false if one key is null and the other is a key code or key character. This means that this function can be used to check for a correct non-response. (#1577)

Changes

  • Minor formatting and text updates to the webgazer-init-camera plugin to center the camera view.
  • The webgazer-validate plugin now records the coordinates of the validation points.
  • The webgazer-init-camera plugin now records the load time for WebGazer to initialize.
  • Added a point_size parameter to calibration and validation plugins, and set the default to a larger value.

Bug Fixes

  • Fixed an issue where webgazer_targets did not record the bounding box of content on the screen if the content was loaded after the trial began.
  • Fixed problem with the minimum_valid_rt parameter in jsPsych.init not working when the WebAudio clock is used to measure keyboard RTs (i.e. rt_method: 'audio' in jsPsych.pluginAPI.getKeyboardResponse). Thanks @kinleyid! (#1675)
  • Fixed various documentation errors and formatting problems. (#1642, #1641, #1594)

v6.3.0

21 Feb 23:20
Compare
Choose a tag to compare

New Features

  • Added the concept of extensions to the jsPsych architecture. Extensions are code modules that are designed to extend the functionality of any plugin. Eye tracking is an example of a feature best supported via an extension. The extension is responsible for gathering gaze data and adding the data to the trial. The advantage of using an extension is that the feature can then be added on top of any existing plugin. See the new extensions documentation for more information (#1123, #1516).
  • Eye tracking is now available via an extension that utilizes the 3rd party WebGazer library. See the new eye tracking overview in the documentation, plus example experiments in the /examples folder (#1516).
  • Three new plugins to support eye tracking. jspsych-webgazer-init-camera will initialize the camera for eye tracking, jspsych-webgazer-calibrate performs calibration, and jspsych-webgazer-validate performs validation and report data about the accuracy and sampling rate of the eye tracking (#1516).
  • Added the virtual-chinrest plugin, an implementation of the procedure described by Li, Joo, Yeatman, and Reinecke (2020) for measuring the distance between the participant and the monitor. This plugin also merges in features from the resize plugin to allow for scaling of the display to known dimensions, e.g., ensuring that 200px = 2cm. Thanks @GEJ1 and @pjkohler! (#1442)
  • New css_classes parameter available in all plugins. This allows you to add one or more custom CSS classes to the display element on that trial, which makes it easier to change style/formatting across trials. For more information, see the new Controlling Visual Appearance documentation page and the "css_classes_parameter.html" example file (#832, #1378)
  • New save_trial_parameters parameter available in all plugins. This allows you to override the plugin's default trial data, by saving additional parameter values that are not normally saved, or not saving parameter values that normally are saved. For more information, see the parameters available in all plugins page and the "save_trial_parameters.html" example file (#823, #1555)
  • jsPsych.version() returns the version of jspsych.js as a string (#1472).
  • jsPsych.allTimelineVariables() returns all the timeline variables and their values at that moment in the experiment (#1237, #1493)
  • It's now possible to use dynamic parameters (functions as parameters) in nested trial parameters. For instance, in the questions parameter in survey-* plugins, you can use a function for any of the individual parameters in each question object, like the prompt. See the updated documentation on dynamic parameters. (#988, #1497)
  • The new preload plugin now handles all media preloading. This makes preloading more customizable, and it makes it easy to preload files at any point during an experiment. This plugin contains new options for things error messanges and handling file loading success/failure. For more details, see the preload plugin documentation. Thanks @javidalpe! (#1234, #1351).
  • The freesort plugin now works on mobile devices, and includes a new column_spread_factor parameter to control the spread of image columns to the right and left sides of the sort area. Thanks @kurokida! (#1228, #1546)
  • Added and updated documentation on the jsPsych website (#1374), including new pages about:
  • on_timeline_start and on_timeline_finish callbacks allow you to run arbitrary code at the start/end of at timeline node (including timeline variables, conditional/loop nodes, etc.). See the Timeline and Event-related callback functions pages for info and examples. (#585, #1512)

Changes

  • Keys must be given as strings in trial parameters (e.g. choices: ['a']) and are saved as strings in the data (e.g. response: 'a'). Numeric keycodes are no longer accepted and numeric keycodes are no longer used in the data output. This change was made because numeric keycodes are deprecated and future browsers could drop support, so key responses are now recorded using the event's .key property. Key strings are also easier to work with and produce more readable data.
  • Because .key based responses distinguish between upper and lower case input, a new flag was added to jsPsych.init called case_sensitive_responses. This setting is false by default, but you can set this flag to true if you want case sensitivity for your key choice parameters and participants' keyboard responses. This setting does not affect responses that are typed into text boxes. For a full summary of the changes related to this shift, see #1465 and the jsPsych.init documentation. (#396, #1465).
  • We now recommend using jsPsych.pluginAPI.compareKeys to compare keys in all plugin and experiment code, rather than using something like if (response == 'j').... Using this compareKeys function will ensure that your key comparisons work appropriately based on the experiment's case_sensitive_responses setting. See the compareKeys documentation for more information.
  • Media preloading is no longer done through jsPsych.init, so the preloading-related parameters in jsPsych.init are no longer supported (show_preload_progress_bar, preload_audio, preload_images, preload_video, max_load_time, max_preload_attempts). Please use the new preload plugin instead.
  • jsPsych plugins can now store complex trial data as JavaScript objects and arrays, instead of JSON-encoded strings. This fixes problems with parsing jsPsych JSON data that were caused by nested JSON strings. This also means you no longer need to use JSON.parse during an experiment to access data that is stored in objects/arrays (e.g. responses to survey-* questions), and plugins should not use JSON.stringify when saving trial data. (#670, #1523)
  • In an effort to standardize the response variable names across plugins, many data property names have been changed to response. Examples of data properties that have changed include key_press (*-keyboard-response trials), button_pressed (*-button-response trials), and responses (survey-* trials). In some cases, the data structure has changed so that response information can be stored in a single response property (e.g. maxdiff and serial-reaction-time-mouse plugins). These changes were made in order to reduce the number of different columns and empty cells that are generated when jsPsych data is stored in tabular format, such as CSV. For more information, see the documentation for specific plugins, and this list of all data property name/structure changes across plugins. (#638, #1529)
  • You can now use the jsPsych.timelineVariable function without second the true argument. This function will determine whether or not it should return the timeline variable value immediately, based on the context in which it's called. Thanks @vijaymarupudi! (#883, #1376)
  • jsPsych.pluginAPI.getAudioBuffer() will now attempt to load audio files that haven't been preloaded. This means that preloading audio files is no longer strictly necessary, though of course it is still highly recommended. In order to make this feature possible, getAudioBuffer() now returns a Promise and plugins that use this method have been updated. (#1527, #1543)

Bug Fixes

  • Fixed problem that was causing the response_allowed_while_playing parameter not to work in the audio-button-response and video-button-response plugins when custom button_html was used. (#1380, #1384)
  • Fixed bug in image-* plugins that was causing images not to be displayed when images were not preloaded and when render_on_canvas was true (the default). (#1305, #1375)
  • Improved documentation and fixed various documentation errors. Thanks @pablobernabeu and @alexanderrobertson! (#1413, #1401, #672)
  • The fullscreen plugin now checks to see if fullscreen mode is active before trying to exit fullscreen. Thanks @klanderson! (#1354)

v6.2.0

09 Dec 00:16
Compare
Choose a tag to compare

Note from @jodeleeuw: 6.2 is our first release that is made possible by support from a grant by Mozilla Open Source Support (MOSS). This award has allowed @becky-gilbert to join the team, and she has been essential to all of the work reflected here. So: thanks Mozilla, and thanks @becky-gilbert!

New Features

  • The instructions plugin now has a page_label parameter that allows you to change the default "Page" text when showing the page number/total. This provides better support for non-English languages. Thanks @GEJ1! (#1081, #1082)
  • By default, the survey-* plugins now turn off the autocomplete/autofill feature, so that participants won't see a list of their previous responses in text entry fields. This feature can be turned back on with the new autocomplete parameter. Thanks @chrisbrickhouse! (#1064, #1073)
  • The survey-html-form plugin now includes the autofocus parameter that allows you to specify the ID of the form field that you want the page to focus on when the trial loads. Thanks @chrisbrickhouse and @grocio! (#1072, #1062, #669, #671)
  • In a survey-likert trial, you can now select a response by clicking on the label text. Thanks @kurokida! (#701)
  • You can now set a minimum valid keyboard response time in your experiment using the new minimum_valid_rt parameter in jsPsych.init. This is useful for automatically ignoring key presses that are unreasonably fast. Thanks @andytwoods! (#1139, #546, #542)
  • All audio-*/video-* plugins now include the response_allowed_while_playing parameter. If false, the participant will not be able to respond until the media has finished playing. Before then, keyboard responses will be ignored, and buttons/sliders will be visible but disabled. (#1137, #1145)
  • New canvas-* plugins allow you to use a function to draw the stimulus on a HTML canvas element, and collect a keyboard, button, or slider response. A canvas stimulus can be useful for displaying dynamic, parametrically-defined graphics, and for controlling the positioning of multiple graphical elements (shapes, text, images). Thanks @cjungerius! (#700)
  • New maxdiff plugin displays a set of options to be selected as one of two mutually-exclusive categories, typically 'most' or 'least' on some criteria, e.g. importance, preference, similarity. The same option cannot be selected for both categories simultaneously. Thanks @awhug! (#1136)
  • The free-sort plugin now has new parameters to control: sort area shape (square or circle), initial item positioning (inside or outside the sort area), border/background colors indicating when items are in/out of the area, magnification of items while dragging, and text indicating whether and how many items are left to be placed inside. Thanks @pjkohler! (#1018, #1203)
  • The image-*, animation, and categorize-animation plugins now include a render_on_canvas parameter to fix the problem with brief blank screens (white flashes) between consecutive images/trials in Firefox and Edge. Setting render_on_canvas to true fixes this problem, and setting it to false presents the image(s) in an img element, as before. (#891 #969, #1174)
  • New documentation pages in the Overview section on the jsPsych website: Browser and Device Support and Running Experiments.
  • New 'safe mode' feature automatically prevents CORS errors when running experiments offline (e.g. by double-clicking the HTML file). This can be overridden with the new override_safe_mode parameter in jsPsych.init. For more info about CORS errors and safe mode, see https://www.jspsych.org/overview/running-experiments/#offline.

Changes

  • The *-slider-response plugins now automatically save the stimulus and slider start position in the data, and they return an integer rather than string as the response. Thanks @kupiqu! (#736, #689, #1058).
  • In the *-slider-response plugins, the slider starting value parameter is now called slider_start (for consistency with video-slider-response plugin, where start refers to the video start time). The slider's starting value is now stored in the trial data, which is useful if the researcher is randomizing the slider's starting value. (#1060, #736)
  • When require_movement is true in the *-slider-response plugins, the user will be allowed to continue after clicking on the cursor (rather than having to move the cursor and release it). This makes the sliders more user-friendly, especially when using a discrete/sparse scale, and when the participant wants to respond with the slider's starting position. Thanks @kupiqu! (#696)
  • In the same-different-html and same-different-image plugins, the default values for first_stim_duration and second_stim_duration were changed from 1000 ms to null. This fixes a bug that prevented these parameters from being set to null. Thanks @dschreij! (#755)
  • In all *-button-response plugins, the "button_pressed" data is now saved as an integer rather than a string, which is now consistent with the documentation. Thanks @vijaymarupudi! (#682)
  • By default, the image-*, animation, and categorize-animation plugins now draw the images on a canvas element, to fix a problem with brief blank screens (white flashes) between consecutive images in Firefox and Edge. Setting render_on_canvas to false will present the image(s) in an img element, as in previous versions of these plugins. (#891 #969, #1174)
  • In the video-* plugins, the parameter for specifying the video file(s) is now called stimulus rather than sources, for consistency with other plugins. (#1261, #1171)

Bug Fixes

  • The rdk plugin now appropriately changes the fixation cross color based on the fixation_cross_color parameter. Thanks @cthorey and @lukasshannon! (#643 #1217)
  • Incorrect error message no longer displayed when using jsPsych.randomization.shuffleNoRepeats() (#659)
  • jsPsych.randomization.repeat() now fails gracefully when the items and repetitions parameters are ambiguous. Thanks @Hrcn ! (#667)
  • The start and slider_start parameters now work as expected in the video-slider-response plugin. Thanks @vijaymarupudi! (#713, #714)
  • The website's tutorials and the library's example HTML files no longer include the unnecessary closing link tag (</link>) after loading the default CSS file. Thanks @vijaymarupudi! (#721)
  • The labels and radio buttons/checkboxes in survey-multi-choice and survey-multi-select plugins are now properly formatted. Thanks @dillonplunkett! (#676)
  • We've fixed several documentation errors, such as out-of-date parameter names and broken links. Thanks @akochari, @CarolynBuck-Gengler, @dschreij, @alisdt, and @gorkang! (#677, #1096, #827, #755, #668, #1225)
  • The rdk plugin no longer shows scroll bars on the page. Thanks @wsr017 and @vijaymarupudi! (#881, #787)
  • jsPsych.addNodeToEndOfTimeline no longer produces an error when the optional callback function is omitted. Thanks @oliveralonzo, @bjmeagher, and @vijaymarupudi! (#688, #918, #690)
  • Data collection .first and .last functions now handle the case where the n argument is greater than the total number of trials in the collection, and they throw a descriptive error when n is zero or negative. Thanks @aridyckovsky! (#976, #751)
  • The image-button-response and image-keyboard-response plugins now produce a console warning when the trial might be deadlocked because a response does not end the trial (response_ends_trial: false) and no trial duration is set (trial_duration: null). Thanks @chrisbrickhouse and @celstark! (#1014, #1028)
  • Incorrect error message "Uncaught TypeError: Cannot read property 'style' of null at update_loading_progress_bar" no longer displayed when playing HTML5 audio. (#648, #1115)
  • Fixed out-of-date Github URLs in package.json file to improve npm install compatibility. Thanks @aridyckovsky! (#971)
  • Added a more informative error message when the timeline parameter is empty in jsPsych.init() (#853)
  • In the case of a timeline with a loop function nested inside a timeline with timeline variables, the timeline variables can now be referenced inside the loop function. (#664)
  • The serial-response-time-mouse plugin now works properly when a prompt is added to the screen. Thanks @takat0-ch (#840, #837)
  • Fixed a bug where an error was thrown if the Array.prototype had been extended and parameters with COMPLEX types were used in plugins. Thanks @egaudrain! (#989, #990)
  • jsPsych.init() will now delay execution until the document is fully loaded (#948). This fixes an issue where jsPsych would create two sets of <body> tags on the document if none existed in the markup (#316). Thanks @bjoluc!
  • Fixed bug on touchscreen-only devices (phones/tablets) that caused the last button that was touched to remain highlighted on successive *-button-response trials. (#977)
  • The preloading progress bar correctly centers when the experiment_width property is set in jsPsych.init(). (#1160)
  • For all video-* plugins in Firefox, if a non-zero video start time is specified, then the first frame of the video is no longer briefly visible when the trial first loads. (#712, #1162)
  • Fixed alignment problems between slider positions and labels in all *-slider-response plugins. (#1193, #695)
  • In the image-* plugins, the maintain_aspect_ratio parameter now works as intended: when only one image dimension is specified and maintain_aspect_ratio is false, the unspecified dimension will be the image's original dimension, and the image will stretch or compress accordingly. (#1174, #1172)
  • Fixed a bug in video-* plugins that was preventing videos from automatically preloading. Thanks @mgorenstein! (#1171)
  • Fixed a bug in audio-button-response that was producing an "undefined startTime" error. Thanks @esolitos! (#1194)
  • The audio-button-response...
Read more