JS -Jquery - 从Jquery插件中调用一个方法

时间:2013-02-13 13:41:05

标签: javascript jquery toggle accordion

我有一个非常实用的手风琴,来自我在其中一个旧的存档网站上找到的第三方脚本(因此不是我自己的编码)。

http://jsfiddle.net/obmerk99/Rm8Py/1/

现在,我不是一个Javascript人员,而且我想知道如何创建一个全局切换按钮,只需单击一下即可打开/关闭整个设置,从脚本内部调用方法是可能的。 我试着做

jQuery(this).accordion().activate(this, 'toggle', 'parents');

也只是

jQuery('ul').accordion().activate();

但由于我的JS技能接近于NULL,我似乎无法做到这一点......

有没有办法从这个函数中调用一些Inside方法,它将成为所有关卡和手风琴的全局切换触发器,而不必更改插件代码本身?

2 个答案:

答案 0 :(得分:1)

我不确定我理解;手风琴的全部意义在于,一次只打开一个窗格,切换代码强制执行该操作。修改该插件以在所有UL上调用其activate辅助函数并不难,但是当它打开每个窗格时,它将关闭所有其他窗格,从而踩踏自己。

此外,您不希望切换所有窗格,因为有些窗格是关闭的,有些窗格是打开的,因此切换每个窗格都无法使它们全局打开或关闭。

相反,你必须直接操纵DOM,绕过手风琴的逻辑。当您单击“切换”链接时,这将打开所有窗格:

jQuery("#toggle").click(function(){$("ul").slideDown()});

要实际切换,请尝试改为:

(function(){
    var isClosed = true;
    jQuery("#toggle").click(function(){
        if (isClosed) {
            jQuery("ul").slideDown();
        }
        else {
             jQuery("ul").find("ul").slideUp();
        }
        isClosed = !isClosed;
    });
})();

小提琴:http://jsfiddle.net/Rm8Py/2/

答案 1 :(得分:1)

activate实际上是一个私有函数,你无法在不更改插件代码的情况下从插件外部调用它。

要公开它,接受方法名称作为参数是很常见的。 (代码简化,通常更优雅。)

accordion: function(method, arg1, arg2, arg3) {
    return this.each(function () {
        if (method == "activate") {
            activate(arg1, arg2, arg3);
        }
       // ....
    })

您现在可以这样称呼它:

 myAccordion.accordion("activate", $("ul"))

插件代码被缩小(单字符变量名),所以我不确定activate函数期望的参数。