Javascript 在jQuery中控制顺序触发的单击UI事件

Javascript 在jQuery中控制顺序触发的单击UI事件,javascript,jquery,events,Javascript,Jquery,Events,我有一个,它通过jQuery的绑定了一个click处理程序。然后根据其状态执行一些计算: $(':checkbox').click(function () { if (this.checked) { console.log("ACTIVE"); } else { console.log("INACTIVE"); } }); 在UI中这一切都很好,但是,在我的单元测试中,我希望模拟单击此元素,并确保运行正确的代码 $(testElement

我有一个
,它通过jQuery的
绑定了一个click处理程序。然后根据其状态执行一些计算:

$(':checkbox').click(function () {
    if (this.checked) {
        console.log("ACTIVE");
    } else {
        console.log("INACTIVE");
    }
});
在UI中这一切都很好,但是,在我的单元测试中,我希望模拟单击此元素,并确保运行正确的代码

$(testElement).click();
问题是处理程序在默认浏览器操作之前调用,因此
this.checked的值被反转。也就是说,只有在我的处理程序运行之后,它才会检查其
属性

这有什么办法吗?有没有其他我可以参加的活动?是否有其他方式以编程方式触发单击?

试试看

$(":checkbox").change(function(){
    if($(this).is(":checked")){
        console.log("ACTIVE");
    } else {
        console.log("INACTIVE");
    }
});

$(":checkbox").attr("checked", true).change();
试一试

考虑到这一点,您可以通过执行以下操作来获得您所看到的行为:

$( ":checkbox" )[ 0 ].checked = !$( ":checkbox" )[ 0 ].checked;
$(":checkbox" ).triggerHandler( "click" );
使用,您将只触发由jQuery绑定的事件,而不是默认行为

编写示例。

查看此示例,您可以通过执行以下操作获得您正在查看的行为:

$( ":checkbox" )[ 0 ].checked = !$( ":checkbox" )[ 0 ].checked;
$(":checkbox" ).triggerHandler( "click" );
使用,您将只触发由jQuery绑定的事件,而不是默认行为


编写示例。

为什么要用测试jQuery来增加单元测试的负担?对于普通的东西,直接在匿名函数中使用代码;对于更重要的东西,使用可以独立进行单元测试的单独函数

大概是这样的:

$(':checkbox').click(function () { checkboxClickHandler($(this)); });
在单元测试中:

checkboxClickHandler($(':checkbox'));
你的职能是:

function checkboxClickHandler(element)
{
    alert(element.is(':checked'));
}

为什么要用测试jQuery来增加单元测试的负担?对于普通的东西,直接在匿名函数中使用代码;对于更重要的东西,使用可以独立进行单元测试的单独函数

大概是这样的:

$(':checkbox').click(function () { checkboxClickHandler($(this)); });
在单元测试中:

checkboxClickHandler($(':checkbox'));
你的职能是:

function checkboxClickHandler(element)
{
    alert(element.is(':checked'));
}

这实际上不会更改复选框的状态。这实际上不会更改复选框的状态。是的,但首先很难获得对确切函数的引用,其次,这对回归测试没有帮助。我想看看是否有其他代码添加了影响我的程序的另一个处理程序。是的,但首先很难获得精确函数的引用,其次,这对回归测试没有帮助。我想看看是否有其他代码添加了影响我的程序的另一个处理程序。