调用jQuery函数后禁用它

时间:2012-09-21 21:38:19

标签: jquery html onclick

如何阻止此功能再次调用自身:

$(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仅在单击#precate登录表单的按钮时调用该函数。

我不能在这里做出正面或反面的事情,所以我想也许最好在调用一次后禁用该功能。

3 个答案:

答案 0 :(得分:4)

您可以使用one方法:

  

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

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

答案 1 :(得分:3)

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

如果你打算使用Javascript,请务必在Firefox中使用Firebug,或者使用Chrome的开发者工具 - 他们非常适合单步执行Javascript并监控请求以查看正在发生的事情。

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

答案 2 :(得分: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;
    });
}

//执行click事件时,你也可以取消绑定..

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