Javascript 在jquery中创建和调用函数

Javascript 在jquery中创建和调用函数,javascript,jquery,Javascript,Jquery,我是jquery新手,在构造函数时遇到了问题。 这件事我需要帮忙吗? 我不确定我是否用这个函数做了正确的事情 请解释我如何编写下一个函数,或者告诉我如何构建正确的语法 函数member.panel.init('login')没有执行正确的操作 member = {}; member.panel = function(){ return{ init: function(a) { $('#log_in .login').click(open_menu(a

我是jquery新手,在构造函数时遇到了问题。 这件事我需要帮忙吗? 我不确定我是否用这个函数做了正确的事情

请解释我如何编写下一个函数,或者告诉我如何构建正确的语法 函数member.panel.init('login')没有执行正确的操作

member = {};
member.panel = function(){
    return{
    init: function(a)
    {   
        $('#log_in .login').click(open_menu(a));
        $('#log_in .register').click(open_menu(a));
    },

    open_menu: function(what)
    {
         if(what!='login' || what!='register') what='login';
         $('#q_login_dialog #menu-'+what+'').addClass("q_dialog_panel_item_active");
         if(what=='login')
         {
            $('.q_dialog_content #dialog-form3').css("display", "none");
            $('.q_dialog_content #dialog-form2').css("padding-bottom", "20px");
            $(".login-box").fadeIn('fast'); 
         }
         if(what=='register')
         {
            $('.q_dialog_content #dialog-form2').css('display', '');
            $('.q_dialog_content #dialog-form3').css("padding-bottom", "20px");
            $(".login-box").fadeIn('fast'); 
         }   
    }
}
}();
$(function () {
   member.panel.init('login');
});
罗布·W是对的

仅供解释:.click()的第一个参数应该是函数引用。在您的代码中,第一个参数是对带有参数a的函数open_menu()的立即调用(!)的结果。仅当此调用的结果(返回值)是函数引用时,才会生成有效的.click()参数

如果将代码移动到一个匿名函数()中,如Rob W proposed,则会产生一个函数引用(指向此匿名函数),只有在触发click事件时才会执行该函数。

Rob W是正确的

仅供解释:.click()的第一个参数应该是函数引用。在您的代码中,第一个参数是对带有参数a的函数open_menu()的立即调用(!)的结果。仅当此调用的结果(返回值)是函数引用时,才会生成有效的.click()参数

如果将代码移动到一个匿名函数()中(如Rob W proposed),则会产生一个函数引用(指向此匿名函数),该引用仅在触发click事件时执行。

执行此操作时:

open_menu(a)
…您正在调用该函数。对于处理程序,您希望将函数传递给
click()
。按照您的操作方式,看起来您希望保留传递给
init
的值。这意味着您需要让
open_菜单
函数返回引用该值的函数

不幸的是,您没有显示一个名为
open\u menu
的函数,该函数可以通过这种方式访问。您的
open\u菜单
函数是一个对象的成员,因此您需要这样访问它

您的代码应该如下所示:

member = {};
member.panel = function () {
    return {
        init: function (a) { // use "this.open_menu" to refer to the function
            $('#log_in .' + a).click(this.open_menu(a));
        },
        open_menu: function (what) {

            // "open_menu" now returns a handler function that references "login"
            return function () {
                if (what != 'login' || what != 'register') what = 'login';
                $('#q_login_dialog #menu-' + what + '').addClass("q_dialog_panel_item_active");
                if (what == 'login') {
                    $('.q_dialog_content #dialog-form3').css("display", "none");
                    $('.q_dialog_content #dialog-form2').css("padding-bottom", "20px");
                    $(".login-box").fadeIn('fast');
                }
                if (what == 'register') {
                    $('.q_dialog_content #dialog-form2').css('display', '');
                    $('.q_dialog_content #dialog-form3').css("padding-bottom", "20px");
                    $(".login-box").fadeIn('fast');
                }
            };
        }
    }
}();
$(function () {
    member.panel.init('login');
    member.panel.init('register');
});
或者这里有一个更接近Rob W评论的替代方案,但修复了
open_菜单
函数引用

member = {};
member.panel = function () {
    return {
        init: function (a) {
            var self = this;
            $('#log_in .' + a).click(function() {
                self.open_menu(a); 
            });
        },

        open_menu: function (what) {
            if (what != 'login' || what != 'register') what = 'login';
            $('#q_login_dialog #menu-' + what + '').addClass("q_dialog_panel_item_active");
            if (what == 'login') {
                $('.q_dialog_content #dialog-form3').css("display", "none");
                $('.q_dialog_content #dialog-form2').css("padding-bottom", "20px");
                $(".login-box").fadeIn('fast');
            }
            if (what == 'register') {
                $('.q_dialog_content #dialog-form2').css('display', '');
                $('.q_dialog_content #dialog-form3').css("padding-bottom", "20px");
                $(".login-box").fadeIn('fast');
            }
        }
    }
}();
$(function () {
    member.panel.init('login');
    member.panel.init('register');
});
执行此操作时:

open_menu(a)
…您正在调用该函数。对于处理程序,您希望将函数传递给
click()
。按照您的操作方式,看起来您希望保留传递给
init
的值。这意味着您需要让
open_菜单
函数返回引用该值的函数

不幸的是,您没有显示一个名为
open\u menu
的函数,该函数可以通过这种方式访问。您的
open\u菜单
函数是一个对象的成员,因此您需要这样访问它

您的代码应该如下所示:

member = {};
member.panel = function () {
    return {
        init: function (a) { // use "this.open_menu" to refer to the function
            $('#log_in .' + a).click(this.open_menu(a));
        },
        open_menu: function (what) {

            // "open_menu" now returns a handler function that references "login"
            return function () {
                if (what != 'login' || what != 'register') what = 'login';
                $('#q_login_dialog #menu-' + what + '').addClass("q_dialog_panel_item_active");
                if (what == 'login') {
                    $('.q_dialog_content #dialog-form3').css("display", "none");
                    $('.q_dialog_content #dialog-form2').css("padding-bottom", "20px");
                    $(".login-box").fadeIn('fast');
                }
                if (what == 'register') {
                    $('.q_dialog_content #dialog-form2').css('display', '');
                    $('.q_dialog_content #dialog-form3').css("padding-bottom", "20px");
                    $(".login-box").fadeIn('fast');
                }
            };
        }
    }
}();
$(function () {
    member.panel.init('login');
    member.panel.init('register');
});
或者这里有一个更接近Rob W评论的替代方案,但修复了
open_菜单
函数引用

member = {};
member.panel = function () {
    return {
        init: function (a) {
            var self = this;
            $('#log_in .' + a).click(function() {
                self.open_menu(a); 
            });
        },

        open_menu: function (what) {
            if (what != 'login' || what != 'register') what = 'login';
            $('#q_login_dialog #menu-' + what + '').addClass("q_dialog_panel_item_active");
            if (what == 'login') {
                $('.q_dialog_content #dialog-form3').css("display", "none");
                $('.q_dialog_content #dialog-form2').css("padding-bottom", "20px");
                $(".login-box").fadeIn('fast');
            }
            if (what == 'register') {
                $('.q_dialog_content #dialog-form2').css('display', '');
                $('.q_dialog_content #dialog-form3').css("padding-bottom", "20px");
                $(".login-box").fadeIn('fast');
            }
        }
    }
}();
$(function () {
    member.panel.init('login');
    member.panel.init('register');
});

$('#登录.登录')。单击(打开菜单(a))
应该是
$('#log_in.login')。单击(function(){open_menu(a)})查看和。。。。您的问题与jQuery无关。
$('#登录.login')。单击(打开菜单(a))
应该是
$('#log_in.login')。单击(function(){open_menu(a)})查看和。。。。您的问题与jQuery无关。在我对Rob W进行了修改之后,我已经运行了代码,但仍然没有从函数中得到任何结果。@sorin:Rob W的注释几乎正确,但不完全正确。在中尝试代码。我提供了同一概念的两个变体。这两种方法都适用于您。在我对Rob W进行了修改之后,我已经运行了代码,但仍然没有从函数中得到任何结果。@sorin:Rob W的注释几乎正确,但不完全正确。在中尝试代码。我提供了同一概念的两个变体。这两种方法都适用于您。@sorin:是的,您的
init
中的代码不太正确。不要同时绑定两者,而是分别调用
init
,传递
'login'
然后
'register'
。但是首先删除
init
中的两行jQuery中的一行,并将另一行更改为:
$(“#登录”。+a)。单击(this.open_menu(a))$('#登录'.+a)。单击(function(){self.open_menu(a);})已更新。现在,您将
a
的值连接到jQuery选择器中,因此第一次调用的
'#登录'
,第二次调用的
'#登录.注册'
。非常感谢您的帮助。我已经照你说的做了,还将menu_open()中的if条件更改为if(what!=“login”&&what!=“register”)what=“login”@索林:啊,是的,我没发现。很高兴它对你有用。如果你还在,我有个问题!!如果我使用第二个例子,var self=this,为什么我要删除var selft并直接使用this.open_菜单(a)而不是self.open_菜单(a)函数没有运行correctly@sorin:是的,您的
init
中的代码不太正确。不要同时绑定两者,而是分别调用
init
,传递
'login'
然后
'register'
。但是首先删除
init
中的两行jQuery中的一行,并将另一行更改为:
$(“#登录”。+a)。单击(this.open_menu(a))$('#登录'.+a)。单击(function(){self.open_menu(a);})已更新。现在,您将
a
的值连接到jQuery选择器中,因此第一次调用的
'#登录'
,第二次调用的
'#登录.注册'
。非常感谢您的帮助。我已经照你说的做了,还将menu_open()中的if条件更改为if(what!=“login”&&what!=“register”)what=“login”@索林:啊,是的,我没发现。很高兴是这样