Skip to content

Instantly share code, notes, and snippets.

@Implem
Created December 13, 2015 20:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Implem/0a2f5572e255b0ac1df7 to your computer and use it in GitHub Desktop.
Save Implem/0a2f5572e255b0ac1df7 to your computer and use it in GitHub Desktop.
jQuery ドラッグアンドドロップで「並び替え」と「入れ子関係変更」の両方ができるメニュー画面を作りたい ref: http://qiita.com/Implem/items/eb832fcfc3e99016bc15
<nav>
<ul class="nav-sites sortable">
<li class="nav-site" data-id="35" data-type="Sites">
<a href="/items/35/index">folder 1</a>
</li>
<li class="nav-site" data-id="37" data-type="Sites">
<a href="/items/37/index">folder 1-1</a>
</li>
<li class="nav-site" data-id="36" data-type="Sites">
<a href="/items/36/index">folder 2</a>
</li>
</ul>
</nav>
var mouseX;
var mouseY;
// マウス移動時にマウスポインタのXY座標をメモリに保持
$(window).mousemove(function (e) {
mouseX = e.pageX;
mouseY = e.pageY;
});
// マウスポインタが重なっている要素を返却
function getHoveredItem($elements) {
var $element;
$elements.each(function () {
if (isHover($(this))) {
$element = $(this);
return false;
}
});
return $element;
}
// マウスポインタが重なっているか判定
function isHover($element) {
var left = $element.offset().left;
var top = $element.offset().top;
var right = left + $element.outerWidth();
var bottom = top + $element.outerHeight();
if (mouseX >= left &&
mouseX <= right &&
mouseY >= top &&
mouseY <= bottom) {
return true;
} else {
return false
}
}
$(function () {
$('.nav-sites.sortable').sortable({
// sortableの動作終了
stop: function (event, ui) {
// ドラッグ中の要素のデータを取得
var siteId = ui.item.attr('data-id');
// ドラッグ中の要素以外でマウスポインタと重なっている要素を取得
var $element = getHoveredItem($('.nav-site:not([data-id="' + siteId + '"])'));
// マウスポインタと重なっている要素があるか?
if ($element) {
// ドラッグ中の要素を非表示にする
ui.item.hide();
// 「入れ子関係変更」の処理を記述(サーバサイドにデータ送信)
//
//
}
},
// sortableにより順番が入れ替わった
update: function () {
// 「並び替え」の処理を記述(サーバサイドにデータ送信)
//
//
}
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment