2017-06-05 65 views
0

我正在嘗試使用變量no的動態表格。行和列。表格被創建,但是當我點擊單元格時,它們不可編輯,因爲我認爲它們會是。動態表格中的可編輯單元格

$(document).ready(function() { 
 
      $("#createit").click(function() { 
 
       var num_rows = document.getElementById('rows').value; 
 
       var num_cols = document.getElementById('cols').value; 
 
       var tbody = ''; 
 
       for (var i = 0; i < num_rows; i++) { 
 
        tbody += '<tr>'; 
 
        for (var j = 0; j < num_cols; j++) { 
 
         tbody += '<td tabindex=' + j + '>'; 
 
         tbody += 'Cell' + i + j; 
 
         tbody += '</td>' 
 
        } 
 
        tbody += '</tr>'; 
 
       } 
 
       //document.getElementById('wrapper').innerHTML = theader + tbody + tfooter; 
 
       $('.editableTable').append(tbody); 
 
      }); 
 
     }); 
 
     $(".editableTable td").dblclick(function() { 
 
      console.log('clicked'); 
 
      var OriginalContent = $(this).text(); 
 
      $(this).addClass("cellEditing"); 
 
      $(this).html("<select><option>1</option><option>2</option><option >3</option></select>"); 
 
      $(this).children().first().focus(); 
 
      $(this).bgColor = 'red'; 
 

 
      $(this).children().first().keypress(function(e) { 
 
       if (e.which == 13) { 
 
        var newContent = OriginalContent; 
 
        $(this).parent().text(OriginalContent); 
 
        $(this).parent().removeClass("cellEditing"); 
 
       } 
 
      }); 
 
      $(this).children().first().blur(function() { 
 
       $(this).parent().text(OriginalContent); 
 
       $(this).parent().removeClass("cellEditing"); 
 
      }); 
 
     }); 
 
     $(".editableTable td").bind('keydown', function(event) { 
 
      if (event.keyCode === 9 || event.keyCode === 13) { 
 
       var tabindex = $(this).attr('tabindex'); 
 
       tabindex++; //increment tabindex 
 
       $('[tabindex=' + tabindex + ']').focus().dblclick(); 
 
       return false; 
 
      } 
 
     });
.editableTable { 
 
      border: solid 0px; 
 
      width: 100%; 
 
      text-align: center 
 
     } 
 

 
     .editableTable td { 
 
      border: solid 0.5px; 
 
      border-color: lightblue; 
 
      min-width: 100px; 
 
     } 
 

 
     .editableTable .cellEditing { 
 
      padding: 0; 
 
     } 
 

 
     select { 
 
      border: 0px; 
 
      width: 100%; 
 
     }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<label>Rows: <input type="text" name="rows" id="rows"/></label><br /> 
 
    <label>Cols: <input type="text" name="cols" id="cols"/></label><br/> 
 
    <input name="generate" type="button" value="Create Table!" id='createit' /> 
 
    <div id="wrapper"> 
 
     <table class="editableTable"> 
 
      <tbody></tbody> 
 
     </table> 
 
    </div>

同樣的事情,我以前而是一個靜態表來完成。 JSFIDDLE https://jsfiddle.net/rbrohitbisht/691rx62k/

現在我想用動態表做同樣的事情。我在這裏做錯了什麼?

+0

哪裏是CONTENTEDITABLE = 「真」 加入到細胞? – RouthMedia

+0

@RouthMedia,我想你並沒有在我提到的問題上提到過那個jsfiddle。請看看。 –

回答

0

該操作應該移入createit處理程序定義中。

$(".editableTable td").dblclick(function() {...}); 

剛創建好單元格後(當然在單擊克里特表格後!)。

否則,在動態表就位之前,選擇器$(「。editableTable td」)不會返回任何內容。

+0

這解決了我的問題。但是我有一個疑問,只有當某個'td'被dblclicked時,我才調用$(「。editableTable td」),所以,這意味着只有在創建表之後,我纔可以在創建後單擊表格單元格桌子。所以邏輯上它應該使用$(「。editableTable td」)。dblclick(function(){});. 或者它正在像在加載js時一樣,如果它沒有找到任何具有此名稱的類,那麼它將不會返回任何內容? –

+0

$(「。editableTable td」)。dblclick(..)在初始文檔加載時被調用。那時候,選擇器什麼都不返回。所以,事件處理程序根本就沒有附加任何東西。爲了更好地理解事物,嘗試在螢火蟲後運行這段代碼,創建表格。一旦你運行這段代碼,你將會看到處理程序所附的所有元素。沒有創建表運行相同。你會看到不同之處。 –

0

您應該添加contenteditable="true"到您的代碼

https://codepen.io/anon/pen/XgJaxE

