我有一个像这样的结构表:
<table>
<tbody>
for loop here
<tr>
<td>Item X Attribute 1</td>
<td>Item X Attribute 2</td>
<td><button name="test" onclick="display_variants()">Hide my kids</button></td>
</tr>
<tr>
<tbody class="variants_info">
<tr>
<td>Item X Variant 1</td>
<td>Item X Variant 2</td>
</tr>
</tbody>
</tr>
endfor loop
</tbody>
</table>
这样结构重复Y次。
我试图创建一个隐藏所选行tbody.variants
的脚本。
到目前为止我所拥有的是:
<script>
function display_variant(){
if($('.variants_info').is(":visible")){
$('.variants_info').hide();
}
else{
$('.variants_info').show();
}
}
</script>
但这隐藏了来自 ALL 行的变体。
有没有办法选择特定行的孩子?另外,如何从隐藏的tbody.variants
开始? (从我访问页面时开始)。
更新 我设法将结构更改为:
<table>
for loop
<tbody>
<tr>
<td>image for el 1</td>
<td>attr for el 1</td>
<td><button type='button' name='test'>Click Me</button></td>
</tr>
for loop
<tr class='variants_info'>
<td>variant1 for el 1</td>
<td>variant2 for el 1</td>
</tr>
endfor
</tbody>
endfor
</table>
更新2:实际代码是这一个:
<table class="pure-table pure-table-bordered">
<tbody>
{% for product in collection.products %}
{% if product.available %}
<tr class="{% cycle 'pure-table-odd', '' %}">
<td>
<img src="{{ product.featured_image.src | product_img_url: 'thumb' }}" alt="{{ product.featured_image.alt | escape }}" />
</td>
<td>{{ product.title }}</td>
<td style="text-align:right">
<button type="button" name="click_me">Click Me</button>
</td>
</tr>
{% for variant in product.variants %}
<tr>
<td>{{variant.title}}</td>
<td>{{variant.price | money }}</td>
</tr>
{% endfor %}
{% endif %}
{% endfor %}
</tbody>
</table>
<script>
$("td button").click(function(){
$(this).closest('tr').next().toggle();
})
</script>
我仍然无法让JS工作.. = /当前只能隐藏第一个变体(而不是点击按钮的所有变体)
答案 0 :(得分:4)
我建议使用类名标记包含产品的行,例如: “产品”,像这样:
<tr class="product {% cycle 'pure-table-odd', '' %}">
<td>
<img src="{{ product.featured_image.src | product_img_url: 'thumb' }}"
alt="{{ product.featured_image.alt | escape }}" />
</td>
<td>{{ product.title }}</td>
<td style="text-align:right">
<button type="button" name="click_me">Click Me</button>
</td>
</tr>
您不将该类添加到具有变体的行中。
然后在您的JavaScript中使用nextUntil
方法匹配所有下一个变体行(没有“product”类),直到但不包括下一个 product 行,并且将toggle()
方法应用于所有这些:
$("td button").click(function(){
$(this).closest('tr').nextUntil('.product').toggle();
});
您可以创建嵌套表,而不是单个表,每个产品对应一个表,包含变体。看起来有点像这样:
<table class="pure-table pure-table-bordered">
<tbody>
{% for product in collection.products %}
{% if product.available %}
<tr class="{% cycle 'pure-table-odd', '' %}">
<td>
<img src="{{ product.featured_image.src | product_img_url: 'thumb' }}"
alt="{{ product.featured_image.alt | escape }}" />
</td>
<td>{{ product.title }}</td>
<td style="text-align:right">
<button type="button" name="click_me">Click Me</button>
</td>
</tr>
<tr>
<table class="some other class specific for variants">
<tbody>
{% for variant in product.variants %}
<tr>
<td>{{variant.title}}</td>
<td>{{variant.price | money }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>
这有利有弊。主要缺点是这些子表的列未与主表中的列对齐。但这取决于你想要的......
然后,JavaScript代码必须与您原来的一样:
$("td button").click(function(){
$(this).closest('tr').next().toggle();
});
您还可以使用tbody
标记包装每个“部分”(包含一个产品行和属于它的变体行)。虽然不常见,但允许这样做MDN:
请注意,与
<thead>
,<tfoot>
和<caption>
元素不同,允许多个<tbody>
元素(如果是连续的),允许长表中的数据行分为不同的部分,每个部分根据需要单独格式化。
这与原始HTML不同,在原始HTML中,tbody
个元素作为tr
元素的子元素,这是无效的HTML。
看起来像这样:
<table class="pure-table pure-table-bordered">
{% for product in collection.products %}
{% if product.available %}
<tbody>
<tr class="{% cycle 'pure-table-odd', '' %}">
<td>
<img src="{{ product.featured_image.src | product_img_url: 'thumb' }}"
alt="{{ product.featured_image.alt | escape }}" />
</td>
<td>{{ product.title }}</td>
<td style="text-align:right">
<button type="button" name="click_me">Click Me</button>
</td>
</tr>
{% for variant in product.variants %}
<tr>
<td>{{variant.title}}</td>
<td>{{variant.price | money }}</td>
</tr>
{% endfor %}
</tbody>
{% endif %}
{% endfor %}
</table>
然后,您可以使用nextAll()
方法隐藏变体行,因为它们由下一个产品行中的tbody
包装分隔:
$("td button").click(function(){
$(this).closest('tr').nextAll().toggle();
});
如果您希望首先隐藏变体all,则将以下属性添加到HTML代码中的那些行:
<tr style="display:hidden">
您当然不会对产品行执行此操作。此外,您可能希望为此定义CSS类(例如tr.hidden { display:hidden; }
而不是style
。
jQuery toggle()
方法会在显示时覆盖此style
,并在隐藏时再次恢复。
答案 1 :(得分:3)
您的HTML
无效,因此您可以对其进行更改,然后使用此DEMO
$("td button").click(function() {
$(this).closest('tr').next().toggle();
})
答案 2 :(得分:1)
试试这个: -
$("td button").click(function() {
$(this).closest('tr').nextUntil("tbody").toggle();
});
jsfiddle演示链接是: - https://jsfiddle.net/Lg0wyt9u/776/