ドラッグ&ドロップで回答できる並び替え問題を作るためのメモ

1、問題表示フェイズ

1−1、選択肢をliタグに

<ul>
<li id="1">1</li>
<li id="2">2</li>
...
</ul>

1ー2、ランダムで並び替え

1−2−1、参考:要素をランダムに並び替える

■HTML
<div id="sample">
<div><img src="images/cat1.jpg"></div>
<div><img src="images/dog1.jpg"></div>
<div><img src="images/dog2.jpg"></div>
<div><img src="images/bird1.jpg"></div>
<div><img src="images/bird2.jpg"></div>
<div><img src="images/dog3.jpg"></div>
<div><img src="images/cat2.jpg"></div>
<div><img src="images/bird3.jpg"></div>
<div><img src="images/cat3.jpg"></div>
<div><img src="images/cat4.jpg"></div>
<div><img src="images/bird4.jpg"></div>
<div><img src="images/dog4.jpg"></div>
</div>
■JAVASCRIPT
$(function() {
var arr = [];
$("#sample div").each(function() {
arr.push($(this).html());
});
arr.sort(function() {
return Math.random() - Math.random();
});
$("#sample").empty();
for(i=0; i < arr.length; i++) {
$("#sample").append('<div>' + arr[i] + '</div>');
}
});

1−2−2、ここまでのコード

<html>
<head>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
</head>
<body><div id="sample">
<div><li id="1">1</li></div>
<div><li id="2">2</li></div>
<div><li id="3">3</li></div>
<div><li id="4">4</li></div>
<div><li id="5">5</li></div></div>
<script>
$(function() {
var arr = [];
$("#sample div").each(function() {
arr.push($(this).html());
});
arr.sort(function() {
return Math.random() - Math.random();
});
$("#sample").empty();
for(i=0; i < arr.length; i++) {
$("#sample").append(arr[i]);
}
});
</script>
</body>
</html>

2、回答フェイズ

2ー1、ドラッグ&ドロップで並び替える
2−1−1、参考:ドラッグ&ドロップで要素を並び替えることができるSortable.js

html
<div class="list">
<div class="item">First</div>
<div class="item">Second</div>
<div class="item">Third</div>
<div class="item">Fourth</div>
</div>
css
.item {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
js
$(function() {
Sortable.create($('.list')[0]);
});

2−1−2、ここまでのコード

<html>
<head>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="Sortable.min.js"></script>
<style>
.item {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
</style>
</head>
<body>
<ul id="sample" class="list">
<div><li id="1" class="item">1</li></div>
<div><li id="2" class="item">2</li></div>
<div><li id="3" class="item">3</li></div>
<div><li id="4" class="item">4</li></div>
<div><li id="5" class="item">5</li></div>
</ul>
<script>
$(function() {
var arr = [];
$("#sample div").each(function() {
arr.push($(this).html());
});
arr.sort(function() {
return Math.random() - Math.random();
});
$("#sample").empty();
for(i=0; i < arr.length; i++) {
$("#sample").append(arr[i]);
}
});

$(function() {
Sortable.create($('.list')[0]);
});
</script>
</body>
</html>

2−2、回答決定

3、判定フェイズ

3−1−1、A案:各li要素のindexがidと一致しているかを判断
参考:jQueryでクリックされた要素が何番目か取得する

html
<ul>
<li class="some-item">hoge</li>
<li class="some-item">foo</li>
<li class="some-item">bar</li>
</ul>
js
$('li.some-item').on('click', function(){
var index = $('li.some-item').index(this);
console.log(index + 'th item clicked!');
});

3−1−2、懸念

同じ単語が複数回登場する文の場合、判定が煩雑になってしまう。

例えば、「吃 了 饭 了」など

3−2、B案:テキストを抽出して連結する

3−2−1、参考:要素配下のテキストを取得/設定するには?(text/html)

$('#list li').text()

3−2−2、ここまでのコード

<html>
<head>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="Sortable.min.js"></script>
<style>
.item {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
</style>
</head>
<body>
<ul id="sample"class="list">
<div><li id="1" class="item">1</li></div>
<div><li id="2" class="item">2</li></div>
<div><li id="3" class="item">3</li></div>
<div><li id="4" class="item">4</li></div>
<div><li id="5" class="item">5</li></div>
</ul>
<script>
$(function() {
var arr = [];
$("#sample div").each(function() {
arr.push($(this).html());
});
arr.sort(function() {
return Math.random() - Math.random();
});
$("#sample").empty();
for(i=0; i < arr.length; i++) {
$("#sample").append(arr[i]);
}
});
$(function() {
Sortable.create($('.list')[0]);
});
$(function() {
console.log($('#sample li').text());
});
</script>
</body>
</html>

3−3、B案を採用


サポートをしていただけると、クリエイター活動費として有難く使わせていただきます!その成果や経緯もここで発信できれば嬉しいです。