2

具体来说,输入类型复选框的内存 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,因为它会破坏我正在进行的良好封装。)

4

3 回答 3

4

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

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

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

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

于 2013-01-22T17:04:16.367 回答
3

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

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

于 2013-01-22T17:05:11.143 回答
1

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

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

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

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

checkbox4.triggerHandler( "click" );

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

于 2014-10-15T21:04:48.433 回答