$(document).ready(function() { 
     $("#createit").click(function() { 
      var num_rows = document.getElementById('rows').value; 
      var num_cols = document.getElementById('cols').value; 
      var tbody = ''; 
      for (var i = 0; i < num_rows; i++) { 
       tbody += '<tr>'; 
       for (var j = 0; j < num_cols; j++) { 
        tbody += '<td contenteditable="true" tabindex=' + j + '>'; 
        tbody += 'Cell' + i + j; 
        tbody += '</td>' 
       } 
       tbody += '</tr>'; 
      } 
      //document.getElementById('wrapper').innerHTML = theader + tbody + tfooter; 
      $('.editableTable').append(tbody); 
     }); 
    }); 
    $(".editableTable td").dblclick(function() { 
     console.log('clicked'); 
     var OriginalContent = $(this).text(); 
     $(this).addClass("cellEditing"); 
     $(this).html("<select><option>1</option><option>2</option><option >3</option></select>"); 
     $(this).children().first().focus(); 
     $(this).bgColor = 'red'; 

     $(this).children().first().keypress(function(e) { 
      if (e.which == 13) { 
       var newContent = OriginalContent; 
       $(this).parent().text(OriginalContent); 
       $(this).parent().removeClass("cellEditing"); 
      } 
     }); 
     $(this).children().first().blur(function() { 
      $(this).parent().text(OriginalContent); 
      $(this).parent().removeClass("cellEditing"); 
     }); 
    }); 
    $(".editableTable td").bind('keydown', function(event) { 
     if (event.keyCode === 9 || event.keyCode === 13) { 
      var tabindex = $(this).attr('tabindex'); 
      tabindex++; //increment tabindex 
      $('[tabindex=' + tabindex + ']').focus().dblclick(); 
      return false; 
     } 
    }); 
+0

因爲我已經說過我正在做什麼,並且還提到了一個JSFIDDLE,我不需要讓它contenteditable =「true」,但現在我得到了答案,謝謝你的時間和迴應。 https://codepen.io/anon/pen/owgyqg#anon-login –

0

use HTML DOM "contentEditable" Property Element Object https://stackoverflow.com/a/44380264/3615816

<input type=button value="Enable editing" 
 
onclick="document.getElementById('t1').contentEditable = 'true';alert('You can now edit table')" /> 
 

 
<table id="t1" border="1"> 
 
    
 
    <tr><td >c1</td><td >c2</td></tr> 
 
    <tr><td >cc1</td><td >cc2</td></tr> 
 

 
</table> 
 

 
<input type=button value="disable editing" 
 
onclick="document.getElementById('t1').contentEditable = 'false'; " />

+0

感謝你的回覆,但這不是我正在尋找的那一個...... –

+0

親愛的朋友。我知道你的問題,這是你的代碼的補充代碼片段,並自動爲表格編輯它,你可以使用這個代碼 –

+0

首先,表格單元格必須是可編輯的,只有當單元格被點擊時。可編輯的單元格可能包含選項選擇,文本框等。編輯單元格時,按下Tab鍵時,它應該關注下一個Tab-Index單元格並使其可編輯。最後一點,單元格的原始值應該保留,從下拉列表中選擇的值將用於其他事情。 –

0

$(document).ready(function() { 
 
     $("#createit").click(function() { 
 
      var num_rows = document.getElementById('rows').value; 
 
      var num_cols = document.getElementById('cols').value; 
 
      var tbody = ''; 
 
      var tabindex = 0 
 
      for (var i = 0; i < num_rows; i++) { 
 
       tbody += '<tr>'; 
 
       for (var j = 0; j < num_cols; j++) { 
 
        tbody += '<td tabindex=' + tabindex++ + '>'; 
 
        tbody += 'Cell' + i + j; 
 
        tbody += '</td>' 
 
       } 
 
       tbody += '</tr>'; 
 
      } 
 
      //document.getElementById('wrapper').innerHTML = theader + tbody + tfooter; 
 
      $('.editableTable').append(tbody); 
 
     }); 
 
    }); 
 
    $(document).on('dblclick', 'td', function() { 
 
     console.log('clicked'); 
 
     this.contentEditable = 'true'; 
 
    }); 
 
    $(document).on('keydown', 'td', function (event) { 
 
     if (event.keyCode === 9 || event.keyCode === 13) { 
 
      this.contentEditable = 'false'; 
 
      // $(this).next().focus().dblclick().focus(); 
 
      var tabindex = $(this).attr('tabindex'); 
 
      tabindex++; 
 
      var next = $('[tabindex=' + tabindex + ']').focus().dblclick(); 
 
      if (next.is('td') == false) 
 
       return true; 
 
      var sel, range; 
 
      if (window.getSelection && document.createRange) { 
 
       range = document.createRange(); 
 
       range.selectNodeContents(next[0]); 
 
       range.collapse(true); 
 
       sel = window.getSelection(); 
 
       sel.removeAllRanges(); 
 
       sel.addRange(range); 
 
      } else if (document.body.createTextRange) { 
 
       range = document.body.createTextRange(); 
 
       range.moveToElementText(next[0]); 
 
       range.collapse(true); 
 
       range.select(); 
 
      } 
 

 
      return false; 
 
     } 
 
    });
.editableTable { 
 
      border: solid 0px; 
 
      width: 100%; 
 
      text-align: center 
 
     } 
 

 
     .editableTable td { 
 
      border: solid 0.5px; 
 
      border-color: lightblue; 
 
      min-width: 100px; 
 
     } 
 

 
     .editableTable .cellEditing { 
 
      padding: 0; 
 
     } 
 

 
     select { 
 
      border: 0px; 
 
      width: 100%; 
 
     }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<label>Rows: <input type="text" name="rows" id="rows"/></label><br /> 
 
    <label>Cols: <input type="text" name="cols" id="cols"/></label><br/> 
 
    <input name="generate" type="button" value="Create Table!" id='createit' /> 
 
    <div id="wrapper"> 
 
     <table class="editableTable"> 
 
      <tbody></tbody> 
 
     </table> 
 
    </div>

相關問題