问题主要出现在这里:
$(".container").on("change", ".sub-btn", function() {
var t = $(this).closest(".sub-btn");
$(".menu-text").text(t.find("span").text());
var pathA = t.find("#patha").attr("d");
$(".pathainitial").attr("d", pathA);
var pathAc = t.find("#patha").attr("fill");
$(".pathainitial").attr("fill", pathAc);
});
更具体地说,
$(".menu-text")
和
$(".pathainitial")
包括所有匹配元素而不考虑其容器。
更新
以下是更新后的JS代码(不是全部代码,而只针对问题中的第一和第二点):
$(".type-list").on("click", ".sub-input", function() {
var t = $(this).closest(".sub-btn"),
m = t.closest('.type-list').prev('.menu'),
i, i2, tt, mt, tdiv, mdiv, tcat, io;
i = t.find('path:first-child');
tt = t.find('.sub-icon > b');
tdiv = t.parent('.sub-list');
tcat = tdiv.attr('data-for');
i2 = m.find('path:first-child');
mt = m.find('.sub-icon > b');
mdiv = m.children('.sub-item');
io = {
d: i2.attr('d'),
fill: i2.attr('fill'),
text: mt.text(),
cat: mdiv.attr('data-for')
};
mdiv.attr('data-for', tcat);
mt.text(tt.text());
i2.attr("d", i.attr('d'))
.attr("fill", i.attr('fill'));
tdiv.attr('data-for', io.cat);
tt.text(io.text);
i.attr('d', io.d)
.attr('fill', io.fill);
if (tcat !== io.cat) {
tdiv.removeClass('active');
tdiv.closest('.sub-item')
.removeClass(tcat)
.addClass(io.cat);
}
});
演示: https://codepen.io/anon/pen/xjNLdb
注意事项:
每个.sub-icon
的HTML应为:
<span class="sub-icon">
<svg ...></svg><br>
<b>Text here</b>
</span>
即将Text here
放在一个b
元素中。
.menu
中的.sub-item
应该有一个data-for
,其值为活动类别关键字/class
(例如: cat1
):
<div class="sub-item edit current" data-for="cat1">
...
</div>
在预选类别的.cat-dropdown-menu中,.cat-item应该在其class中有一个active;例如:
<label class="cat-item active" style="color:blue">
...
</label>