我想使用javascript和jquery(1.9.1)实现可选部分的概念。
基本上,我有checkbox
启用或停用整个部分(div
)。
这里我有一个工作代码:
<div class="optional">
<span class="optional-activator">
<input type="checkbox" ></input>
</span>
<div class="optional-section">
<input type="text" value="sometext" />
</div>
</div>
和一个脚本:
$(function () {
$(".optional").each(function () {
var $this = $(this);
var activator = $this.find(".optional-activator :input");
var section = $this.find(".optional-section");
var sectionStateUpdate = function () {
if (activator.prop('checked')) {
section.find(":input").prop("disabled", false);
section.removeClass("inactive");
} else {
section.find(":input").prop("disabled", true);
section.addClass("inactive");
}
};
activator.change(sectionStateUpdate);
sectionStateUpdate();
});
});
这是按预期工作的。
但是,此代码不支持嵌套的可选节。启用较高的可选部分时,也会启用整个input
后代,而不是关于子部分中可能存在的内容。
例如,此代码段无法按预期运行:
<div class="optional">
<span class="optional-activator">
<input type="checkbox" />
</span>
<div class="optional-section">
<input type="text" value="sometext2" />
<div class="optional">
<span class="optional-activator">
<input type="checkbox" />
</span>
<div class="optional-section">
<input type="text" value="sometext3" />
</div>
</div>
</div>
</div>
如何更新代码以支持嵌套?
更确切地说,规则是:
我将这些片段写入jsfiddle code来说明我的行为。
答案 0 :(得分:0)
解决方案可见here。
基本上,这个想法是改变行为。现在有一种方法可以刷新整个页面部分的可用性。
当更改任何复选框时,将刷新整个部分,而不是仅刷新所选部分。
我的javascript就是:
$(function () {
var refresh = function () {
$(".optional").each(function () {
var $this = $(this);
var activator = $this.find(".optional-activator :input");
var section = $this.find(".optional-section");
if (activator.prop('checked')) {
section.find(":input").filter(":not(.optional-section)").prop("disabled", false);
section.removeClass("inactive");
} else {
section.find(":input").prop("disabled", true);
section.addClass("inactive");
}
});
};
$(".optional-activator :input").change(refresh);
refresh();
});
棘手的部分是在激活顶部时排除嵌套部分(请参阅.filter
的用法)