简体   繁体   English

如何调用嵌套在JQuery插件中的函数?

[英]How to call functions that are nested inside a JQuery Plugin?

My goal is to be able to call functions that are inside my JQuery plugin. 我的目标是能够调用我的JQuery插件中的函数。

What is the correct syntax? 什么是正确的语法?

For example, this does not work: 例如,这不起作用:

<a href="#" id="click_me">Click Me</a>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script>
(function($) { 
    $.fn.foo = function(options) {
        do_stuff = function(){
            console.log("hello world!"); // works
            do_other_stuff = function(){
            alert("who are you?");
            }
        } // function
    } // function
})(jQuery);

$("body").foo();

$("#click_me").click(function(){
$.fn.foo.do_stuff.do_other_stuff(); // doesn't work
});

</script>

when you assign functions to variables without the var keyword they either overwrite the local variable of that name or the are added to the global namespace. 当您为没有var关键字的变量分配函数时,它们会覆盖该名称的局部变量,或者将其添加到全局名称空间。 (so your do_stuff is a global function, which is not what you want) (所以你的do_stuff是一个全局函数,这不是你想要的)

one way to do what you want is to explicitly give where you want your function to reside. 做你想做的事情的一种方法是明确地给出你希望你的函数驻留的位置。

(function($) { 
    $.fn.foo = function(options) {
        // whatever $().foo() should do
    };

    $.fn.foo.do_stuff = function() {
        console.log("hello world!");
    };

    $.fn.foo.do_stuff.do_other_stuff = function(){
        alert("who are you?");
    };
})(jQuery);

Edit : 编辑

This works because all functions in javascript are objects, which means you can assign values to any arbitrary property. 这是有效的,因为javascript中的所有函数都是对象,这意味着您可以为任意属性赋值。

If you want to access the variables of other functions you can move the definitions inside of the other ones like: 如果要访问其他函数的变量,可以将定义移到其他函数中,如:

$.fn.foo.do_stuff = function() {
    console.log("hello world!");
    $.fn.foo.do_stuff.do_other_stuff = function(){
        alert("who are you?");
    };
};

but this will mean the function is only defined once you run the other function, and that each time you run the function it will overwrite the last definition. 但这意味着只有在运行其他函数时才会定义该函数,并且每次运行该函数时它都会覆盖最后一个定义。

Possibly a more ideal solution would be to have each function return an object containing the nested function like so: 可能更理想的解决方案是让每个函数返回一个包含嵌套函数的对象,如下所示:

(function($) { 
    $.fn.foo = function(options) {
        // whatever $().foo() should do

        var do_stuff = function(do_stuff_args) {
            console.log("hello world!");
            // do stuff with options and do_stuff_args

            var do_other_stuff = function(other_args) {
                alert("who are you?");
                // here you have access to options, do_stuff_args, and other_args
            };

            return {
                do_other_stuff: do_other_stuff
            };
        };

        return {
            do_stuff: do_stuff
        }
    };
})(jQuery);

and call it using 并使用它来调用它

foo().do_stuff(some_options).do_other_stuff(other_options);

or 要么

var a = foo(stuff).do_stuff(some_options);
a.do_other_stuff(foo);
a.do_other_stuff(bar);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM