【问题标题】:Javascript - waiting for a click before ending functionJavascript - 在结束功能之前等待点击
【发布时间】:2011-02-04 21:33:31
【问题描述】:

我制作了一个基本上是灯箱的东西,如果更改需要用户确认他们的密码,这个灯箱会弹出,用户在那里输入密码等。

我正在触发这样的功能:

if(verifyPassword())
{
    //apply change
}

验证函数为:

function verifyPassword() {
$('#confirmpasswordoverlay').fadeIn(300);

$('#submit').click(function() {
    $.post('', { password: $('input[name=password]').val() }, 
            function(check) {
                if(check.error)
                {
                    if(check.password)
                    {
                        //show password error
                        return false;
                    }
                    else
                    {
                        //show error
                        return false;
                    }
                }
                else
                {
                    return true;
                }
            }, 'json');
});

}

基本上我需要该函数等到单击#submit 以返回真或假。

提前致谢

【问题讨论】:

    标签: php javascript jquery html json


    【解决方案1】:

    从 jQuery 1.5.0 开始,您可以使用 Deferred objects 应用一些魔法:

    $.when( verifyPassword() ).done(function() {
        // do something
    });
    

    您需要稍微重写verifyPassword()

    function verifyPassword() {
        var Notify = $.Deferred();
        $('#confirmpasswordoverlay').fadeIn(300);
    
        $('#submit').click(function() {
            $.post('', { password: $('input[name=password]').val() }, 
                    function(check) {
                        if(check.error) {
                            if(check.password) {
                                //show password error
                                Notify.resolve();
                            }
                            else {
                                //show error
                                Notify.reject();
                            }
                        }
                        else {
                            return true;
                        }
                    }, 'json');
            });
    
        return Notify.promise();
    }
    

    这可能不是在这里实现目标的最优雅的方式,我只是说你可以以这样的方式做到这一点:-)

    【讨论】:

    • 我回家后测试了这个,从来不知道这个技术。看起来很有趣。
    • 谢谢,这正是我想要的!但有一件事,如果用户输入错误的密码并再次点击,它将不会运行原始功能:$.when( verifyPassword() ).done(function() { ...
    • 没关系,我想通了...只是不要将 Notify.reject() 放在发生错误密码错误的地方。再次感谢,我什至不知道 v1.5 已发布!
    • @jAndy 而不是拥有自己的$.Deferred 对象,您可以从$.post 返回延迟对象
    • @Ratlos:你可以,但不是在 OP 的这个特殊要求中,因为 jXHR 对象只有在点击后才可用
    【解决方案2】:

    不要拖延,而是提供回调:

    function verifyPassword(f) {
        /**
        * Do all your logic here, then callback to the passed function
        */
        f(result);
    }
    verifyPassword(function (correct) {
        if (correct) {
            /* Continue */
        }
        else { /* Other */ }
    });
    

    【讨论】:

    • 它不起作用,因为$.post 不会向父函数返回任何内容。他确实需要一个可以从$.post 回调函数中调用的新函数
    • @Pablo:我省略了$.post 代码,f(result) 将进入回调。
    【解决方案3】:

    我认为您想将您的$.post() 调用转换为更通用的$.ajax() jQuery 调用,并传入async: false。比如:

    $.ajax('', { async:false, data: {password:...}, success: function() {
        // ... success callback ...
    }});
    

    【讨论】:

    • 永远不要使用async=false 它会锁定用户界面。有非常多的案例供它使用。而这不是其中之一
    猜你喜欢
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    相关资源
    最近更新 更多