1

如何防止此函数再次调用自身:

$(document).ready(function() {  
    login();
});

function login() {
    $('#login').hide();
    $('#pre-login button').on('click',function(event) {
        $('#pre-login').hide();
        $('#login').show();
        $('#login :text').focus();
        return false;
    });
}

我有这两种形式:

<form id="pre-login"><p>Already have an account?</p><button type="submit">Login</button></form>
<form id="login">
    <input type="text" placeholder="Email Address" class="login">
    <input type="password" placeholder="Password" class="login"><h4><a href="#">Forgot?</a></h4>
    <button type="submit" class="action">Login</button>
</form>

第一个表单在页面加载后显示,而第二个表单设置为隐藏。单击第一个表单上的登录按钮后,将显示第二个表单,将第一个表单隐藏。但是,单击第二个表单上的登录按钮会导致相反的效果,即使我告诉 jQuery 仅在单击#pre-login 表单的按钮时调用该函数。

我无法确定这里发生了什么,所以我想也许最好在调用一次后禁用该功能。

4

3 回答 3

4

您可以使用one方法:

将处理程序附加到元素的事件。每个元素最多执行一次处理程序。

function login() {
    $('#login').hide();
    $('#pre-login button').one('click',function(event) {
        $('#pre-login').hide();
        $('#login').show();
        $('#login :text').focus();
        return false;
    });
}
于 2012-09-21T21:39:48.167 回答
3

你确定是Javascript导致你看到的吗?我在一个基本的jsFiddle中进行了设置,看起来第二个登录按钮只是重新加载页面(并向其提交登录表单数据),从而将其重置为初始状态。这将使它看起来像 Javascript 正在重新隐藏自己,但实际上它只是按照您告诉它的操作 - 即开始隐藏。

如果您要使用 Javascript,请务必使用 Firefox 中的 Firebug 或 Chrome 的开发者工具——它们非常适合单步执行 Javascript 和监控请求以查看正在发生的事情。

我的猜测是,当您进行额外的检查以接受登录并在用户登录时显示“登录”消息时,一切都会按预期工作。

于 2012-09-21T21:56:34.657 回答
1

您可以使用 .one() 。这确保事件只执行一次..

$(document).ready(function() {  
    login();
});

function login() {
    $('#login').hide();
    $('#pre-login button').one('click',function(event) {
        $('#pre-login').hide();
        $('#login').show();
        $('#login :text').focus();
        return false;
    });
}

// 也可以在点击事件执行时解除绑定..

function login() {
        $('#login').hide();
        $('#pre-login button').one('click',function(event) {
            $('#pre-login').hide();
            $('#login').show();
            $('#login :text').focus();
            $(this).unbind();
            return false;
        });
    }
于 2012-09-21T22:01:33.133 回答