【问题标题】:Need checkbox change event to respond to change of checked state done programmatically需要复选框更改事件以响应以编程方式完成的选中状态更改
【发布时间】:2011-12-05 21:33:57
【问题描述】:

(jQuery 1.4.4) 我有一个复选框,它有一个 .change() 监听器,当用户单击复选框时它工作得很好,但现在当我以编程方式更改 jQuery 中的复选框时,我还需要它来触发,使用.attr('检查','检查')。我很高兴使用其他方法来完成这项工作。谢谢。

$('#foo').attr('checked', 'checked'); // programmatically change the checkbox to checked, this checks the box alright

$('#foo').change( function() {
  // this works when user checks the box but not when the above code runs
}

【问题讨论】:

    标签: jquery


    【解决方案1】:

    如果您使用 jQuery > 1.6,您可以通过定义 attrHook 来巧妙地做到这一点;

    jQuery.attrHooks.checked = {
        set: function (el, value) {
            if (el.checked !== value) {
                el.checked = value;
                $(el).trigger('change');
            }
        }
    };
    

    正如 cmets 中所指出的,如果新值与旧值相同,if 会避免触发 change 事件。

    ...虽然你真的应该使用prop(),所以应该是;

    jQuery.propHooks.checked = {
        set: function (el, value) {
            if (el.checked !== value) {
                el.checked = value;
                $(el).trigger('change');
            }
        }
    };
    

    你可以在这里看到这个工作; http://jsfiddle.net/2nKPY/

    对于 jQuery propHook),您可以做的最好的事情是覆盖 attr() 方法(或升级:));

    (function () {
        var existingAttr = jQuery.fn.attr;
    
        jQuery.fn.attr = function (attr) {
            var result = existingAttr.apply(this, arguments);
    
            if (result instanceof jQuery && attr == "checked") { // If we're dealing with a check-set operation.
                result.trigger('change');
            }
    
            return this;
        };    
    
    }());
    

    You can see this in operation here

    【讨论】:

    • 太好了!太糟糕了,它不适用于我的问题(我使用的是淘汰赛,它没有使用 jquery 设置属性)。反正将来可能有用
    【解决方案2】:

    怎么样:

    $('some selector').trigger('click');
    

    【讨论】:

    • 这是 IMO 的最佳选择。简单、干净和本地化。与 click() 不同,它没有任何奇怪的副作用,例如更改 dom 的状态。
    【解决方案3】:

    使用 jquery click() 更改复选框的状态,而不是更改其属性。

    没有你所有的标记我不确定这有多合适,但我最近使用这种方法效果很好。

    【讨论】:

    • 不会 click() 切换状态?无论当前状态如何,我都需要将复选框置于选中状态。
    • 是的,正如我所说,它的适用性取决于您的具体应用。您可以在运行它之前检测它的状态,但我不清楚确切的应用程序。
    【解决方案4】:

    这只会在checked的值实际改变时触发。在马特的回答中,即使为复选框分配了相同的值,它也会触发。

    $.propHooks.checked = {
        set: function (el, value) {
            if (el.checked !== value) {
                trigger = true;
            } else {
                trigger = false;
            }
            el.checked = value;
            if (trigger) {
                $(el).trigger('change');
            }
        }
    };
    

    【讨论】:

      【解决方案5】:

      我正在开发一个基于复选框状态交换图像的插件,我也遇到了这个问题。

      为了让我的问题复杂化,我正在使用的许多预先存在的代码(围绕工作?;))期望更改事件仅来自用户交互,因此当复选框应该以编程方式选中/取消选中时触发 click() 会导致触发其他 不应该的事件(这些其他处理程序应仅在 用户 更改值时运行)。

      我选择的解决方案是将我的图像更新处理程序绑定到“更改”事件我称为“updateicon”的自定义事件。然后,在propHooks.checked.set() 中,我触发了这个“updateicon”事件。这会导致图标更新程序以与用户单击输入时相同的方式更改图标,但 不会 导致先前绑定的更改/单击处理程序失灵。

      事件处理程序绑定:

      input.on("change updateicon", toggleIconVisibility);
      

      属性更改挂钩:

      jQuery.propHooks.checked = {
          set: function (el, value) {
              el.checked = value;
              $(el).trigger('updateicon');
          }
      };
      

      注意:在我最新的代码草稿中,我运行 $(el).filter(".iconified").trigger("updateicon"),以便仅在以下元素上触发“updateicon”被我的插件“图标化”了

      【讨论】:

        【解决方案6】:

        如果您有一个相对较新的 JQuery 版本,您可以使用 .prop() 函数以编程方式更改复选框:

        $(".myCheckbox").prop("checked", true);
        $(".myCheckbox").prop("checked", false);
        

        【讨论】:

        • 这仍然不会触发更改事件 - 您需要使用 $(".myCheckbox").prop("checked", true).trigger("change"); 或使用带有 attrhooks 的 Matts 代码
        猜你喜欢
        • 2020-04-20
        • 1970-01-01
        • 2014-09-25
        • 1970-01-01
        • 2016-11-05
        • 2013-05-29
        • 2021-12-19
        • 2012-01-15
        • 1970-01-01
        相关资源
        最近更新 更多