【问题标题】:How can I get the col's id of a td (not column number of a td)?如何获取 td 的 col id(不是 td 的列号)?
【发布时间】:2011-11-05 12:16:39
【问题描述】:

在这个例子中:

<table border="1">
    <col id="col0" style="background-color: #FFFF00"/>
    <col id="col1" style="background-color: #FF0000"/>
    <tr><td rowspan="2">1</td><td>2</td><td>3</td></tr>
    <tr><td>4</td><td>5</td><td>6</td></tr>
    <tr><td>7</td><td>8</td><td>9</td></tr>
</table>

如何获取 td 4 的 col id?

如果我用这个 jquery 命令得到它的列号:

var cn = $(this).parent().children().index($(this));

cn 会是 0,但是它的样式显示它属于 col1 我需要像 td.col.id 这样的表扬

当我在 td 上方的 td 处设置 rowspan="2"(例如 td 4)时,此 td 的列号将与其 col(或 colgroup)的顺序不同,我设置背景颜色以显示它。

编辑: 我相信有一种方法可以解决这个问题,因为当 td 知道它是 col(colgroup) 时,必须有一种方法可以从 dom 树的 td 询问它。 (td4你展示了一个特定col的风格,那个col是谁?)

【问题讨论】:

    标签: javascript html dom html-table col


    【解决方案1】:

    解析行跨度或列跨度将非常复杂。我建议您遍历所有col-元素,为它们设置0px 的宽度,并检查这是否影响了tdth 元素的宽度。如果是,这是相关列。

    例子:

    // Your table elements
    $table = $('yourTableSelector');
    $cell = $('td or th');
    $cols = $table.find('colgroup > col');
    
    // determine the related col
    // by setting a width of 0px. the 
    // resulting width on the element should be negative or zero.
    // this is hacky, but the other way would
    // be to resolve rowspans and colspans, which
    // would be incredibly complex.
    var $relatedColumn = $();
    $cols.each(function(){
        var $col = $(this);
        var prevStyle = $col.attr('style') === 'string' ? $col.attr('style'): '';
        $col.css('width', '0px');
        if($cell.width() <= 0){
            $relatedColumn = $col;
            $col.attr('style', prevStyle); // reset
            return false;
        } else {
            $col.attr('style', prevStyle); // reset
        }
    });
    

    【讨论】:

      【解决方案2】:

      &lt;td&gt;4&lt;/td&gt; 是第二个 tablerow 的第一个孩子,所以你确实应该得到第 0 列。

      与其详细说明检测行跨度等的复杂函数,不如只为每个表格单元格分配 ID,或者为您的表格创建另一个自定义解决方案。 例如您事先知道每个特定行有多少列?或者您使用实际的背景颜色或“秘密”css 属性作为标识。

      ps。我没用的fiddle,直到我理解了实际​​问题。

      编辑(阅读下面的讨论): 如here 所述,您不应该创建自定义 CSS 属性;这些通常会被浏览器忽略(并且不能通过.attr() 获得)。 Sahar 的解决方案是标记受行合并影响的每个元素,以记住该元素应计算多少列。

      【讨论】:

      • 事实上,我正在尝试创建一个 html 表构建器,当用户想要合并 td 1 和 2 和 4(或套索选择这些 tds)并且我不仅使用背景时,我遇到了这个问题颜色还可以使用 col 标签的一些自定义属性来定义数据结构。毕竟我相信有办法解决这个问题,因为当 td 知道它是 col(colgroup) 时,肯定有办法从 td 那里询问它。 (td4你表现出一个col的风格,那个col是谁?)
      • 确切地说,浏览器知道根据列应用什么样式,所以为什么不为每一列(除了颜色)创建一个特定的样式属性,这不会触发您的任何视觉变化,例如来自these 的任何包含数字并且可以
      • 你接受了我的回答(谢谢!)为了完整起见,请问你选择了什么css属性?
      • 我在 col 标签的样式属性中添加了一个自定义属性(例如 colName),td 继承了这个属性,所以我通过 IE 中的 currentStyle 和 firefox 中的 getComputedStyle() 知道每个 td 的 col。
      • 我会一直想一个更好的解决方案:它似乎在 Chrome 中不起作用,自定义属性经常被忽略,请参阅 here
      【解决方案3】:

      您首先必须计算 td 本身的列号。

      这是通过计算我们的 td 之前的 td 数量来完成的;考虑 colspan 属性:

      function getElementColumn(td)
      {
          var tr = td.parentNode;
          var col = 0;
          for (var i = 0, l = tr.childNodes.length; i < l; ++i) {
      
              var td2 = tr.childNodes[i];
      
              if (td2.nodeType != 1) continue;
              if (td2.nodeName.toLowerCase() != 'td' && td2.nodeName.toLowerCase() != 'th') continue;
      
              if (td2 === td) {
                  return col;
              }
              var colspan = +td2.getAttribute('colspan') || 1;
              col += colspan;
          }
      }
      

      然后您可以迭代col 元素并返回与列号匹配的元素。

      我们首先要找到 colgroup 元素。那么就类似于计算td的列号:

      function getCol(table, colNumber)
      {
          var col = 0;
          var cg;
          for (var i = 0, l = table.childNodes.length; i < l; ++i) {
              var elem = table.childNodes[i];
              if (elem.nodeType != 1) continue;
              if (elem.nodeName.toLowerCase() != 'colgroup') continue;
              cg = elem;
              break;
          }
          if (!cg) return;
      
          for (var i = 0, l = cg.childNodes.length; i < l; ++i) {
              var elem = cg.childNodes[i];
              console.log(elem);
      
              if (elem.nodeType != 1) continue;
              if (elem.nodeName.toLowerCase() != 'col') continue;
      
              if (col == colNumber) return elem;
      
              var colspan = +elem.getAttribute('span') || 1;
              col += colspan;
          }
      }
      

      有了这两个功能,你应该可以做到:

      var id = getCol(table, getElementColumn(td)).id;
      

      http://jsfiddle.net/wHyUQ/1/

      jQuery 版本

      function getElementColumn(td)
      {
          var col = 0;
          $(td).prevAll('td, th').each(function() {
              col += +$(this).attr('colspan') || 1;
          });
          return col;
      }
      
      function getCol(table, colNumber)
      {
          var col = 0, elem;
          $(table).find('> colgroup > col').each(function() {
              if (colNumber == col) {
                  elem = this;
                  return false;
              }
              col += +$(this).attr('span') || 1;
          });
          return elem;
      }
      

      http://jsfiddle.net/wHyUQ/2/

      【讨论】:

      • 我对colspan没有问题,我的问题是rowspan。如果您考虑我的示例并在您共享的链接中检查它,它会说 col0 for td 4 所以这是错误的。
      • 哇,它比我想象的要复杂得多,只需找到 col 对应的 td
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      相关资源
      最近更新 更多