JQueryUIの選択可能なテーブルで複数選択機能を有効にしたい shift。
私はおそらくこのようなことをする必要があります shift マウスクリックで押したままにします
しかし、私はこれをきれいな方法で行う方法を見つけることができません...
現時点では、これを選択可能な構成内に収めました。
start: function(e)
{
var oTarget = jQuery(e.target);
if(!oTarget.is('tr')) oTarget = oTarget.parents('tr');
}
したがって、oTarget
はクリックされた要素です(およびe.currentTarget
はテーブル全体です)しかし、今は何ですか?クリックした要素が選択した要素の上にあるか下にあるかを教えてくれる方法で、すでに選択されている要素を見つけて、その間のすべてを選択するにはどうすればよいですか?
私はこれを次のように解決し、選択可能な要素に追加しました:
jQuery(table).mousedown(function(e)
{
//Enable multiselect with shift key
if(e.shiftKey)
{
var oTarget = jQuery(e.target);
if(!oTarget.is('.ui-selectee')) oTarget = oTarget.parents('.ui-selectee');
var iNew = jQuery(e.currentTarget).find('.ui-selectee').index(oTarget);
var iCurrent = jQuery(e.currentTarget).find('.ui-selectee').index(jQuery(e.currentTarget).find('.ui-selected'));
if (iCurrent < iNew) {
iHold = iNew;
iNew = iCurrent;
iCurrent = iHold;
}
if(iNew != '-1')
{
jQuery(e.currentTarget).find('.ui-selected').removeClass('ui-selected');
for (i=iNew;i<=iCurrent;i++) {
jQuery(e.currentTarget).find('.ui-selectee').eq(i).addClass('ui-selected');
}
e.stopImmediatePropagation();
e.stopPropagation();
e.preventDefault();
return false;
}
}
}).selectable(...)
その機能のための簡単なプラグインを書きました。それはjQueryui Selectableプラグインに依存しておらず、私が知る限り、それでうまく機能します。
プラグインコードと簡単な例はここにあります: http://jsfiddle.net/bMgpc/170/
以下に簡単な説明を書きます。
基本的な使用法:
$('ul').multiSelect();
「Ctrl」または「CommandKey」を押したままにすると、要素を1つずつ選択/選択解除できます。
ul-選択する内部要素を保持する親。
利用可能なオプションがいくつかあります。
これは開発バージョンのプラグインなので、注意して使用してください
あなたはこのようなプラグインなしでそれを行うことができます:
var prev = -1; // here we will store index of previous selection
$('tbody').selectable({
selecting: function(e, ui) { // on select
var curr = $(ui.selecting.tagName, e.target).index(ui.selecting); // get selecting item index
if(e.shiftKey && prev > -1) { // if shift key was pressed and there is previous - select them all
$(ui.selecting.tagName, e.target).slice(Math.min(prev, curr), 1 + Math.max(prev, curr)).addClass('ui-selected');
prev = -1; // and reset prev
} else {
prev = curr; // othervise just save prev
}
}
});
これがライブデモです: http://jsfiddle.net/mac2000/DJFaL/1/embedded/result/
周りを見回した後、jQuery UIのSelectable関数を使用しているときにこの問題の解決策を見つけることができなかったので、1つ書きました。基本的に、Selectableの選択済み/未選択のコールバックを利用して、標準のSelectable APIに従ってコールバックを尊重しながら、DOM状態を管理します。次のユースケースをサポートします。
テーブルの使用法:
$('table').shiftSelectable({filter: 'tr'});
いくつかのメモ。 (1)現在、兄弟要素のみをサポートしています。 (2)表の例に示されているように、構成オプションと選択可能なメソッドを通過します。 (3)underscore.jsが大好きなので、必須ではありませんが使用されます。この素晴らしいライブラリを使用したくない場合は、簡単なチェックと拡張を自由に交換してください。いいえ、underscore.jsとは提携していません。 :)
これが他の誰かに役立つことを願っています!乾杯。