#jquery #html
#jquery #HTML
Вопрос:
У меня есть несколько таблиц, созданных из divs (по соображениям реагирования) на одной странице.
Затем я использую jquery для создания атрибута данных из заголовка таблицы, который добавляется в каждую ячейку таблицы. Этот атрибут данных позже используется в CSS content: attr(data-title);
, когда экран достигает 720 пикселей в качестве заголовка для каждой ячейки в таблице.
Моя проблема возникает, когда у меня есть несколько таблиц div, заголовок первой таблицы применяется ко всем видимым ячейкам таблицы.
Смотрите мой пример ниже
Я задавался вопросом, есть ли способ заставить функцию jquery применять содержимое заголовка из первой таблицы к каждой ячейке таблицы только в этой отдельной таблице. Тогда следующая таблица также будет получать только содержимое заголовков таблиц и так далее…
var $table_header = $('.tech-specs header.table-row .table-cell');
var $table_cell = $('.tech-specs div.table-row .table-cell:not(:empty)');
$table_cell.attr('data-title', function() {
var i = $(this).index();
return $table_header.eq(i).text();
});
.table {
display: table;
width: 100%;
}
.table-row {
display: table-row;
width: 100%;
}
header.table-row {
color: #fff;
font-size: 13px;
text-transform: uppercase;
background: #37bb1f;
}
.table-row > * {
display: table-cell;
padding: 20px 8px;
position: relative;
vertical-align: middle;
}
.table.seven-cells .table-cell {
width: 25%;
}
/* DEMO STUFF */
div.table-row > *:before {
content: attr(data-title)" : ";
}
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h4>This table should add data-title="HEADER 1.X"</h4>
<div class="table tech-specs four-cells">
<header class="table-row">
<div class="table-cell">HEADER 1.1</div>
<div class="table-cell">HEADER 1.2</div>
<div class="table-cell">HEADER 1.3</div>
<div class="table-cell">HEADER 1.4</div>
</header>
<div class="table-row">
<div class="table-cell">CPU</div>
<div class="table-cell">E3-1230</div>
<div class="table-cell">E3-1231v3</div>
<div class="table-cell">E3-1271v3</div>
</div>
<div class="table-row">
<div class="table-cell">Cores (threads)</div>
<div class="table-cell">4 (8)</div>
<div class="table-cell">4 (8)</div>
<div class="table-cell">4 (8)</div>
</div>
</div>
<h4>This table should add data-title="HEADER 2.X"</h4>
<div class="table tech-specs four-cells">
<header class="table-row">
<div class="table-cell">HEADER 2.1</div>
<div class="table-cell">HEADER 2.2</div>
<div class="table-cell">HEADER 2.3</div>
<div class="table-cell">HEADER 2.4</div>
</header>
<div class="table-row">
<div class="table-cell">Cisco Powered</div>
<div class="table-cell"><i class="fa fa-check"></i>
</div>
<div class="table-cell"><i class="fa fa-check"></i>
</div>
<div class="table-cell"><i class="fa fa-check"></i>
</div>
</div>
</div>
<h4>This table should add data-title="HEADER 3.X"</h4>
<div class="table tech-specs four-cells">
<header class="table-row">
<div class="table-cell">HEADER 3.1</div>
<div class="table-cell">HEADER 3.2</div>
<div class="table-cell">HEADER 3.3</div>
<div class="table-cell">HEADER 3.4</div>
</header>
<div class="table-row">
<div class="table-cell"><a href="#datacentre">100% owned London DC</a>
</div>
<div class="table-cell"><i class="fa fa-check"></i>
</div>
<div class="table-cell"><i class="fa fa-check"></i>
</div>
<div class="table-cell"><i class="fa fa-check"></i>
</div>
</div>
</div>
Ответ №1:
Всегда работайте в контексте внешнего родительского элемента. find()
и closest()
чрезвычайно полезны для такого рода ситуаций
$('.tech-specs').each(function(){
var $table = $(this); // instance of table component
// table instance specific elements
var $table_header = $table.find('header.table-row .table-cell');
var $table_cell = $table.find('div.table-row .table-cell:not(:empty)');
$table_cell.attr('data-title', function() {
var i = $(this).index();
return $table_header.eq(i).text();
});
});
Комментарии:
1. Спасибо, абсолютно идеально.