Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。
num | data |
---|---|
row1 row1 row1 row1 row1 row1 row1 row1 row1 row1 | |
row2 row2 row2 row2 row2 row2 row2 row2 row2 row2 | |
row3 row3 row3 row3 row3 row3 row3 row3 row3 row3 | |
row4 row4 row4 row4 row4 row4 row4 row4 row4 row4 | |
row5 row5 row5 row5 row5 row5 row5 row5 row5 row5 row5 row5 row5 row5 row5 |
|
row6 row6 row6 row6 row6 row6 row6 row6 row6 row6 |
さすがに手を抜きすぎたと反省し、とりあえずツールチップ付けてみた。これでだいぶマシかと思う。
ソースは以下にて。
JavaScript
var rowSelect = {
init: function(table){
var tarTable = $(table);
var rowList = tarTable.getElementsByTagName('tr');
for(i=1; i<rowList.length; i++){
//addEvent(rowList[i],'mouseover',rowSelect.msOver,false);
//addEvent(rowList[i],'mouseout',rowSelect.msOut,false);
//addEvent(rowList[i],'click',rowSelect.selected,false);
rowList[i].onmouseover = rowSelect.msOver;
rowList[i].onmouseout = rowSelect.msOut;
rowList[i].onclick = rowSelect.selected;
}
//tooltips
var pos = getElementPos(rowList[1]);
var tips = document.createElement('div');
var tipsP = document.createElement('p');
tips.className = 'tooltips';
tips.style.position = 'absolute';
tips.style.left = pos.x + rowList[1].offsetWidth + 10 + 'px';
tips.style.top = pos.y + 'px';
tipsP.innerHTML = this.text1;
tarTable.parentNodedocument.body.appendChild(tips);this.tips = tips.appendChild(tipsP);
},
text1: 'クリックで行選択できます。<br />再選択で解除。2度目の行選択で移動先を決定します。',
text2: '行を選択しました。<br />続いて移動先を選択してください。再選択で解除できます。',
text3: '行を移動しました。',
msOver: function(e){
//var row = e.currentTarget;
var row = this;
if(row.className == 'msOver') return;
if(!rowSelect.selectFlag || rowSelect.selectFlag != row)
addClass(row,'msOver');
if(rowSelect.selectFlag && rowSelect.selectFlag != row)
addClass(row,'msOver2');
},
msOut: function(e){
//var row = e.currentTarget;
var row = this;
if(rowSelect.selectFlag != row){
delClass(row,"msOver");
delClass(row,"msOver2");
}
},
selected: function(e){
//var row = e.currentTarget;
var row = this;
if(rowSelect.selectFlag == row){
delClass(row,"msOver");
delClass(row,"msOver2");
delClass(row,"selected");
rowSelect.selectFlag = null;
rowSelect.tips.innerHTML = rowSelect.text1;
return;
}
else if(rowSelect.selectFlag && rowSelect.selectFlag != row){
var selectedRow = rowSelect.selectFlag;
delClass(selectedRow,"msOver");
delClass(selectedRow,"selected");
delClass(row,"msOver2");
var cloneRow = selectedRow.cloneNode(true);
//delete&insert
selectedRow.parentNode.removeChild(selectedRow);
row.insertAdjacentElement('beforeBegin',cloneRow);
//addEvent
cloneRow.onmouseover = rowSelect.msOver;
cloneRow.onmouseout = rowSelect.msOut;
cloneRow.onclick = rowSelect.selected;
//change tips
var pos = getElementPos(cloneRow);
rowSelect.tips.parentNode.style.top = pos.y + 'px';
rowSelect.tips.innerHTML = rowSelect.text3;
setTimeout(function(){ rowSelect.tips.innerHTML = rowSelect.text1; },1200);
rowSelect.selectFlag = null;
rowSelect.setValue(row);
return;
}
rowSelect.selectFlag = row;
delClass(row,"msOver");
delClass(row,"msOver2");
addClass(row,"selected");
var pos = getElementPos(row);
rowSelect.tips.parentNode.style.top = pos.y + 'px';
rowSelect.tips.innerHTML = rowSelect.text2;
},
setValue: function(row){
var rowList = row.parentNode.getElementsByTagName('tr');
for(var i=1;i<rowList.length;i++){
var targetNode = rowList[i].getElementsByTagName('input')[0];
// 表示番号のリセット
if(targetNode.nodeName == 'INPUT') {
targetNode.value = i;
}
}
}
}
addEvent(window,'load',function(){rowSelect.init('testTable')},false);
init()でツールチップを制作/挿入し、あとは状態変化の度にテキストを切り替えてやる。対象テキストはtext1~text3に格納。ツールチップの位置は表示上の位置を参考にしているため、CSSのレイヤー構造(position:relative等による基準位置の変更など)は含まれないが、document直下に挿入すれば見た目どおりの数値で何の問題もない。
あと、移動先の選択時用として「msOver2」クラスを追加。仕組みとしてはこれくらいあれば十分かなあ? デザイナやディレクタと相談しませう。
Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。