带有登录和注册的Jquery模态对话框



我正在尝试创建一个用于登录和注册的Jquery模式窗口。当点击页面上的css触发器时,模式窗口会通过ajax动态地注入到页面的主体中。模式窗口打开时显示的默认表单是登录表单。此时,一切正常(表单验证、ajax提交等)。无论将哪种形式设置为默认形式,脚本都能正常工作。

如果用户还没有帐户,他/她可以点击一个链接来显示注册表格。此时,登录表格将淡出,注册表格将淡出。

然而,当我切换到注册表单时,jquery并没有按照plMShowRegBtn和plMShowLoginBtn点击事件中脚本的指示重新定义plActiveForm变量。如果我将注册表单设置为默认表单,那么一切都很好,直到我切换到登录表单,这时我遇到了同样的问题——jquery只是不在表单上执行——但所有其他jquery都很好(例如关闭模式窗口并将其从标记中删除)。

似乎一旦加载了jquery并为plActiveForm变量定义了值,它就不允许我重新定义它了。这个变量保存了当前表单的ID,并在整个代码中使用。

我尝试过使用带有live()和on()函数的plMShowRegBtn和plMShowLoginBtn点击事件,但没有成功。

这里没有显示html部分,但它非常简单。一个div容器,包含两个表单——一个用于登录,一个用于注册,还有两个用于切换显示的表单的输入按钮。这两种形式都是css显示:默认情况下为none。

如有任何帮助,我们将不胜感激。非常感谢。

我的插件如下所示:

