Qualtrics 显示逻辑干扰 javascript .hide()
Qualtrics display logic interferes with javascript .hide()
我在 Qualtrics 中有一个 30 行的并排问题。前 20 行中的每一行都有显示逻辑,只有在前面的问题的文本框中输入内容时它们才会出现。最后 10 行中的每一行都有显示逻辑,使得整个问题中至少显示 10 行,即第 21 行仅在显示前 20 行中的 none 时显示,如果仅显示其中之一,则显示第 22 行显示前 20 行...如果显示第一行中的 9 行,则显示第 30 行,如果显示第一行中的至少 10 行,则显示其中的 none。
问题的第一列是一个复选框,我使用以下 Javascript 隐藏最后 10 行的复选框:
Qualtrics.SurveyEngine.addOnload(function()
{
var qid = this.questionId;
var p = $(qid);
p.down('label[for="QR~'+qid+'#1~21~1"]').hide();
p.down('label[for="QR~'+qid+'#1~22~1"]').hide();
p.down('label[for="QR~'+qid+'#1~23~1"]').hide();
p.down('label[for="QR~'+qid+'#1~24~1"]').hide();
p.down('label[for="QR~'+qid+'#1~25~1"]').hide();
p.down('label[for="QR~'+qid+'#1~26~1"]').hide();
p.down('label[for="QR~'+qid+'#1~27~1"]').hide();
p.down('label[for="QR~'+qid+'#1~28~1"]').hide();
p.down('label[for="QR~'+qid+'#1~29~1"]').hide();
p.down('label[for="QR~'+qid+'#1~30~1"]').hide();
});
如果显示前面的 none 行,则工作正常:
但是即使显示了前一行中的一行也会爆炸:
我在预览中查看了 Inspect Element
以查看标签是否以某种方式更改,但就更改 ID 而言没有发现任何意外。选中第 23 行复选框的元素时,前 20 行的 none 出现时:
<input id="QR~QID4#1~23~1" name="QR~QID4#1~23~1" value="Selected"
data-runtime-checked="runtime.Children.1.Choices.23.Answers.1.Selected"
aria-labelledby="question1QID4 question1QID4-answer1QID4 choice23QID4"
class="QWatchTimer" type="checkbox">
<label for="QR~QID4#1~23~1" class="q-checkbox" data-runtime-class
-q-checked="runtime.Children.1.Choices.23.Answers.1.Selected"
style="display: none;"></label>
不出所料,标签代码变灰了。当出现前20行中的一行时,大同小异,但最后没有出现style="display: none;"
:
<input id="QR~QID4#1~23~1" name="QR~QID4#1~23~1" value="Selected"
data-runtime-checked="runtime.Children.1.Choices.23.Answers.1.Selected"
aria-labelledby="question1QID4 question1QID4-answer1QID4 choice23QID4"
class="QWatchTimer" type="checkbox">
<label for="QR~QID4#1~23~1" class="q-checkbox" data-runtime-class
-q-checked="runtime.Children.1.Choices.23.Answers.1.Selected"></label>
我不知道激活显示逻辑会如何干扰 Javascript。
经过几个小时的渗透,我记得如果显示逻辑隐藏带有 Javascript 的项目,则该脚本不会 运行。我没有意识到它不仅仅是基于 line-by 行 - 看起来如果由一行代码控制的一个元素被隐藏,整个代码块就会失效。
我能够通过一个只动态考虑将要显示的行的循环来解决它:
Qualtrics.SurveyEngine.addOnload(function()
{
//Remove checkboxes for last ten options
var qid = this.questionId;
var p = $(qid);
var count = Qualtrics.SurveyEngine.getEmbeddedData('count');
var min = 21+count;
for (var i = min; i < 31; i++) {
p.down('label[for="QR~'+qid+'#1~'+i+'~1"]').hide();
}
});
至少在我的例子中,count
变量用于确定显示最后 10 行中的多少行。一旦我将它构建到循环的参数中,显示逻辑就不会使任何内容无效。 (如果有兴趣,请查看 了解相关流程。)
经验教训:一开始我应该使用循环 - 之后修改参数是一个简单的步骤。
我在 Qualtrics 中有一个 30 行的并排问题。前 20 行中的每一行都有显示逻辑,只有在前面的问题的文本框中输入内容时它们才会出现。最后 10 行中的每一行都有显示逻辑,使得整个问题中至少显示 10 行,即第 21 行仅在显示前 20 行中的 none 时显示,如果仅显示其中之一,则显示第 22 行显示前 20 行...如果显示第一行中的 9 行,则显示第 30 行,如果显示第一行中的至少 10 行,则显示其中的 none。
问题的第一列是一个复选框,我使用以下 Javascript 隐藏最后 10 行的复选框:
Qualtrics.SurveyEngine.addOnload(function()
{
var qid = this.questionId;
var p = $(qid);
p.down('label[for="QR~'+qid+'#1~21~1"]').hide();
p.down('label[for="QR~'+qid+'#1~22~1"]').hide();
p.down('label[for="QR~'+qid+'#1~23~1"]').hide();
p.down('label[for="QR~'+qid+'#1~24~1"]').hide();
p.down('label[for="QR~'+qid+'#1~25~1"]').hide();
p.down('label[for="QR~'+qid+'#1~26~1"]').hide();
p.down('label[for="QR~'+qid+'#1~27~1"]').hide();
p.down('label[for="QR~'+qid+'#1~28~1"]').hide();
p.down('label[for="QR~'+qid+'#1~29~1"]').hide();
p.down('label[for="QR~'+qid+'#1~30~1"]').hide();
});
如果显示前面的 none 行,则工作正常:
但是即使显示了前一行中的一行也会爆炸:
我在预览中查看了 Inspect Element
以查看标签是否以某种方式更改,但就更改 ID 而言没有发现任何意外。选中第 23 行复选框的元素时,前 20 行的 none 出现时:
<input id="QR~QID4#1~23~1" name="QR~QID4#1~23~1" value="Selected"
data-runtime-checked="runtime.Children.1.Choices.23.Answers.1.Selected"
aria-labelledby="question1QID4 question1QID4-answer1QID4 choice23QID4"
class="QWatchTimer" type="checkbox">
<label for="QR~QID4#1~23~1" class="q-checkbox" data-runtime-class
-q-checked="runtime.Children.1.Choices.23.Answers.1.Selected"
style="display: none;"></label>
不出所料,标签代码变灰了。当出现前20行中的一行时,大同小异,但最后没有出现style="display: none;"
:
<input id="QR~QID4#1~23~1" name="QR~QID4#1~23~1" value="Selected"
data-runtime-checked="runtime.Children.1.Choices.23.Answers.1.Selected"
aria-labelledby="question1QID4 question1QID4-answer1QID4 choice23QID4"
class="QWatchTimer" type="checkbox">
<label for="QR~QID4#1~23~1" class="q-checkbox" data-runtime-class
-q-checked="runtime.Children.1.Choices.23.Answers.1.Selected"></label>
我不知道激活显示逻辑会如何干扰 Javascript。
经过几个小时的渗透,我记得如果显示逻辑隐藏带有 Javascript 的项目,则该脚本不会 运行。我没有意识到它不仅仅是基于 line-by 行 - 看起来如果由一行代码控制的一个元素被隐藏,整个代码块就会失效。
我能够通过一个只动态考虑将要显示的行的循环来解决它:
Qualtrics.SurveyEngine.addOnload(function()
{
//Remove checkboxes for last ten options
var qid = this.questionId;
var p = $(qid);
var count = Qualtrics.SurveyEngine.getEmbeddedData('count');
var min = 21+count;
for (var i = min; i < 31; i++) {
p.down('label[for="QR~'+qid+'#1~'+i+'~1"]').hide();
}
});
至少在我的例子中,count
变量用于确定显示最后 10 行中的多少行。一旦我将它构建到循环的参数中,显示逻辑就不会使任何内容无效。 (如果有兴趣,请查看
经验教训:一开始我应该使用循环 - 之后修改参数是一个简单的步骤。