2017-07-18 89 views
0

我目前使用jQuery數據表來創建我正在顯示的表。目前,我已經設置了它,所以當我在表中選擇一行時,該行中的文本出現在另一個面板的文本框中。然後,我可以輸入其他內容並按下「保存」,它會更改該行中的文本。我目前的問題是,當我通過按鈕添加一個新的行,我不能編輯新行中的文本,我可以選擇它但是... 例如:我有3行,我選擇Test1,我可以成功更改文本。然後單擊添加行,然後選擇新行並嘗試更改該行中的文本,它會更改之前選定的行文本(加載時位於表中的行)。 我該如何解決這個問題?我查看了cell.data,cell.edit,但那是因爲各種原因我目前沒有使用的編輯器。jQuery Datatable無法編輯新創建的行

表:

<div class="panel-body"> 
       <table id="data-table" class="table table-striped table-bordered nowrap" width="100%"> 
        <thead> 
         <tr> 
          <th>Name</th> 
         </tr> 
        </thead> 
        <tbody> 
         <tr class="odd"> 
          <td>All</td> 
         </tr> 
         <tr class="even"> 
          <td>Test1</td> 
         </tr> 
         <tr class="odd"> 
          <td>Test2</td> 
         </tr> 
        </tbody> 
       </table> 
       <div class="col-md-8 col-md-offset-1"> 
        <button type="submit" class="btn btn-sm btn-primary m-r-5" id="addbtn" >New Group</button> 
       </div> 
      </div> 
//Text box 
<div class="form-group"> 
       <label class="col-md-4 control-label">Group Name:</label> 
        <div class="col-md-8"> 
         <input type="text" id="groupname" class="form-control" value="Name"/> 
        </div> 
      </div> 

代碼使所選行的文本出現在文本框:

(function() { 

     var table = document.querySelector('#data-table'); 
     var textbox = document.querySelector('#groupname'); 

     table.addEventListener('click', onTableClick); 

     function onTableClick (e) { 
     var tr = e.target.parentElement; 

     var data = []; 
     for (var td of tr.children) { 
      data.push(td.innerHTML); 
     } 
     textbox.value = data[0]; 
     } 
    })(); 

更改選定行的文本:

var row = null; 

    $("#data-table tr td").click(function() { 
     $("#groupname").val($(this).text()); 
     row = $(this); 


     $("#saverow").click(function() { 
      if (row != null) { 
      row.text($("#groupname").val()); 
      } 
     }); 
    }); 

添加一行:

$("#addbtn").click(function() { 
    var t = $('#data-table').DataTable(); 

$('#data-table').dataTable(); 
    t.row.add([ 
     "New Group" 
    ]).draw(false); 
}); 
+0

我認爲你的問題是重複IDS。您可能只有一個id文檔的實例。它編輯上一行文本的原因是因爲您幾乎可以通過id選擇所有內容,並且只能在頁面上找到第一個結果。 – ebraley

+0

所選標籤被添加到類標籤中。我可以成功地更改我已經編碼到html中的所有3行的文本,但是一旦我添加了新行,我就不能更改該行的文本。我仍然可以更改所有其他行文本。 –

回答

0

正如here所述,通過andreister,當我們使用.click時,爲每個匹配選擇器的單個元素創建一個單獨的句柄。這意味着

  1. 許多匹配的元素會產生許多相同的處理,從而提高內存佔用
  2. 動態添加的項目將不會有處理程序 - !「警報」,即,在上面的html新增除非重新綁定處理程序,否則按鈕將不起作用。

但是當我們使用。 對於與選擇器匹配的所有元素,包括動態創建的元素,都有一個處理程序。

因此,我改變

$("#data-table tr td").click(function() { 

$("#data-table").on('click', 'td', function() { 

解決我的問題。

+2

請使用您問題上的編輯鏈接添加其他信息。後回答按鈕應該只用於問題的完整答案。 - [來自評論](/ review/low-quality-posts/16753077) – Swellar

+0

請查看[如何回答](https://stackoverflow.com/help/how-to-answer)並更新您的答案提供更多細節。具體來說,如果你解釋瞭如何解決這個問題,這將會很有幫助。 - [來自評論](https://stackoverflow.com/review/low-quality-posts/16753077) – Ortund

1

爲什麼你在桌面點擊時有這兩個相互衝突的陳述?

  1. 設置組名輸入到第一列列用戶只需點擊

    function onTableClick (e) { 
        ... 
        textbox.value = data[0]; 
        ... 
    } 
    

    這裏,textbox.value = data[0]似乎'#groupname'輸入字段的文本值被設置爲剛剛點擊任何行的第一列。

  2. 設置輸入到單元格中的文本,我們點擊

    $("#data-table tr td").click(function() { 
        ... 
        row.text($("#groupname").val()); 
        ... 
    }); 
    

這裏,row.text($("#groupname").val());似乎'#groupname'輸入字段的文本值被設置爲我們所點擊的確切列的文本。

順便說一句,這裏row是一個誤導性的變量名稱,因爲實際的元素$(this)指的是任何td這是一個tr這是'#data-table'孩子的孩子。所以真的$(this)是一個列或表格單元格;稱它爲row令人困惑。

+0

感謝您的評論,我對編碼還是比較陌生,錯過了這裏的衝突。我擺脫了「功能onTableClick(e){ ... textbox.value = data [0]; ... }」代碼。儘管我仍然堅持如何才能實現我的最初目標。 –

+0

DataTables的''row.add()'實際上是否添加了'td'?請參閱[https://datatables.net/reference/api/row.add()](https://datatables.net/reference/api/row.add())。它看起來可能只是添加一個'tr'。在這種情況下,$(「#data-table tr td」)。click(function()..)'不會爲新添加的行運行,對吧? – anandsun