监视JQuery中的DOM更改

时间:2010-06-10 19:30:59

标签: jquery javascript-events

有没有办法检测输入的disabled属性何时在JQuery中发生变化。我想根据价值来切换风格。

我可以为每个更改事件复制/粘贴相同的启用/禁用代码(正如我在下面所做的那样)但我正在寻找更通用的方法。

我可以创建一个自定义事件来监控指定输入的已禁用属性吗?

示例:

 <style type="text/css">.disabled{ background-color:#dcdcdc; }</style>


<fieldset>
    <legend>Option 1</legend>
    <input type="radio" name="Group1" id="Radio1" value="Yes" />Yes
    <input type="radio" name="Group1" id="Radio2" value="No" checked="checked" />No
    <div id="Group1Fields" style="margin-left: 20px;">
        Percentage 1:
        <input type="text" id="Percentage1" disabled="disabled" /><br />
        Percentage 2:
        <input type="text" id="Percentage2" disabled="disabled" /><br />
    </div>
</fieldset>
<fieldset>
    <legend>Option 2</legend>
    <input type="radio" name="Group2" id="Radio3" value="Yes" checked="checked" />Yes
    <input type="radio" name="Group2" id="Radio4" value="No" />No
    <div id="Group2Fields" style="margin-left: 20px;">
        Percentage 1:
        <input type="text" id="Text1" /><br />
        Percentage 2:
        <input type="text" id="Text2" /><br />
    </div>
</fieldset>
<script type="text/javascript">
    $(document).ready(function () {

        //apply disabled style to all disabled controls
        $("input:disabled").addClass("disabled");

        $("input[name='Group1']").change(function () {
            var disabled = ($(this).val() == "No") ? "disabled" : "";
            $("#Group1Fields input").attr("disabled", disabled);

            //apply disabled style to all disabled controls
            $("input:disabled").addClass("disabled");

            //remove disabled style to all enabled controls
            $("input:not(:disabled)").removeClass("disabled");

        });
        $("input[name='Group2']").change(function () {
            var disabled = ($(this).val() == "No") ? "disabled" : "";
            $("#Group2Fields input").attr("disabled", disabled);

            //apply disabled style to all disabled controls
            $("input:disabled").addClass("disabled");

            //remove disabled style to all enabled controls
            $("input:not(:disabled)").removeClass("disabled");
        });           

    });
</script>

4 个答案:

答案 0 :(得分:4)

在进一步研究这个问题之后,我偶然发现了Rick Strahl的一篇博客文章,其中我们演示了一个允许监控CSS属性的jQuery插件:jQuery CSS Property Monitoring Plug-in updated

答案 1 :(得分:1)

虽然有更有效的方法来解决这个问题,但是处理这个问题的一种方法是每隔xx秒运行一个函数,它将在禁用的元素上设置所需的CSS类:

window.setInterval(1000,function() {
    $("input:disabled").addClass("disabled");
    $("input:enabled").removeClass("disabled");
});

这将每秒检查所有输入元素。但同样,这是一个非常糟糕的解决方案。重建代码会更好。

如果不改变你的代码和HTML,我会做这样的事情(尽管没有测试):

$("input[name^=Group]").change(function () {
        var disabled = ($(this).val() == "No") ? "disabled" : "";
        var groupName = $(this).attr("name");

        $("#" + groupName + "Fields input")
             .attr("disabled", disabled)
             .addClass("disabled");

        //remove disabled style to all enabled controls
        $("input:enabled)").removeClass("disabled");
    });

答案 2 :(得分:0)

我假设你想在同一个字段集中启用文本输入,是吗?试一试:

$('input[type="radio"]').change(function() {
  if (this.value == "No") {
    $('input[type="text"]', $(this).parents('fieldset')).attr('disabled', 'disabled');
  } else {
    $('input[type="text"]', $(this).parents('fieldset')).attr('disabled', '');
  }
});

答案 3 :(得分:0)

您可以利用您的布局,让所有处理程序相对查找,缩短所有当前代码:

$(function() {
    $("input:disabled").addClass("disabled");

    $(":radio").change(function() {
        var disabled = this.checked && this.value == "No";
        $(this).siblings("div").find("input")
            .attr('disabled', disabled)
            .toggleClass('disabled', disabled);
    });
});

You can view a demo here,因为您知道哪个类,元素以及您是否要打开或关闭它,您可以使用.toggleClass(class, bool)来缩短范围。如果您希望这更精确,可以为这些单选按钮指定一个类,例如:

<input type="radio" name="Group1" id="Radio1" value="Yes" class="toggler" />

然后你可以$(".toggler")而不是$(":radio"),同样适用于div,你可以给它一个班级而不是.siblings(".fields")而不是.siblings("div")。 ..重点是,如果您的布局是一致的,请在DRY coding时使用它。