次のような弾丸領域があります
- こんにちは
- どのように
- それは
- あなた
いいえ、私は選択しています
- こんにちは
- どのように
- それは
- あなた
- 2 番目の子の後にディスクの弾丸を終了したい。
- 3 番目の子を親に兄弟として追加します。
- 4 番目の子に Disc bullet を再度作成し、親に兄弟として追加したい。
これどうやってするの。
次のような弾丸領域があります
いいえ、私は選択しています
これどうやってするの。
これは実際には自明ではなく、非常に興味深い問題です。ただし、最初にいくつかのことを知っておく必要があります。
ul
は順序なしリスト (つまり円盤の箇条書き)ol
用で、順序付きリスト (つまり番号付きの箇条書き) 用です。li
親が または のいずれかでなけれul
ば、 を持つことはできませんol
。ul
aを a の直接の子にしol
たり、その逆にすることはできません(li
ただし、それらは an の子にすることはできますが、サブリストになります)。これは、リストを切り替えるたびに、切り替える項目に正しい (反対の) タイプの親があり、その前後の項目が (別の) リストにあることを確認する必要があることを意味します。正しいタイプ。多くの場合、これらのリストを作成する (またはリストが空になったら削除する) 必要があります。
とにかく、言葉は無意味です。コードは次のとおりです (私は jQuery を使用していますが、使用するものに関係なく、考え方は同じでなければなりません)。
$('li').on('click', function () {
var $listItem = $(this);
var $list = $(this).parent();
var $items = $list.children();
var itemIndex = $items.index($listItem);
var numItems = $items.length;
var curType = $list.is('ul') ? 'ul' : 'ol';
var newType = curType === 'ul' ? 'ol' : 'ul';
var $prev = $list.prev();
var $next = $list.next();
if (itemIndex === 0) {
// The item we're switching is the first Item in the list
if (!$prev.is(newType)) {
$prev = $('<' + newType + '/>');
$prev.insertBefore($list);
}
$prev.append($listItem);
} else if (itemIndex === numItems - 1) {
// The item we're switching is the last Item in the list
if (!$next.is(newType)) {
$next = $('<' + newType + '/>');
$next.insertAfter($list);
}
$next.prepend($listItem);
} else {
// The item is in the middle, we need to split the current list into 3.
$tailList = $('<' + curType + '/>');
$tailList.append($listItem.nextAll());
$tailList.insertAfter($list);
$middleList = $('<' + newType + '/>');
$middleList.append($listItem);
$middleList.insertAfter($list);
}
if (numItems === 1) {
// list used to have only one Item, so it's now empty, and should be removed.
$list.remove();
if ($prev.is(newType) && $next.is(newType)) {
// The two surrounding lists are of the same type and should be merged.
$prev.append($next.children());
$next.remove();
}
}
});
リスト項目のクリック イベントを使用して、リスト項目を切り替えています。実装を試して、すべてが期待どおりに機能することを検証するための jsFiddle リンクは次のとおりです: http://jsfiddle.net/8Z9rf/
コードは間違いなく速度/パフォーマンスのために最適化できますが、私は単純さと明快さを目指していました.これを達成できたことを願っています.