【问题标题】:jQuery click checkbox doesn't check in firefoxjQuery单击复选框不检查Firefox
【发布时间】:2013-01-22 17:01:45
【问题描述】:

具体来说,输入类型复选框的内存 dom 不接收 FireFox 中的“已检查”属性(或任何其他已检查指示器)。

注释行可以取消注释以查看测试通过,但目前您会在 Firefox 中看到测试失败。

http://jsfiddle.net/mE3xb/2/

var cb = $('<input type="checkbox" />')
//var cb = $('input'); 
if (cb.is(':checked')) alert("checkbox says it's already checked"); 
cb.click(); 
if (cb.is(':checked')) alert("checkbox clicked correctly!"); 
else alert("fail!"); 

我在做非标准的事情吗?有什么建议吗?我基本上是依靠 jQuery .click 来实际检查 UI 中的复选框(我不想使用 .attr、.prop、.val,因为它会破坏我正在进行的良好封装。)

【问题讨论】:

    标签: jquery firefox


    【解决方案1】:

    由于您使用的是 jQuery 1.4.3,看起来您最好的选择是:

    cb[0].setAttribute('checked', 'checked'); // plain old vanilla JS
    

    jsFiddle Demo - 在 FireFox & Chrome & IE8 中测试

    .click() 在 Firefox 中的许多奇怪情况下都不起作用(它在该浏览器中本质上是错误/不同的)。我会假设因为它实际上在 DOM 上还不可用,所以它不知道这个事件会在哪里。这是.prop() 等存在的众多原因之一。

    【讨论】:

    • 更新了我对 jQuery 1.4.3 的回答
    • 问题的答案也是如此:'Firefox 以这样一种方式实现复选框,即 jQuery 的内存 DOM 无法在其上模拟 .click() 之类的东西?为什么它适用于所有其他浏览器?即使是最新版本的 jQuery 也不能在 FF 中运行。
    • 最后一次,我知道您可以使用 setAttribute、attr 等内容...我问的是 IN MEMORY DOM 中的 click() 在 FireFox 中不起作用。
    • 老实说,因为我的具体问题涉及所有版本的 jQuery,所以我拥有的 jQuery 版本无关紧要!
    • 嗯,你非常粗鲁......如果它不够明显...... .click() 在 Firefox 中的许多奇怪情况下不起作用(它本质上是错误/不同的浏览器)。我会假设因为它实际上在 DOM 上还不可用,所以它不知道这个事件会在哪里。这是.prop 等事物存在的众多原因之一。祝你好运
    【解决方案2】:

    使用cb.prop('checked', true) 而不是cb.click() 来检查您的复选框

    小提琴更新http://jsfiddle.net/mE3xb/7/

    【讨论】:

    • 我在 jquery 1.4.3 上并且 attr 确实有效。但是,这不是我正在寻找的解决方案。 FF 是唯一一个我的 click 方法不适用的浏览器,所以如果有任何方法可以让它在内存 dom 中工作,那就太棒了!)如果没有,正确的答案是“不”而不是你的有建议。
    • @mrjustinmooser 旁注:发布您下次使用的是非常旧版本的 jQuery。
    • 真的,我很抱歉 mcpDESIGNS! @Nico 我会试一试!
    • 触发器在 FireFox 中也不起作用。我相信没有办法完成我在 FireFox 中尝试做的事情,但我没有引用在 FireFox 上呈现的场景中 jQuery 的内存 dom 被破坏的具体原因。然而,这可能是 jQuery 无法解决的 FireFox 实现细节。
    【解决方案3】:

    我知道这是一个老问题,但我偶然发现了一个对我的单元测试有用的答案:

    首先,我切换选中的属性:

    checkbox4[0].checked = !checkbox4[0].checked;
    

    然后,我“仅”触发点击处理程序(通过使用 triggerHandler 它实际上并没有在其他浏览器上再次选中/取消选中该框)

    checkbox4.triggerHandler( "click" );
    

    这模拟用户“单击”复选框,然后选中/取消选中它。不像您希望的那样封装以满足您的需求(通过阅读上述 cmets 和答案),但它似乎比当前接受的答案做得更彻底。

    【讨论】:

    • 谢谢。 triggerHandler 为我做的。你能解释一下为什么 .click 不起作用吗?
    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 2018-06-17
    • 2017-04-20
    • 1970-01-01
    • 2010-12-03
    • 2013-06-21
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多