方法作为事件处理程序回调传递时失败

时间:2014-08-05 19:38:14

标签: jquery

这里有什么我做错了吗?

$('#cancelEdit').on('click', 'button', null, app.core.toggleFilterNavForSummary);

奇怪的是,当我以这种方式运行它时,

$('#cancelEdit').on('click', 'button', function(){
    app.core.toggleFilterNavForSummary();
});

是我试图传递处理程序或回调本身的问题吗?

我可以这么说,回调有一个参数,它寻找传入,如果它为null,那么它会做一些不同的事情。但如果您注意到上述情况,则两者都为空。

继承了大部分回调处理程序

core.toggleFilterNavForSummary = function(criteria){

    var $liElem,
        text,
        criteria = criteria || null,
        parent =  $('#filterSelectedList'),
        ulBox = $('#filterCriteria'),
        editButton = $('#reviseSearch'),
        nav = $('#filterNav');

    parent.collapse('show'); //alt -  parent.hide();
    nav.collapse('hide'); //hide filter dropdown, then show criteria summary


    if(criteria){

        //empty first li in filter criteria list, and remove everything AFTER it.
        ulBox.find('li:first-child').empty().nextAll().addClass('hidden');

        //now loop selected filter criteria and append html to display
        $.each(criteria,function(index,value){

            if(index == 'a'){ 

                var $liElem = ulBox.find('.a'),
                    text = $liElem.data('text'),
                    capitalized = value.charAt(0).toUpperCase() + value.substring(1).toLowerCase();

                $liElem.empty().append(text + capitalized);

            } else if (index == 'b') {

                var $liElem = ulBox.find('.b');
                $liElem.empty().append(value).removeClass('hidden');

            } else if (index == 'c') {

                $liElem = ulBox.find('.c');
                $liElem.empty().append(value).removeClass('hidden');

            } 

        });
    }

    ulBox.removeClass('hidden');
    editButton.removeClass('hidden');

    // unhidde result-dashboard
    $('#result-dashboard').removeClass('hidden');

    // unhide results
    $('#results').removeClass('hidden');
}

问题是,当我使用上面的第一个表单将其作为null传递时,它实际上不是null,它会以此形式返回

 Object { originalEvent=Event click, type="click", timeStamp=18446744071694688000, more...}

1 个答案:

答案 0 :(得分:1)

将函数作为处理函数传递时,参数不会被定义。事件处理程序接收一个参数Event对象。因此,您需要使用匿名函数包装器来阻止将该参数传递给您的方法。

如果您不想这样做,可以使用

中的一种技巧

How to determine if Javascript object is an event?

确定criteria是否为事件:

criteria = criteria || null;
if (typeof criteria == "object" && isEvent(criteria)) {
    criteria = null;
}