Как я могу найти нижнюю правую ячейку в таблице с помощью jQuery?

Я хочу выбрать самую правую, самую нижнюю ячейку в <table>, используя jQuery.

Это не так просто, как $('#tableId td').last(), потому что ячейка может занимать несколько строк.

Он также должен обрабатывать ячейки <th>.

Здесь моя попытка:

function fixLastCell($table){        
    var $lastCell = $table.find('td,th').last();        
    $lastCell.css('background-color', 'red');
}

fixLastCell($('#t0'));
fixLastCell($('#t1'));
fixLastCell($('#t2'));
fixLastCell($('#t3'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<table id="t0" border="1" width="200">
    <tr><td>1</td><td>2</td></tr>
    <tr><td>3</td><td>4 - ok</td></tr>
</table>
<p>
<table id="t1" border="1" width="200">
    <tr><td>1</td><td rowspan="2">2<br> this one is</td></tr>
    <tr><td>3 <br/>this isn't the cell you're looking for</td></tr>
</table>
<p>
<table id="t2" border="1" width="200">
    <tr><th>TH1</th><th>TH2 - ok</th></tr>
</table>
<p>
    <table id="t3" border="1" width="200">
    <tr><th>TH1</th><th rowspan="2">TH2</th></tr>
    <tr><td>3 <br/>still wrong</td></tr>
</table>

Ответ 1

Сложнее проверить атрибут "rowspan" . В зависимости от успеха поиска, вы меняете значение "$ lastcell".

https://jsfiddle.net/8j9jybm8/2/

function fixLastCell($table){
    
 var $lastCell = $table.find('td[rowspan],th[rowspan]').last();
 var $lastCell2 = $table.find('td,th').last();
    
  if($lastCell.index() <= $lastCell2.index()){
    $lastCell = $lastCell2;
  }
    
   $lastCell.css('background-color', 'red');
}

fixLastCell($('#t0'));

fixLastCell($('#t1'));

fixLastCell($('#t2'));

fixLastCell($('#t3'));

fixLastCell($('#t4'));

fixLastCell($('#t5'));

fixLastCell($('#t6'));

fixLastCell($('#t7'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="t0" border="1" width="200">
    <tr><td>1</td><td>2</td></tr>
    <tr><td>3</td><td>4 - ok</td></tr>
</table>
<p>
<table id="t1" border="1" width="100">
    <tr><td>1</td><td rowspan="2">2</td></tr>
    <tr><td>3</td></tr>
    <tr><td>1</td><td>2</td></tr>
</table>
<p>
<table id="t2" border="1" width="100">
    <tr><th>TH1</th><th>TH2</th></tr>
</table>
<p>
 <table id="t3" border="1" width="100">
    <tr><th>TH1</th><th rowspan="2">TH2</th></tr>
    <tr><td>3</td></tr>
</table>
<p>
<table id="t4" border="1" width="200">
    <tr><td>1</td><td>2</td></tr>
    <tr><td>3</td><td>4 - ok</td></tr>
</table>
<p>
<table id="t5" border="1" width="200">
    <tr><td>1</td><td rowspan="2">2<br> this one is</td></tr>
    <tr><td>3 <br/>this isn't the cell you're looking for</td></tr>
</table>
<p>
<table id="t6" border="1" width="200">
    <tr><th>TH1</th><th>TH2 - ok</th></tr>
</table>
<p>
    <table id="t7" border="1" width="200">
    <tr><th>TH1</th><th rowspan="2">TH2</th></tr>
    <tr><td>3 <br/>still wrong</td></tr>
</table>

Ответ 2

Вот идея, получить позицию таблицы, добавить ширину и высоту, чтобы получить нижний правый угол таблицы.

Затем вычитайте границы и отступы и используйте elementFromPoint, чтобы получить ячейку в этой позиции, которая была бы самой правой правой ячейкой, всегда, независимо от порядка ячеек и т.д.

Что-то вроде этого

function fixLastCell($table){
    var offset = $table.offset();

    offset.left += ($table.width() - 
                    $table.css('border-right-width').replace(/[^-\d\.]/g, '') - 
                    $table.css('padding-right').replace(/[^-\d\.]/g, '')) - 1;

    offset.top  += ($table.height() - 
                    $table.css('border-bottom-width').replace(/[^-\d\.]/g, '') - 
                    $table.css('padding-bottom').replace(/[^-\d\.]/g, '')) -1;

    var $last = $(document.elementFromPoint(offset.left, offset.top));

    return $last.css('background-color', 'red');
}

FIDDLE

Другой вариант - проверить, имеет ли предыдущая ячейка значение в столбце 1 или больше, если оно, вероятно, совпадает с предыдущим, по крайней мере с разметкой, предоставленной в вопросе

function fixLastCell($table){
    var $cells    = $table.find('td,th');
    var $lastCell = $cells.last();
    var $prevCell = $cells.eq( $cells.index( $lastCell ) - 1 );

    $lastCell = $prevCell.attr('rowspan') > 1 ? $prevCell : $lastCell;

    $lastCell.css('background-color', 'red');
}

FIDDLE

Ответ 3

Я выбрал tds и ths в таблице с помощью rowspan и loop на них с .each(), и если у текущего есть после этого trs больше, чем rowspan, так что пренебрегайте им, выберите его.

Пример if rowspan=2, то, если после этого есть 2 tr тега, выберите последний td else, если есть один трёх тег, поэтому выберите currant td с rowspan

Вот как это сделать:

function fixLastCell($table){
    
    var $rowspan = $table.find('td[rowspan],th[rowspan]');
    var last=false;
    $rowspan.each(function(){
      crntTR=$(this).parent();
      var spans = $(this).attr('rowspan');
      for(var i =1;i<=spans;i++)
      {
         crntTR= crntTR.next('td,th');
      }
      console.log(crntTR.html());
      if( crntTR.html()== undefined)
        last = $(this);
    })
    var $lastCell = $table.find('td,th').last();
  if(last)
    $lastCell=last;
    
    $lastCell.css('background-color', 'red');
}

fixLastCell($('#t0'));

fixLastCell($('#t1'));

fixLastCell($('#t2'));

fixLastCell($('#t3'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<table id="t0" border="1" width="200">
    <tr><td>1</td><td>2</td></tr>
    <tr><td>3</td><td>4 - ok</td></tr>
</table>
<p>
<table id="t1" border="1" width="200">
    <tr><td>1</td><td rowspan="2">2<br> this one is</td></tr>
    <tr><td>3 <br/>this isn't the cell you're looking for</td></tr>
</table>
<p>
<table id="t2" border="1" width="200">
    <tr><th>TH1</th><th>TH2 - ok</th></tr>
</table>
<p>
    <table id="t3" border="1" width="200">
    <tr><th>TH1</th><th rowspan="2">TH2</th></tr>
    <tr><td>3 <br/>still wrong</td></tr>
</table>

Ответ 4

Сделайте что-нибудь подобное,

function find($table) {
  var $element, j = -1,
    span;
  $table.find('tr').each(function(i, el) {
    if (j < i) {
      span = $(el).children('td,th').last().attr('rowspan');
      j = span ? parseInt(span, 10) + i + j : j;
      $element = $(el).children('td,th').last();
    }
  });
  return $element;
}

function fixLastCell($table) {
  var $lastCell = find($table);
  $lastCell.css('background-color', 'red');
}

fixLastCell($('#t0'));
fixLastCell($('#t1'));
fixLastCell($('#t2'));
fixLastCell($('#t3'));
fixLastCell($('#t4'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<table id="t0" border="1" width="200">
  <tr>
    <td>1</td>
    <td>2</td>
  </tr>
  <tr>
    <td>3</td>
    <td>4 - ok</td>
  </tr>
</table>
<table id="t1" border="1" width="200">
  <tr>
    <td>1</td>
    <td rowspan="2">2
      <br>this one is</td>
  </tr>
  <tr>
    <td>3
      <br/>this isn't the cell you're looking for</td>
  </tr>
</table>
<table id="t2" border="1" width="200">
  <tr>
    <th>TH1</th>
    <th>TH2 - ok</th>
  </tr>
</table>
<table id="t3" border="1" width="200">
  <tr>
    <th>TH1</th>
    <th rowspan="2">TH2</th>
  </tr>
  <tr>
    <td>3
      <br/>still wrong</td>
  </tr>
</table>


<table id="t4" border="1" width="200">
  <tr>
    <th>TH1</th>
    <th rowspan="3">TH2</th>
  </tr>
  <tr>
    <td>3
      <br/>still wrong</td>
  </tr>
  <tr>
    <td>3
      <br/>still wrong</td>
  </tr>
  <tr>
    <td>3
      <br/>still wrong</td>
    <td>last</td>
  </tr>
</table>

Ответ 5

Я думаю, что этот селектор будет работать

    function fixLastCell($table){   
    var $lastCell = $table.find("tr td[rowspan]:last,tr th[rowspan]:last");

    if($lastCell.length===0){
        $lastCell = $table.find("tr:last td:last,tr:last th:last");
    }

    $lastCell.css('background-color', 'red');

}