Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Перестановка tr (https://javascript.ru/forum/jquery/79769-perestanovka-tr.html)

shareware 22.03.2020 11:24

Перестановка tr
 
Добрый день.

Помогите доработать, пожалуйста..

Задача: необходимо все tr с классом premium поставить поверх tr с классом not.

Структура таблицы
<table style="border: 1px solid black">
<thead >
  <th>ID</th>
  <th>Имя</th>
  <th>Фамилия</th>
  
</thead>
<tbody >
  <tr class="not">
    <td>1</td>
    <td>Антоша</td>
    <td>Антоша</td>
      <tr class="not-child">
        <td colspan=2 style="text-align: center">Ne</td>
      </tr>
  </tr>
    <tr class="premium">
    <td>2</td>
    <td>Серега</td>
    <td>Кочегарин</td>
     <tr class="premium-child">
      <td colspan=2 style="text-align: center">premium</td>
    </tr>
  </tr>
    <tr class="not">
    <td>3</td>
    <td>Саня</td>
    <td>Жопин</td>
     <tr class="not-child">
      <td colspan=2 style="text-align: center">Ne</td>
    </tr>
  </tr>
    <tr class="premium">
    <td>4</td>
    <td>Ваня</td>
    <td>Жлобин</td>
     <tr class="premium-child">
      <td colspan=2 style="text-align: center">premium</td>
    </tr>
  </tr>
</tbody>
</table>


Имеющийся скрипт..each() не обязателен..игрался с вариантами прост
$('tbody').each(function() {
if ($('tr').hasClass('premium'))
{
    $('.not, .not-child').insertAfter('.premium + .premium-child');
}
});


Для одного любого tr с классом premium работает идеально, но если их двое и более - начинается мракобесие

laimas 22.03.2020 12:37

$('tr.premium').insertAfter('tbody')

voraa 22.03.2020 13:20

const body = document.querySelector('tbody');
body.querySelectorAll('tr.premium').forEach( tr => tbody.appendChild(tr) );
body.querySelectorAll('tr.not').forEach( tr => tbody.appendChild(tr) );

рони 22.03.2020 13:32

Цитата:

Сообщение от shareware
class="not-child"

Цитата:

Сообщение от shareware
class="premium-child"

может сначала исправить строки с этими классами?

shareware 22.03.2020 14:04

Цитата:

Сообщение от рони (Сообщение 521605)
может сначала исправить строки с этими классами?

Нужно начинать с исправления знаний о вложенных строках / таблицах.
Решение с другого ресурса + небольшая доработка.

var $tbody = $('#js-lower-not tbody');

$tbody.find('tr').not('.premium, tr.premium-child').each(function() {
  $tbody.append( $(this) );
});


Вопрос решен. Всем пытавшимся подсказать - спасибо от души :)

laimas 22.03.2020 15:32

shareware, если речь о JQ, то явный цикл совсем не нужен.

shareware 22.03.2020 15:48

Цитата:

Сообщение от laimas (Сообщение 521608)
shareware, если речь о JQ, то явный цикл совсем не нужен.

Хм..а как бы сделали Вы ? Подскажите, возьму на заметочку. Заранее благодарен за помощь в "становлении на путь истинный" :)

laimas 22.03.2020 16:35

Цитата:

Сообщение от shareware
Хм..а как бы сделали Вы ?

Выше показано - взять коллекцию нужных элементов и разместить их в нужном месте, а цикл, это уже заботы JQ.

shareware 22.03.2020 16:53

Цитата:

Сообщение от laimas (Сообщение 521612)
Выше показано - взять коллекцию нужных элементов и разместить их в нужном месте, а цикл, это уже заботы JQ.

Если вы про
Код:

$('tr.premium').insertAfter('tbody')
, то для моей задачи верно будет так, получается -
Код:

$('.premium, tr.premium-child').insertBefore('tbody')
..с афтером не сработало, но это скорее вина моего восприятия между befor'ом и after'ом

laimas 22.03.2020 18:09

Цитата:

Сообщение от shareware
для моей задачи верно будет так, получается

У вас ошибки в таблице, это прежде всего нужно исправить, не может быть в теге TR вложенных TR.

shareware 22.03.2020 19:35

Цитата:

Сообщение от laimas (Сообщение 521619)
У вас ошибки в таблице, это прежде всего нужно исправить, не может быть в теге TR вложенных TR.

Т.е по вашему разработчики, например, плагина tablesorter просто так решили несколько месяцев / лет назад взять и реализовать вложенные строки для своего детища зная о том, что внутри tr не может быть tr ? )

Это знаете..из разряда - не может быть вложенной table внутри table. Однако это есть и кто-то это практикует для своих задач. Тут та же ситуация. Поэтому говорить что это неправильно - некорректно. Вы же не знаете затеи, а потому.. )

рони 22.03.2020 20:04

Цитата:

