如何设置$ .fn。函数,所以它被调用时执行?

时间:2012-12-10 02:31:53

标签: javascript jquery

我有以下代码:

    function init() {
        var $contentButtonPanel: JQuery = $('#content-button-panel')
        $contentButtonPanel
            .find('.arbo .toggle, .collapsible-list li:has(ul) > :first-child, .collapsible-list li:has(ul) > :first-child + span')
            .click(function (event) {
                $(this).toggleBranchOpen();
            });
    }

    $.fn.toggleBranchOpen = function () {
        this.each(function () {
            $(this).closest('li').toggleClass('closed');
        });
        return this;
    };

当我调试时,我可以看到$(this).toggleBranchOpen();到达线。但是代码不会进入该函数。

这是否与声明toggleBranchOpen的方式有关?请注意,使用toggleBranchOpen的唯一时间是在init函数click事件中。我可以将该代码移动到init中并简化操作吗?

2 个答案:

答案 0 :(得分:1)

请尝试以下代码:

function init() {
    $('#content-button-panel')
        .find('.arbo .toggle, .collapsible-list li:has(ul) > :first-child, .collapsible-list li:has(ul) > :first-child + span')
        .click(function (event) {
            $(this).closest('li').toggleClass('closed');
        });
}

由于您表示您不需要全局函数,因此我尝试简化代码。

希望有所帮助。

答案 1 :(得分:0)

声明没问题。由于您正在修改jQuery的原型,因此它将立即可供所有jQuery对象使用。

这条线令我感到困惑,

var $contentButtonPanel: JQuery = $('#content-button-panel')

我认为这只是因为你正在从一个更大的文件中复制和粘贴。我唯一的建议是帮助识别问题,将一些调试信息放在这个循环中;

this.each(function () {
    $(this).closest('li').toggleClass('closed');
});

除此之外,您的选择器是否可能找不到任何li元素?