// -----------------------------------------------
// JQUERY - FOR MODAL LOGIN + REGISTRATION FORM
// -----------------------------------------------
(function ($) {
$.fn.plMlogin = function (options) {
    // -----------------------------------------------
    // DEFAULTS AND OPTIONS
    // -----------------------------------------------
    var defaults = {
        plTooltip: true,
        plResetButton: true,
        plBubbleResponse: true
    };
    var settings = $.extend({}, defaults, options);
    // -----------------------------------------------
    // SHOW MODAL WINDOW ON CLICK
    // -----------------------------------------------
    $('.pl-m-trigger').click(function(e) {
        e.preventDefault();
        // -> append container into body
        $('body').append('<div class="pl-m-container">');
        // -> load modal forms into container
        $.ajax({
            url: 'pl-module/public/modal-login-html.php',
            dataType: 'html',
            timeout: 10000, // 10 seconds
            success: function(html) {
                // -----------------------------------------------
                // -> LOAD FORMS INTO CONTAINER
                // -----------------------------------------------
                $(".pl-m-container").html(html);
                // -----------------------------------------------
                // PROPERTIES
                // -----------------------------------------------
                var plMContainer = $('.pl-m-container'),
                    plMWrap = $('.pl-m'),
                    plMOverlay = $('.pl-m-overlay'),
                    plMLoginFrm = $('#pl_frmMlogin'),
                    plMRegFrm = $('#pl_frmMRegister'),
                    plMLoading = $('.pl-loading'),
                    plMCloseBtn = $('.pl-m-close'),
                    plMShowRegBtn = $('#pl_showRegForm'),
                    plMShowLoginBtn = $('#pl_showLoginForm'),
                    plMLoginSubmitUrl = 'pl-module/public/login.php',
                    plMRegisterSubmitUrl = 'pl-module/public/register.php',
                    plActiveForm = plMLoginFrm,
                    plSubmitUrl = plMLoginSubmitUrl;
                // -----------------------------------------------
                // SHOW MODAL WINDOW AND DEFAULT FORM
                // -----------------------------------------------
                $(plMWrap).fadeIn('fast');
                $(plMOverlay).fadeIn('fast');
                $(plActiveForm).fadeIn('fast');
                // -----------------------------------------------
                // CLOSE MODAL WINDOW ON BTN CLICK
                // -----------------------------------------------
                $(plMCloseBtn).click(function(e) {
                    e.preventDefault();
                    $(plMWrap).fadeOut('fast', function() {
                        $(plMOverlay).fadeOut('fast', function() {
                            $(plMContainer).remove();
                        });
                    });
                });
                // -----------------------------------------------
                // CLOSE MODAL WINDOW ON OVERLAY CLICK
                // -----------------------------------------------
                $(plMOverlay).click(function() {
                    $(plMWrap).fadeOut('fast', function() {
                        $(this).fadeOut('fast', function() {
                            $(plMContainer).remove();
                        });
                    });
                });
                // -----------------------------------------------
                // SWITCH TO REGISTRATION FORM
                // -----------------------------------------------
                $(plMShowRegBtn).click(function(e) {
                    e.preventDefault();
                    plResetForm();
                    $(plMLoginFrm).slideUp('fast', function() {
                        $(plMRegFrm).slideDown('fast', function(){
                            // set active form to registration
                            plActiveForm = plMRegFrm;
                            plSubmitUrl = plMRegisterSubmitUrl;
                        });
                    });
                });
                // -----------------------------------------------
                // SWITCH TO LOGIN FORM
                // -----------------------------------------------
                $(plMShowLoginBtn).click(function(e) {
                    e.preventDefault();
                    plResetForm();
                    $(plMRegFrm).slideUp('fast', function() {
                        $(plMLoginFrm).slideDown('fast', function(){
                            // set active form to login
                            plActiveForm = plMLoginFrm;
                            plSubmitUrl = plMLoginSubmitUrl;
                        });
                    });
                });
                // -----------------------------------------------
                // RESPONSE MESSAGES
                // -----------------------------------------------
                function plResponse(plMsg, plShowHide) {
                    var plResponse = $('.pl-response', plActiveForm);
                    if (plShowHide === true) {
                        $(plResponse).fadeIn('slow').html(plMsg);
                    } else if (plShowHide === false) {
                        $(plResponse).fadeOut('slow');
                    }
                }
                // -----------------------------------------------
                // RESET FORM BUTTON CLICK
                // -----------------------------------------------
                if (settings.plResetButton) {
                    var plResetBtn = $('.pl-reset-btn', plActiveForm);
                    $(plResetBtn).click(function (e) {
                        e.preventDefault();
                        plResetForm();
                    });
                }
                // -----------------------------------------------
                // RESET FORM FUNCTION
                // -----------------------------------------------
                function plResetForm() {
                    $('.pl-cust-response', plActiveForm).remove();
                    $('.pl-error', plActiveForm).removeClass('pl-error');
                    plResponse('', false);
                    plResetBtn.hide();
                    $(plActiveForm)[0].reset();
                }
                // -----------------------------------------------
                // FORM VALIDATION
                // -----------------------------------------------
                function plValidate() {
                    // remove custom errors if visible
                    $('.pl-cust-response', plActiveForm).remove();
                    // -----------------------------------------------
                    // CHECK - EMPTY REQUIRED FIELDS
                    // -----------------------------------------------
                    $(plActiveForm).find('.pl-required').each(function () {
                        var plEmptyCheck = $.trim($(this).val());
                        if (plEmptyCheck.length == 0) {
                            plResponse(PLLANG.MSG_03, true);
                            if (settings.plBubbleResponse) {
                                $(this).parent().append('<span class="pl-cust-response">' + PLLANG.MSG_04 + '</span>');
                                $('.pl-cust-response').fadeIn('slow');
                            }
                            $(this).addClass('pl-error');
                        } else {
                            $(this).removeClass('pl-error');
                        }
                    });
                    // -----------------------------------------------
                    // IF ERROR(S) FOUND
                    // -----------------------------------------------
                    var $errors = $('.pl-error', plActiveForm);
                    if ($errors.length > 0) {
                        if (settings.plResetButton) {
                            plResetBtn.show();
                        }
                        return false;
                    } else {
                        plResponse('', false);
                        return true;
                    }
                }
                // -----------------------------------------------
                // FORM SUBMIT
                // -----------------------------------------------
                plActiveForm.submit(function (e) {
                    e.preventDefault();
                    // if validation is ok
                    if (plValidate() === true) {
                        var plFormData = $(this).serialize();
                        plAjaxSubmit(plFormData);
                        $(plMLoading).show();
                    } else {
                        return false;
                    }
                });
                // -----------------------------------------------
                // AJAX SUBMIT FUNCTION
                // -----------------------------------------------
                function plAjaxSubmit(plFormData) {
                    $.ajax({
                        type: 'POST',
                        url: plSubmitUrl,
                        data: plFormData,
                        dataType: 'json',
                        cache: false,
                        timeout: 20000,
                        success: function (data) {
                            $.each(data, function(key, value) {
                                if (value.error == true) {
                                    // hide loading image
                                    $(plMLoading).hide();
                                    plResponse(value.msg, true);
                                    // show reset button
                                    if (settings.plResetButton) {
                                        plResetBtn.show();
                                    }
                                } else if (value.error == false) {
                                    // reset form
                                    plResetForm();
                                    // hide loading image
                                    $(plMLoading).hide();
                                    // display success message
                                    plResponse(value.msg, true);
                                }
                            });
                        },
                        error: function (XMLHttpRequest, textStatus, errorThrown) {
                            plResponse(PLLANG.MSG_06, true);
                            // hide loading image
                            $(plMLoading).hide();
                        },
                        complete: function (XMLHttpRequest, status) {
                            // hide loading image
                            $(plMLoading).hide();
                        }
                    });
                }
            }
        });
    });
};
})(jQuery);
// -----------------------------------------------
// INSTANTIATE MODAL LOGIN
// -----------------------------------------------
$(document).ready(function() {
    $('.pl-m').plMlogin({
        plTooltip : true,
        plResetButton : true,
        plBubbleResponse : true
    });
});

听起来像是范围问题。尝试将您的"属性"decarlation从ajax的成功中转移到插件的主体中。例如:

$.fn.plMlogin = function (options) {
    // declare private properties here
    var plActiveForm, plMLoginFrm; // etc.

在ajax成功函数中,设置属性,而不使用var:使其成为本地属性

plMLoginFrm = $('#pl_frmMlogin');
plActiveForm = plMLoginFrm;

我已经通过创建一个单独的插件来解决这个问题,该插件处理模态窗口并加载发送给它的文件-非常紧凑,也是页面中唯一需要包含的引用。表单有自己的插件来处理所有的验证和其他功能。表单及其相关的js是通过模态插件触发动作注入页面的,这使得整个操作几乎没有重量。所有内容都是动态添加然后删除的。。。。

最新更新