Что касается вопроса, у меня есть 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 соответствующему полю встроенных данных. Правилен ли этот подход, и если да, то как проверить, содержится ли конкретная подстрока в тексте выбора?
Заранее спасибо!
@Mr.Polywhirl, я действительно не понимаю, что это значит. Я инициализировал встроенные поля в начале самого опроса (задолго до этого вопроса), поэтому я предполагаю, что они хранятся на уровне опроса? Спасибо!
Если вы хотите добавить атрибуты данных к элементам <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 и т. д., .. (продолжение)
.(продолжение)..для дальнейшего использования в опросе. Если не слишком много, чтобы спросить, не могли бы вы помочь мне с тем, как реализовать это? В качестве альтернативы, я думаю, что ваш код также выполняет рандомизацию. Не могли бы вы просто дать мне несколько советов о том, что делают различные разделы вашего кода, чтобы я мог понять и попытаться изменить их в соответствии со своими требованиями? Еще раз спасибо и извините за мою некомпетентность!
Чтобы было ясно, я не хочу рандомизировать выбор в самом коде (выбор рандомизируется в отдельном вопросе с использованием рандомизатора выбора в qualtrics и переносится на этот вопрос). Я просто хочу, чтобы код подбирал порядок, в котором отображались варианты, если это возможно? Еще раз спасибо!
Вы можете сделать это:
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);
});
});
Вы можете отделить имена переменных от отображаемых меток выбора, установив их с помощью «Перекодировать значения».
Где хранятся встроенные поля данных? На опции, на селекте или на самой форме? У вас есть образец HTML-разметки?