创建自定义表行

时间:2017-08-18 20:23:26

标签: javascript html web-component shadow-dom custom-element

我正在尝试创建一个自定义表格行,但很难让它正常运行。我已经尝试了以下两种方法,它们给出了奇怪的结果。我意识到没有自定义元素这很容易,但这是一个更大的项目的一个小例子。我可以改变什么来达到预期的效果?



class customTableRow extends HTMLElement {
  constructor(){
    super();
    
    var shadow = this.attachShadow({mode: 'open'});
    
    this.tableRow = document.createElement('tr');
    

    var td = document.createElement('td');
    td.innerText = "RowTitle";
    this.tableRow.appendChild(td);
    
    var td2 = document.createElement('td');
    td2.innerText = "RowContent";
    td2.colSpan = 4;
    this.tableRow.appendChild(td2);

    shadow.appendChild(this.tableRow);
  }
  
}

customElements.define('custom-tr', customTableRow);

//Attempt 2
var newTr = new customTableRow;
document.getElementById('table2Body').appendChild(newTr);

td {
  border: 1px solid black;
}

<span>Attempt 1:</span>
<table>
  
  <thead>
    <tr>
      <th>One</th>
      <th>Two</th>
      <th>Three</th>
      <th>Four</th>
      <th>Five</th>
    </tr>
  </thead>
  
  <tbody>
    <custom-tr />
  </tbody>
  
</table>

<hr>

<span>Attempt 2:</span>
<table id="table2">

  <thead>
    <tr>
      <th>One</th>
      <th>Two</th>
      <th>Three</th>
      <th>Four</th>
      <th>Five</th>
    </tr>
  </thead>
  
  <tbody id="table2Body">
<!--     It should append here -->
  </tbody>
  
</table>

<hr>

<span>This is how I want it to look:</span>
<table id="table2">

  <thead>
    <tr>
      <th>One</th>
      <th>Two</th>
      <th>Three</th>
      <th>Four</th>
      <th>Five</th>
    </tr>
  </thead>
  
  <tbody>
    <tr>
      <td>Row Title</td>
      <td colspan="4">Row Content</td>
  </tbody>
  
</table>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:3)

<table>元素及其子组件<tbody><tr>需要非常具体的语法。例如,只有<tr>个元素被授权为<tbody>的子元素。

因此,您无法定义元素并将其插入<tbody><table>。如果这样做,它将在解析时移到<table>之外。因此,显示您的第一个示例(查看开发工具中的代码)。

相反,您应该在this answer to a similar question中定义自定义标记

或者您应该使用<custom-table><custom-tbody>重新定义完整的自定义表格结构...就像在this other answer中一样。

此外,您应该使用结束标记<custom-tr></custom-tr>,并将您的CSS规则插入Shadow DOM中,如果您希望在其中应用它。