检索多个数据属性并将其设置为子元素的文本
Retrieving multiple data-attributes and setting as text of a child element
底线:
我在检索多个数据属性的值并将它们作为子元素的文本插入时遇到了麻烦。
细节:
我有一个table
,每个tr
"桶"包含特定数量的三种形状(球体,立方体,金字塔),它们存储在data-attribute
s中。每种形状都有ul
和相应的li
。当一个形状被选中时,该形状的tr
大于0会被高亮显示。然而,我也试图检索每个选定形状的数字,并在每个tr
的td.contents
元素中显示它。"金字塔:300,立方体:50"),这是我没有成功的。
这是HTML -
<ul>
<li data-shape="spheres">spheres</li>
<li data-shape="cubes">cubes</li>
<li data-shape="pyramids">pyramids</li>
</ul>
<table>
<tr data-spheres="380" data-cubes="0" data-pyramids="200"><td>bucket 1</td><td class="contents">no shapes selected</td></tr>
<tr data-spheres="0" data-cubes="90" data-pyramids="0"><td>bucket 2</td><td class="contents">no shapes selected</td></tr>
<tr data-spheres="100" data-cubes="20" data-pyramids="400"><td>bucket 3</td><td class="contents">no shapes selected</td></tr>
<tr data-spheres="500" data-cubes="110" data-pyramids="0"><td>bucket 4</td><td class="contents">no shapes selected</td></tr>
</table>
和JS(第22行是我遇到麻烦的地方)-
(function() {
//store tr elements
var buckets = $('tr');
$('li').click(function () {
//toggle checked class OK
$(this).toggleClass('checked');
//reset classes and .contents text OK
$(buckets).removeClass('active');
$('td.contents').text('no shapes selected');
//map the shape data attribute for all li elements
//with class '.checked' OK
var checkedShapes = $('.checked').map(function() {
return $(this).data('shape');
});
//for each checked shape, filter tr elements with
//more than 0 of that shape OK
$.each(checkedShapes, function( index, value ) {
var filteredBuckets = $(buckets).filter(function() {
return $(this).data(value) > "0";
});
//add .active class to those tr elements OK
$(filteredBuckets).addClass('active');
//get number of checked shapes (i.e. "pyramids: 300, cubes: 50")
//and display in td.contents DOESN'T WORK
$('tr.active td.contents').text($(this).parent('tr').data(value));
});
});
})();
和一个jsFiddle: http://jsfiddle.net/a8gtrn63/33/
从我在.data()
的文档中所理解的,这应该是检索选定的数据属性,但它不是。我认为value
参考可能有问题,但我很难看到它。
$(this)指的是$。每个循环而不是文本,所以我通过遍历元素来修复它,然后使用$(this):
(function() {
//store tr elements
var buckets = $('tr');
$('li').click(function () {
//toggle checked class OK
$(this).toggleClass('checked');
//reset classes and .contents text OK
$(buckets).removeClass('active');
$('td.contents').text('no shapes selected');
//map the shape data attribute for all li elements
//with class '.checked' OK
var checkedShapes = $('.checked').map(function() {
return $(this).data('shape');
});
//for each checked shape, filter tr elements with
//more than 0 of that shape OK
$.each(checkedShapes, function( index, value ) {
var filteredBuckets = $(buckets).filter(function() {
return $(this).data(value) > "0";
});
//add .active class to those tr elements OK
$(filteredBuckets).addClass('active');
//get number of checked shapes (i.e. "pyramids: 300, cubes: 50")
//and display in td.contents DOESN'T WORK
$('tr.active td.contents').each(function(){
$(this).text($(this).parent('tr').data(value));
});
});
});
})();
你的代码应该是这样的:
(function() {
//store tr data-attributes
var buckets = $('tr');
$('li').click(function () {
//toggle checked class
$(this).toggleClass('checked');
//reset classes and .contents text
$(buckets).removeClass('active');
$('td.contents').text('no shapes selected');
//map the shape data attribute for all li elements with class '.checked'
var checkedShapes = $('.checked').map(function() {
return $(this).data('shape');
});
//for each checked shape, filter tr elements with more than 0 of that shape
$.each(checkedShapes, function( index, value ) {
var filteredBuckets = $(buckets).filter(function() {
return $(this).data(value) > "0";
});
//add .active class to those tr elements
$(filteredBuckets).addClass('active');
//get number of checked shapes and display in td.contents
//$('tr.active td.contents').text($(this).parent('tr').data(value));
$(filteredBuckets).each(function() {
var currentText = $($(this).find("td")[1]).text();
if (currentText.indexOf(":") === -1) {
$($(this).find("td")[1]).text(value + ": " + $(this).data(value));
} else {
$($(this).find("td")[1]).text($($(this).find("td")[1]).text() + ", " + value + ": " + $(this).data(value)); }
});
});
});
})();
说明:您需要迭代filteredBuckets
并为每个元素设置所需的文本。如果它已经有一些形状数据,那么我们附加新的形状数据,如果没有以前的形状数据,那么我们替换旧的文本到新的形状数据
相关文章:
- 识别切换条元素文本并在量角器中单击它
- 数组函数不适用于从元素文本创建的JavaScript数组
- 将元素文本替换为子项中的值
- 如何在不丢失格式的情况下连续淡入() 元素文本的每个字符,包括嵌套元素
- 使用 jQuery 从目标页面而不是当前页面获取元素文本
- 使用jquery为html元素文本的每个字符设置动画
- regex替换元素文本
- 在 Firefox 中单击鼠标时无法选择所有输入元素文本
- 如何确定 HTML 元素文本中“新行”的位置
- 在量角器中将元素文本转换为对象
- 无法使用 jquery 获取 xml 元素文本值
- jQuery - 仅获取父元素文本,而不获取子元素文本
- 单击其他元素(文本输入)时显示下拉列表
- 使用自定义绑定更新元素文本
- Android驱动程序的scrollTo和scrollToExact 方法的问题.方法不会滚动到所需的元素文本,而是滚动
- 选择元素文本并添加逗号
- 获取不带 html 标记的页面元素文本,但保留换行符
- 删除元素文本中的最后一个字符
- 如何按顺序获取所有元素文本
- 使用AngularJS将元素文本复制到title属性的干净方法