5

我有一个复杂的 jQuery 表单,如果选中某个复选框,我想禁用几个表单元素。我正在使用 jQuery 1.3.2 和所有相关插件。我在这里做错了什么?

这是我的 HTML:

    <li id="form-item-15" class="form-item">
        <div class='element-container'>
            <select id="house_year_built" name="house_year_built" class="form-select" >
                 ...Bunch of options...
            </select>
            <input type="text" title="Original Purchase Price" id="house_purchase_price" name="house_purchase_price" class="form-text money" />
            <input type="text" title="Current Home Debt" id="house_current_debt" name="house_current_debt" class="form-text money" />
        </div>
        <span class="element-toggle">
            <input type="checkbox" id="house_toggle" />
            <span>Do not own house</span>
        </span>
    </li>

这是我的 jQuery:

$('.element-toggle input').change(function () { 
    if ($(this).is(':checked')) $(this).parents('div.element-container').children('input,select').attr('disabled', true);
    else $(this).parents('div.element-container').children('input,select').removeAttr('disabled'); }); 
4

4 回答 4

10

只是一个花絮:因为 jquery 1.6 你不应该使用$(this).attr('checked')它总是正确的,而是$(this).prop('checked').

也建议使用$(this).prop('disabled')(测试元素是否被禁用),$(this).prop('disabled', newState)而不是attr.

于 2011-12-16T22:50:53.413 回答
4

有几件事应该改变。首先,实际的 HTML 结构与您在 JavaScript 中查询的内容(特别是parents()调用)不匹配。其次,绑定到click事件将在 IE 中提供更好的支持,因为 IE 有时会等到change元素失去焦点后才触发事件。

$('.element-toggle input').bind('click', function () {
    var inputs = $(this).closest('li.form-item').find('div.element-container').children('input,select');

    if ($(this).attr('checked')) {
        inputs.attr('disabled', true);
    } else {
        inputs.removeAttr('disabled');
    }
});
于 2009-11-25T19:16:14.897 回答
1

那很有帮助。如果有人在寻找插件,请访问:http ://s.technabled.com/jquery-foggle

于 2011-01-30T23:53:45.557 回答
0

<div class='element-container'>不是父母$('.element-toggle input')是你的榜样

于 2009-11-25T19:10:10.233 回答