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;}//tooltipsvar 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&insertselectedRow.parentNode.removeChild(selectedRow);row.insertAdjacentElement('beforeBegin',cloneRow);//addEventcloneRow.onmouseover = rowSelect.msOver;cloneRow.onmouseout = rowSelect.msOut;cloneRow.onclick = rowSelect.selected;//change tipsvar 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かはてブコメントにて。