var jsPsychSurveyHtmlForm = (function (jspsych) { 'use strict'; const info = { name: "survey-html-form", parameters: { /** HTML formatted string containing all the input elements to display. Every element has to have its own distinctive name attribute. The
tag must not be included and is generated by the plugin. */ html: { type: jspsych.ParameterType.HTML_STRING, pretty_name: "HTML", default: null, }, /** HTML formatted string to display at the top of the page above all the questions. */ preamble: { type: jspsych.ParameterType.HTML_STRING, pretty_name: "Preamble", default: null, }, /** The text that appears on the button to finish the trial. */ button_label: { type: jspsych.ParameterType.STRING, pretty_name: "Button label", default: "Continue", }, /** The HTML element ID of a form field to autofocus on. */ autofocus: { type: jspsych.ParameterType.STRING, pretty_name: "Element ID to focus", default: "", }, /** Retrieve the data as an array e.g. [{name: "INPUT_NAME", value: "INPUT_VALUE"}, ...] instead of an object e.g. {INPUT_NAME: INPUT_VALUE, ...}. */ dataAsArray: { type: jspsych.ParameterType.BOOL, pretty_name: "Data As Array", default: false, }, /** Setting this to true will enable browser auto-complete or auto-fill for the form. */ autocomplete: { type: jspsych.ParameterType.BOOL, pretty_name: "Allow autocomplete", default: false, }, }, }; /** * **survey-html-form** * * jsPsych plugin for displaying free HTML forms and collecting responses from all input elements * * @author Jan Simson * @see {@link https://www.jspsych.org/plugins/jspsych-survey-html-form/ survey-html-form plugin documentation on jspsych.org} */ class SurveyHtmlFormPlugin { constructor(jsPsych) { this.jsPsych = jsPsych; } trial(display_element, trial) { var html = ""; // show preamble text if (trial.preamble !== null) { html += '
' + trial.preamble + "
"; } // start form if (trial.autocomplete) { html += ''; } else { html += ''; } // add form HTML / input elements html += trial.html; // add submit button html += ''; html += "
"; display_element.innerHTML = html; if (trial.autofocus !== "") { var focus_elements = display_element.querySelectorAll("#" + trial.autofocus); if (focus_elements.length === 0) { console.warn("No element found with id: " + trial.autofocus); } else if (focus_elements.length > 1) { console.warn('The id "' + trial.autofocus + '" is not unique so autofocus will not work.'); } else { focus_elements[0].focus(); } } display_element .querySelector("#jspsych-survey-html-form") .addEventListener("submit", (event) => { // don't submit form event.preventDefault(); // measure response time var endTime = performance.now(); var response_time = Math.round(endTime - startTime); var this_form = display_element.querySelector("#jspsych-survey-html-form"); var question_data = serializeArray(this_form); if (!trial.dataAsArray) { question_data = objectifyForm(question_data); } // save data var trialdata = { rt: response_time, response: question_data, }; display_element.innerHTML = ""; // next trial this.jsPsych.finishTrial(trialdata); }); var startTime = performance.now(); /** * Serialize all form data into an array * @copyright (c) 2018 Chris Ferdinandi, MIT License, https://gomakethings.com * @param {Node} form The form to serialize * @return {String} The serialized form data */ function serializeArray(form) { // Setup our serialized data var serialized = []; // Loop through each field in the form for (var i = 0; i < form.elements.length; i++) { var field = form.elements[i]; // Don't serialize fields without a name, submits, buttons, file and reset inputs, and disabled fields if (!field.name || field.disabled || field.type === "file" || field.type === "reset" || field.type === "submit" || field.type === "button") continue; // If a multi-select, get all selections if (field.type === "select-multiple") { for (var n = 0; n < field.options.length; n++) { if (!field.options[n].selected) continue; serialized.push({ name: field.name, value: field.options[n].value, }); } } // Convert field data to a query string else if ((field.type !== "checkbox" && field.type !== "radio") || field.checked) { serialized.push({ name: field.name, value: field.value, }); } } return serialized; } // from https://stackoverflow.com/questions/1184624/convert-form-data-to-javascript-object-with-jquery function objectifyForm(formArray) { //serialize data function var returnArray = {}; for (var i = 0; i < formArray.length; i++) { returnArray[formArray[i]["name"]] = formArray[i]["value"]; } return returnArray; } } } SurveyHtmlFormPlugin.info = info; return SurveyHtmlFormPlugin; })(jsPsychModule);