Javascript в Qualtrics: ссылка на отображаемый порядок выбора

Что касается вопроса, у меня есть 4 варианта (альфа, бета, гамма, дельта), отображаемые в случайном порядке посредством рандомизации выбора. Я хочу, чтобы отображаемый порядок этих вариантов был зафиксирован во встроенных полях данных, чтобы использоваться позже в опросе (например, для изучения того, как порядок, в котором отображаются варианты, влияет на запоминание). Например, если варианты были отображены в порядке

бета гамма альфа дельта

Мне нужны встроенные поля данных pos_beta = 1, pos_gamma = 2, pos_alpha=3 и pos_delta=4.

Если бы они отображались

гамма альфа бета дельта

Я хочу встроенные поля данных pos_gamma = 1, pos_alpha = 2 и т. д.

Самый простой способ реализовать это? (Кроме того, может ли ответ быть достаточно общим, чтобы уловить, есть ли в вариантах выбора случайный текст вокруг ключевых слов — «бла-бла-гамма-бла-бла» и т. д.?)

Думаю, мне нужно перебрать каждый вариант, используя какую-то версию:

jQuery("#"+this.questionId+" [type=radio]").each(function(i) {
}

и внутри цикла последовательно проверяйте, содержится ли в тексте выбора «альфа», «бета» и т. д., а затем присваивайте i соответствующему полю встроенных данных. Правилен ли этот подход, и если да, то как проверить, содержится ли конкретная подстрока в тексте выбора?

Заранее спасибо!

Где хранятся встроенные поля данных? На опции, на селекте или на самой форме? У вас есть образец HTML-разметки?

Mr. Polywhirl 12.04.2023 19:38

@Mr.Polywhirl, я действительно не понимаю, что это значит. Я инициализировал встроенные поля в начале самого опроса (задолго до этого вопроса), поэтому я предполагаю, что они хранятся на уровне опроса? Спасибо!

user20380762 13.04.2023 00:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы хотите добавить атрибуты данных к элементам <option> на основе их исходного зелья в исходном массиве, вы можете использовать indexOf, чтобы найти исходный индекс.

const clearOptions = (selectEl) => {
  while (selectEl.options.length > 0) selectEl.remove(0);
};

const shuffleArr = (arr) => {
  const res = [], copy = [...arr];
  while (copy.length > 0) {
    const index = Math.floor(Math.random() * copy.length);
    res.push(copy[index]);
    copy.splice(index, 1);
  }
  return res;
};

const positions = ['alpha', 'beta', 'gamma', 'delta'];

const populateSelect = (selectEl, choices) => {
  clearOptions(selectEl);
  const initialOption = new Option('-- Select an answer --', '');
  initialOption.disabled = true;
  initialOption.selected = true;
  selectEl.add(initialOption);
  shuffleArr(choices).forEach((choice, index) => {
    let
      answerIndex = choices.indexOf(choice),
      option = new Option(`${String.fromCharCode(index + 65)}) ${choice}`, choice);
    option.setAttribute(`data-pos-${positions[answerIndex]}`, index + 1);
    selectEl.add(option);
  });
};

const answerSelect = document.querySelector('select[name = "answer"]');

const data = {
  choices: ['3.1415...', '2.7182...', '1.6180...', '6.2831...'],
  answer: '3.1415...'
};

const setup = () => {
  populateSelect(answerSelect, data.choices);
};

const submitAnswer = (e, form) => {
  e.preventDefault();
  const answer = form.elements.answer.value;
  console.info(answer === data.answer ? 'Correct!' : 'Incorrect');
  setup();
};

setup();
.as-console-wrapper { max-height: 3rem !important; }
<h1>Question 1</h1>
<p>What is the closest value to the constant PI?</p>
<form onsubmit = "submitAnswer(event, this)" autocomplete = "off">
  <select id = "answer" name = "answer" class = "random" required></select>
  <button type = "submit">Submit</button>
</form>

Следующий код выше создаст что-то похожее на приведенное ниже:

<form onsubmit = "submitAnswer(event, this)" autocomplete = "off">
  <select id = "answer" name = "answer" class = "random" required = "">
    <option value = "" disabled = "">-- Select an answer --</option>
    <option value = "1.6180..." data-pos-gamma = "1">A) 1.6180...</option>
    <option value = "2.7182..." data-pos-beta = "2">B) 2.7182...</option>
    <option value = "3.1415..." data-pos-alpha = "3">C) 3.1415...</option>
    <option value = "6.2831..." data-pos-delta = "4">D) 6.2831...</option>
  </select>
  <button type = "submit">Submit</button>
</form>

Мне очень жаль - вы дали удивительно подробный ответ, но это вылетело у меня из головы. Мои познания в qualtrics и js ограничены. Чтобы объяснить мой опрос, я встроил поля данных pos_alpha, pos_beta и т. д. (инициализированные 0) в начале опроса. Затем у меня есть q, в котором есть варианты альфа, бета и т. д. (Это текст, а не переменные). Порядок этих выборов был рандомизирован с помощью рандомизатора выбора в qualtrics. Поэтому я не знаю, в каком порядке они были показаны респонденту, но я хочу зафиксировать этот порядок во встроенных полях pos_alpha и т. д., .. (продолжение)

user20380762 12.04.2023 23:54

.(продолжение)..для дальнейшего использования в опросе. Если не слишком много, чтобы спросить, не могли бы вы помочь мне с тем, как реализовать это? В качестве альтернативы, я думаю, что ваш код также выполняет рандомизацию. Не могли бы вы просто дать мне несколько советов о том, что делают различные разделы вашего кода, чтобы я мог понять и попытаться изменить их в соответствии со своими требованиями? Еще раз спасибо и извините за мою некомпетентность!

user20380762 12.04.2023 23:55

Чтобы было ясно, я не хочу рандомизировать выбор в самом коде (выбор рандомизируется в отдельном вопросе с использованием рандомизатора выбора в qualtrics и переносится на этот вопрос). Я просто хочу, чтобы код подбирал порядок, в котором отображались варианты, если это возможно? Еще раз спасибо!

user20380762 13.04.2023 01:52
Ответ принят как подходящий

Вы можете сделать это:

Qualtrics.SurveyEngine.addOnload(function() {
  var qobj = this;
  jQuery(this.questionContainer).find("[choiceid]").each(function(i) {
    var cid = jQuery(this).attr("choiceid");
    Qualtrics.SurveyEngine.setEmbeddedData("pos_"+qobj.getChoiceVariableName(cid),i+1);
  });
});

Вы можете отделить имена переменных от отображаемых меток выбора, установив их с помощью «Перекодировать значения».

Другие вопросы по теме