在页面中随机排序列表项时缺少元素
Missing elements when randomizing order of list items in page
我正在尝试为一个教育网站开发一个小测试,我想随机化问题和练习的顺序,然后在每个问题下用一组单选按钮排列答案的顺序。我已经在两个独立的问题(即这个和这个)上尝试了我找到的代码,尽管这两个答案实际上是相同的。我使用的代码在某种程度上是我想要的,但是我的测试有时会丢失部分内容(大多数时候我得到5个问题和2-3个练习,而不是6和4)。我该如何纠正这一点?这个JSFiddle中的完整代码示例(一些与后端无关的东西在那里,忽略它们-内容是占位符,以便更容易调试),以及javascript/jQuery自己的代码如下:
$(document).ready(function () {
var questions = $('.question');
for (var i = 0; i < questions.length; i++) {
var target = Math.floor(Math.random() * questions.length - 1) + 1;
var target2 = Math.floor(Math.random() * questions.length - 1) + 1;
questions.eq(target).before(questions.eq(target2));
}
var exercises = $(".exercise");
for (var j = 0; j < exercises.length; j++) {
var target = Math.floor(Math.random() * exercises.length - 1) + 1;
var target2 = Math.floor(Math.random() * exercises.length - 1) + 1;
exercises.eq(target).before(exercises.eq(target2));
}
});
注:#1:网站的后端是用Asp构建的。. Net和c#,如果这与问题有关的话。
注:#2:把小提琴放四到五次,数一数问题和练习的数量来重现问题。
我改变了你的代码,使target
将不相同的target2
:
var questions = $('.question');
for (var i = 0; i < questions.length; i++) {
var target = Math.floor(Math.random() * questions.length - 1) + 1;
var target2 = target;
while(target2 === target) {
target2 = Math.floor(Math.random() * questions.length - 1) + 1;
}
questions.eq(target).before(questions.eq(target2));
}
var exercises = $(".exercise");
for (var j = 0; j < exercises.length; j++) {
var target = Math.floor(Math.random() * exercises.length - 1) + 1;
var target2 = target;
while(target2 === target) {
target2 = Math.floor(Math.random() * exercises.length - 1) + 1;
}
exercises.eq(target).before(exercises.eq(target2));
}
小提琴
我假设所有的.question
/.exercise
元素都在同一个父元素中。
我的做法是:
-
将问题/练习作为一个数组并将它们分离
-
随机化数组,在这个问题的答案中以几种方式解决
添加
function randomize(selector) {
// Get the elements and their parent
var elements = $(selector);
var parent = elements.eq(1).parent();
// Detach, get array
elements = elements.detach().get();
// Shuffle it
shuffle(elements);
// Attach
parent.append(elements);
}
// From https://stackoverflow.com/a/2450976/157247
function shuffle(array) {
var currentIndex = array.length, temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
randomize(".question");
randomize(".exercise");
<ul>
<li class="question">Question 1</li>
<li class="question">Question 2</li>
<li class="question">Question 3</li>
<li class="question">Question 4</li>
<li class="question">Question 5</li>
</ul>
Exercises:
<ul>
<li class="exercise">Exercise 1</li>
<li class="exercise">Exercise 2</li>
<li class="exercise">Exercise 3</li>
<li class="exercise">Exercise 4</li>
<li class="exercise">Exercise 5</li>
<li class="exercise">Exercise 6</li>
</ul>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
相关文章:
- 如何附加<ul><李>元素位于某个特定条件的父元素列表之间
- 在元素列表中搜索给定字符串
- 生成ACF标记位置的数组(元素列表后缺少])
- 如何删除元素列表中的类并添加到另一个元素 Jquery.
- 什么'这是ES6中制作重复元素列表的等效方法
- jQuery单击并显示元素列表
- 如何在元素列表上使用jquery选择器
- 如何使用 Cycle.js 创建动态、重复的元素列表
- dc.js:如何在对象元素列表上减少计数
- 语法错误:使用 setInterval 时元素列表后缺少 ]
- 错误:火狐在元素列表后给我“缺少]”
- 使用字符串元素列表作为 Select2 组件的源
- 使用 jQuery 从元素列表创建特定属性的数组
- document.createElement();是否有我可以创建的元素列表
- 断言元素列表遵循带有 JavaScript 承诺的规则
- 在 jquery 中动态创建元素列表的最佳实践
- 如何使用 .nextUntil 将两个不同的类添加到
元素列表中
- 如何将一个元素列表移动到另一个性能最佳的元素中
- Javascript - 缺少 ] 在元素列表之后
- jquery中的li元素列表