
tableのtr要素をドラッグ&ドロップで任意に入れ替え、その順番を取りたいです。
jqueryのSortableプラグインを調べ、これならできそうとプログラムを組み、
trの一行ごとならばできました。
やりたいことは、rowspanで連結されている<tr>を2行以上まとめて1つの要素とみなし、
入れ替えたいのですが、
jqueryのSortableでできますでしょうか?
<table>
<tr><td rowspan="2">一行目</td><td>あいう</td>
<tr><td>えお<td></tr>
<tr><td rowspan="2">二行目</td><td>かきく</td>
<tr><td>けこ<td></tr>
</table>
<table>を入れ子にすれば実現はできそうですが、
ちょっとCSSの関係もあり、その方法を採用するのは難しい気がしています。
No.3ベストアンサー
- 回答日時:
Google Chromeでも出来た。
しかし何故か、Google Chrome Ver 7.0.517.41 だと、↓ しないと、
うまくいかない。謎だ!
case "dragend":
if(dt.dropEffect=="move")
var target_table = target.parentNode; //Chrome で変数に渡せないなぜだ!
var idx = target.rowIndex; //Chrome で変数に渡せないなぜだ!
if(this.rowspan==0){
target.parentNode.deleteRow(target.rowIndex);
}else {
for(var i=this.rowspan-1;i>=0;i--){
target.parentNode.deleteRow(target.rowIndex+i);
}
}
return;
それから、
dt.setData("text/html" ~
dt.getData("text/html" ~
じゃなくて、こおいった時は本来
dt.setData("text/plain" ~
dt.getData("text/plain" ~
か。
さらに、
arguments.callee(tr.nextElementSibling);
は、関係無いところまで検査してしまっている。まあ、いいかっと。
No.2
- 回答日時:
とってつけたような強引な対応ですが、Rowspanに対応しました。
※「Element.nextElementSibling」も使ったのでFirefox3.5以上です。
※ 尚、ドロップ先がRowspanでまとめられてる場合は考慮してません。
※例によって、全角空白は半角空白にしてね。
※だれかが、もっといいやつを作ってくれるかもしれない。
function dragtable(table){
---前と同じなので省略---
ctx.stroke();
this.rowspan = 0;
this.handleEvent = function(event){
var dt= event.dataTransfer;
var target = event.target;
switch (event.type){
case "dragstart":
var trs = target.innerHTML;
this.rowspan = 0;
this.rowspanchk(target);
if(this.rowspan > 0){
for(var i=0;i<this.rowspan-1;i++){
trs += "~" + target.nextElementSibling.innerHTML;
}
}
dt.setData("text/html",trs);
dt.setDragImage(canvas,13,13);
dt.effectAllowed = "move";
return;
case "dragover":
if(target.nodeName == "TD" || target.nodeName == "TH")
event.preventDefault();
return;
case "drop":
var trs = dt.getData("text/html").split("~");
var target_tr = target.parentNode;
for(var i=trs.length;i>0;i--){
var tr = target_tr.parentNode.insertRow(target_tr.rowIndex);
tr.innerHTML = trs[i-1];
tr.setAttribute("draggable","true");
target_tr.parentNode.insertBefore(tr,target_tr.nextElementSibling);
}
event.preventDefault();
return;
case "dragend":
if(dt.dropEffect=="move")
var target_table = target.parentNode;
var idx = target.rowIndex;
if(this.rowspan==0)
target_table.deleteRow(idx);
else {
for(var i=this.rowspan-1;i>=0;i--){
target_table.deleteRow(idx+i);
}
}
return;
}
}
}
dragtable.prototype.rowspanchk = function(tr){
var td = tr.childNodes;
var rowspan = [];
for(var i=0;i<td.length;i++){
if(td[i].getAttribute("rowspan") > 0)
rowspan.push(td[i].getAttribute("rowspan"));
}
rowspan.sort();
if(rowspan[0]){
this.rowspan += rowspan[0];
arguments.callee(tr.nextElementSibling);
}
}
myDragTable = new dragtable(document.getElementById("dragtable"));
No.1
- 回答日時:
こんなんで、(Firefox 3.1 以上)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<table id="dragtable" border="1" style="margin:10px auto 10px;"><tbody>
<tr><th>A</th><th>B</th><th>C</th></tr>
<tr draggable="true"><td>a</td><td>b</td><td>c</td></tr>
<tr draggable="true"><td>あ</td><td>い</td><td>う</td></tr>
<tr draggable="true"><td rowspan="2">1</td><td>2</td><td>3</td></tr>
<tr draggable="true"><td>ろ</td><td>は</td></tr>
<tr draggable="true"><td>x</td><td>y</td><td>z</td></tr>
<tr draggable="true"><td>X</td><td>Y</td><td>Z</td></tr>
</tbody></table>
<script type="text/javascript">
function dragtable(table){
this.table = table;
table.addEventListener("dragstart",this,false);
table.addEventListener("dragover",this,false);
table.addEventListener("drop",this,false);
table.addEventListener("dragend",this,false);
var canvas = document.createElement("canvas");
canvas.width = canvas.height = 26;
var ctx = canvas.getContext("2d");
ctx.lineWidth = 2;
ctx.moveTo(0,0),ctx.lineTo(26,13),ctx.moveTo(0,26),ctx.lineTo(26,13);
ctx.stroke();
this.handleEvent = function(event){
var dt= event.dataTransfer;
var target = event.target;
switch (event.type){
case "dragstart":
dt.setData("application/x-moz-node",event.target);
dt.setData("text/html",event.target.innerHTML);
dt.setDragImage(canvas,13,13);
dt.effectAllowed = "move";
return;
case "dragover":
if(target.nodeName == "TD")
event.preventDefault();
return;
case "drop":
var target_tr = target.parentNode;
var tr = target_tr.parentNode.insertRow(target_tr.rowIndex);
tr.innerHTML = dt.getData("text/html");
tr.setAttribute("draggable","true");
event.preventDefault();
return;
case "dragend":
if(dt.dropEffect=="move")
target.parentNode.deleteRow(target.rowIndex);
return;
}
}
}
myDragTable = new dragtable(document.getElementById("dragtable"));
</script>
</body>
</html>
Rowspan対応も出来そう(まとめて移動すればよいのか)だが....
続く....(続かないかも)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS テーブルタグのセルの幅の一部だけを指定 1 2023/03/12 12:02
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- Visual Basic(VBA) Selenium.ChromeDriverの使い方について 7 2022/09/22 06:43
- HTML・CSS 【CSS】:hasで可能? imgを含むtr要素を選択したい 1 2022/11/17 14:36
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript jQueryで同じクラス名のものを別物として扱いたい 1 2022/06/17 14:14
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- HTML・CSS 自身のHPにYouTube動画を貼り付けるのが出来なくなり困ってます 1 2022/11/11 10:44
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- JavaScript 追加ボタンを押した際に ok ボタンを押した場合のみ入力値が追記されるようにしたいです 6 2022/05/29 09:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
生コンの立米数の出し方
-
バッチファイル 特定ウインドウ...
-
b75h2-m2 biosアップデートした...
-
php コールバック関数
-
ナイトボットのAliasについて
-
これってなんの電話かわかりま...
-
VBAでクイズゲームの作り方
-
以下のURL入れますか?皆さんは↓
-
画像のドットの部分が抜けてい...
-
Chinapost こよパズルどう動か...
-
非同期通信で掲示板を作る際の...
-
非同期通信を使うタイミングが...
-
PYTHONのtkinterについて
-
Pythonのtkinterについて
-
Pythonを勉強する道のり
-
Pythonを無料(安価)で学ぶ方...
-
RPA(PowerAutomate)の実装について
-
ワードでA3横の画面にして、文...
-
入力フォームの値をQRコードで...
-
課題なのですがどなたかコード...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tableのtr要素をドラッグ&ドロ...
-
スライドを最後の画像で止めたい
-
下記サイトのメニューをフラッ...
-
CSVファイルの文字列の表示につ...
-
jqueryでタグの中にある文字が...
-
readyStateが4にならない原因
-
変数の内容を別functionに渡したい
-
【※初歩の質問かもです※】スプ...
-
appleのトップのニュースティッ...
-
jQuery 複雑なswitch文を作りたい
-
Ajaxの結果のページングの方法
-
前後の「+」の意味は?
-
jQueryでのclassの操作
-
Yahoo!ウィジェットのgetElemen...
-
JScriptでDBへの接続方法について
-
moment.js
-
【再質問】計算(入数*単価)...
-
onloadで動かない<DHTML+AJAXア...
-
Google Apps Scriptを利用した...
-
Ajax.Requestで取得したHTMLソ...
おすすめ情報