Сообщение от shareware
Это знаете..из разряда

откройте панель инструментов и посмотрите структуру вашей таблицы, какая она на самом деле.

laimas 22.03.2020 20:43

Цитата:

Сообщение от shareware
не может быть вложенной table внутри table

Не может, только в td может быть вложена другая таблица, а в нее tr, а в ней td. Не городите отсебятины, достаточно добавить ячейкам вашей таблицы бордюр и сразу будет виден бардак.

Malleys 23.03.2020 00:24

Цитата:

Сообщение от shareware
Нужно начинать с исправления знаний о вложенных строках / таблицах.

Да, вы правы! Вы сами будете исправлять, или только другим советовать? (Другие-то уже разбираются, а вы до сих пор мучаетесь со строками таблицы, не понимая предназначение элемента <tr> — строки таблицы содержат ячейки)

В спецификации HTML описано, как используются строки таблицы — https://www.w3.org/TR/html52/tabular...the-tr-element

Проверяем... «хочу-хочу строчки таблички в другие строчки»
<table>
	<tr>
		<tr>
			<td>В браузере, совместимым со спецификацией HTML, этот фон будет розовым (а не зелёным), поскольку строки таблицы могут содержать в разметке только ячейки!</td>
		</tr>
	</tr>
</table>

<style>

tr {
	background: deeppink;
}

tr > tr {
	background: yellowgreen;
}
	
</style>
Как видите, в браузере таблица работает именно так, как описано в спецификации!

Цитата:

Сообщение от shareware
по вашему разработчики, например, плагина tablesorter просто так решили несколько месяцев / лет назад взять и реализовать вложенные строки для своего детища зная о том, что внутри tr не может быть tr ? )

Ничего подобного никогда не было сделано — для группировки в разметке элементов <tr> используется <tbody>. Читайте спецификацию — там всё описано. И вы неожиданно поймёте всё, что касается таблиц!

Запомните — строки таблицы содержат ячейки.

Цитата:

Сообщение от shareware
не может быть вложенной table внутри table

Да, в разметке не возможно сделать так... И на самом деле вам не нужно, поскольку данные содержатся в ячейках. Такой селектор не подходит не под один элемент, описанный в разметке — table > table

Цитата:

Сообщение от shareware
Однако это есть и кто-то это практикует для своих задач. Тут та же ситуация. Поэтому говорить что это неправильно - некорректно. Вы же не знаете затеи, а потому.. )

Да, более правильней — невозможно! Как вы уже знаете — в разметке такое описать невозможно! А вы говорите о каких-то сомнительных практиках — вас просто обманули!

shareware, у вас в таблице три столбца, но согласно использованию ячеек в вашем примере — вам следует добавить ещё один столбец! Для перемещения строк с определённым классом вы можете использовать СSS-свойство order. Например так...
<table>
	<thead>
		<th>ID</th>
		<th>Имя</th>
		<th>Фамилия</th>
		<th>premium</th>
	</thead>
	<tbody>
		<tr class="not">
			<td>1</td>
			<td>Антоша</td>
			<td>Антоша</td>
			<td>Ne</td>
		</tr>
		<tr class="premium">
			<td>2</td>
			<td>Серега</td>
			<td>Кочегарин</td>
			<td>premium</td>
		</tr>
		<tr class="not">
			<td>3</td>
			<td>Саня</td>
			<td>Жопин</td>
			<td>Ne</td>
		</tr>
		<tr class="premium">
			<td>4</td>
			<td>Ваня</td>
			<td>Жлобин</td>
			<td>premium</td>
		</tr>
	</tbody>
</table>

<style>

table {
	border-collapse: collapse;
}

tbody {
	display: grid;
}

tr {
	display: grid;
	grid-template-columns: 3em 1fr 1fr 1fr;
}

tr.premium {
	order: -1;
}

/* пример раскраски */

table {
	border: 1px solid black;
}

tbody {
	background: linear-gradient(to bottom, #f1f1f1 50%, #fff 0) 0 0 / 100% 4em;
}

tr {
	height: 2em;
	align-items: center;
}

td, th {
	padding: 0 1em;
}

td:first-child, td:last-child {
	text-align: center;
}
	
</style>

voraa 23.03.2020 08:37

Тут просто действует правило автозакрытия тегов.
Если при обработке тега tr встречается тег tr, то текущий автоматически закрывается и начинается новый
<!DOCTYPE html>
<html>
<head>
<style>
td {border: 1px solid blue;}	
table {border: 1px solid red;}	
</style>
</head>
<body>
<table>
	<tr> 
        <td> Это  строка 1</td>
        <!-- Подразумевается, что здесь стоит </tr> -->
		<tr>
			<td>Это  строка 2</td>
		</tr>
	</tr> <!-- Этот тег будет проигнорирован -->
</table>
</body>
</html>


Часовой пояс GMT +3, время: 06:04.