HTMLとJavascriptで、テーブルのセル内のテキストをモーダルウィンドウ内で編集し、
編集後の内容を元のテキストと置き換えるスクリプトを作成しています。
・テーブル内の任意のセル内をクリックするとモーダルウィンドウが表示される
・モーダルウィンドウ内でテキストを編集し確定ボタンを押下すると、元のセルの内容を置換する
・モーダルウィンドウ内でキャンセルボタンを押下すると、ウィンドウを閉じる
・セルにIDを振ることはできない
・テーブルの行、列は任意に増やすことができる
以下のように作成したところ、編集を繰り返すごとに、それまで編集したセルが
すべて置き換わってしまいました。
セルをクリックする度に、対象のセルが累積していく様子です。
原因としては、テーブルセルのclickイベント内に保存ボタンのイベント処理が
あることだと思うのですが、外に出した場合、クリック元のセルを取得する方法が分かりません。
どなたか助けていただけないでしょうか。
jquery-1.7.2.js
javascript
1$(function(){ 2 3 //テーブルセル押下で編集モード 4 $('[id^=edit-table] > tbody > tr > td').on('click', function(){ 5 var targetCell = $(this); 6 7 //disable-editorクラスがある場合は編集させない 8 if(!$('[id^=edit-table]').hasClass('disable-editor')){ 9 html = targetCell.html(); 10 //エディタ起動 11 var target = '#td_editor_modal'; //モーダルウィンドウのID 12 activateTdEditor(target, html); //モーダルウィンドウ表示 13 14 //エディタウィンドウの保存ボタン 15 $('#do-save').on('click',function(){ 16 //エディタ内のコンテンツを取得 17 //本来はエディタからの戻り値が入る 18 var content = 'ほげほげ' 19 //モーダルウィンドウを閉じる 20 modalClose('#td_editor_modal'); 21 //元のセルの内容を置換 22 $(targetCell).html(content); 23 }); 24 25 //エディタウィンドウを閉じる 26 $('#modal-close').on('click', function(){ 27 modalClose('#td_editor_modal'); 28 }); 29 30 } 31 32 }); 33});
HTML
1<div id="table-edit-area"> 2 <table id="edit-table-hoihoi" class="table table-bordered"> 3 <tbody> 4 <tr> 5 <td>見出し1</td> 6 <td>見出し2</td> 7 <td>見出し3</td> 8 </tr> 9 <tr> 10 <td>1-1</td> 11 <td>1-2</td> 12 <td>1-3</td> 13 </tr> 14 <tr> 15 <td>2-1</td> 16 <td>2-2</td> 17 <td>2-3</td> 18 </tr> 19 <tr> 20 <td>3-1</td> 21 <td>3-2</td> 22 <td>3-3</td> 23 </tr> 24 </tbody> 25 </table> 26</div> 27 28<!-- セル内編集用ののモーダルウィンドウ --> 29<div id="modal-overlay"></div> 30<div id="td_editor_modal"> 31 <div id="edit_box"></div> 32 33 <div class="btn-control"> 34 <button id="do-save" class="btn btn-primary">保存</button> 35 <button id="modal-close" class="btn btn-primary">キャンセル</button> 36 </div> 37</div> 38
以下を追記いたしました。
javascript
1/*------------------------- 2* エディタ起動 3---------------------------*/ 4function activateTdEditor(target, html){ 5 //モーダルウィンドウ表示位置調整 6 centeringModalPosition(target); 7 //モーダルウィンドウ表示 8 modalOpen(target); 9 10 //エディタ起動 11 $('#edit_box').html(html); 12 //ダミーとして編集したことにする 13 $('#edit_box').append('ああああああ'); 14} 15/*------------------------- 16* モーダルウィンドウを開く 17---------------------------*/ 18function modalOpen(modalId){ 19 $(modalId).css('display', 'block'); 20 $('#modal-overlay').css('display', 'block'); 21} 22 23/*------------------------- 24* モーダルウィンドウを閉じる 25---------------------------*/ 26function modalClose(modalId){ 27 $('#modal-overlay').css('display', 'none'); 28 $(modalId).css('display', 'none'); 29} 30 31/*------------------------- 32* モーダルウィンドウの表示位置調整 33---------------------------*/ 34function centeringModalPosition(modalId){ 35 //画面幅取得 36 var w = $(window).width(); 37 //画面高さ取得 38 var h = $(window).height(); 39 40 //モーダルウィンドウの幅取得 41 var cw = $(modalId).outerWidth(true); 42 //モーダルウィンドウの高さ取得 43 var ch = $(modalId).outerHeight(true); 44 45 46 //モーダルウィンドウの横位置計算 47 var pxleft = ((w - cw)/2); 48 //モーダルウィンドウの縦位置計算 49 var pxtop = ((h - ch)/2); 50 51 $(modalId).css({"left": pxleft + "px"}); 52 $(modalId).css({"top": pxtop + "px"}); 53 54} 55 56function debugPrintIndex(e){ 57 //行番号取得 58 var row = $(e.target).closest('tr').index(); 59 //列番号取得 60 var col = e.target.cellIndex; 61 62 console.log('行:列 = ' + row + ':' + col); 63}
activateTdEditorも自由に変更可能です。
記載したソースではダミーの処理をしていますが、実際のコードでもさほど変わらず、エディタにセル内の値を食わせてエディタ起動しているだけです。
以下動作サンプルです。
●エディタなし版
http://amicolo.net/make-table/index4.html
回答2件
あなたの回答
tips
プレビュー