0

構築しているPHP認証システムのフロントエンドを構築しています。jQueryを使用しています。基本を多かれ少なかれ知っており、ログイン、登録、アクティベーションのページでエラー/成功メッセージを表示するために正常に使用しています。送信する前にパスワードをハッシュし、ユーザーにCookieを割り当て、検証を行います。

私は現在リセットシステムに取り組んでいます。この部分はステップ2です。ユーザーがリセット要求の電子メールを受信した後、ユーザーはサイトにアクセスしてリセットコードを入力するか、直接リンクを使用してボタンをクリックするだけです。次に、jQueryはサーバーにリクエストを送信し、リセットキーを確認します。正しくない場合は適切なメッセージを表示し、正しい場合は.form divをクリアして、別のフォーム(#resetpass)に置き換えます。このフォームでは、ユーザーが新しいパスワードを入力し、サーバーに送信する必要がありますが、何らかの理由でjQueryが送信をキャッチせず、フォームはAjax経由ではなく正常に送信されているため、コードを調べています。かなり長い間、これとあれを変えて、前向きな結果はありませんでした。私は何を間違っているのですか?

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>PHPAuth 2.0 - Reset Password</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<!-- Base CSS -->
<link href="css/reset.css" rel="stylesheet" type="text/css" />
<link href="css/style.css" rel="stylesheet" type="text/css" />
<!-- Jquery CSS (UI + Addons) -->
<link href="css/ui-lightness/jquery-ui.custom.css" rel="stylesheet" type="text/css" />
<link href="css/jquery.qtip.css" rel="stylesheet" type="text/css" />
<!-- Jquery base file + Jquery UI -->
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery-ui.min.js"></script>
<script type="text/javascript" src="js/jquery-ui.message.js"></script>
<!-- Jquery plugins for this page : To be compiled -->
<script type="text/javascript" src="js/reset/jquery.validate.js"></script>
<script type="text/javascript" src="js/reset/jquery.qtip.js"></script>
<script type="text/javascript" src="js/reset/jquery.crypt.js"></script>
</head>

<body>
<div class="logo"></div>
<div class="form">
    <form id="reset" method="post">
        <input type="text" name="resetkey" id="password" placeholder="Reset Key" <?php if(isset($_GET['key'])) { echo "value=\"" . $_GET['key'] . "\" "; } ?>/>
        <input type="submit" id="reset" value="Reset Password" />
    </form>
</div>
<div class="small">
    <a href="?page=login">I know my password</a><br/>
</div>

<script type="text/javascript">
$(document).ready(function(){
    $('#reset').validate({
            errorClass: "errormessage",
            onkeyup: false,
            errorClass: 'error',
            validClass: 'valid',
            rules: {
                password: { required: true, minlength: 3, maxlength: 100 }
            },
            errorPlacement: function(error, element)
            {
                var elem = $(element),
                    corners = ['right center', 'left center'],
                    flipIt = elem.parents('span.right').length > 0;

                if(!error.is(':empty')) {
                    elem.filter(':not(.valid)').qtip({
                        overwrite: false,
                        content: error,
                        position: {
                            my: corners[ flipIt ? 0 : 1 ],
                            at: corners[ flipIt ? 1 : 0 ],
                            viewport: $(window)
                        },
                        show: {
                            event: false,
                            ready: true
                        },
                        hide: false,
                        style: {
                            classes: 'ui-tooltip-red'
                        }
                    })
                    .qtip('option', 'content.text', error);
                }
                else { elem.qtip('destroy'); }
            },
            success: $.noop,
    })


    $('#resetpass').validate({
            errorClass: "errormessage",
            onkeyup: false,
            errorClass: 'error',
            validClass: 'valid',
            rules: {
                resetkey: { required: true, minlength: 20, maxlength: 20 }
            },
            errorPlacement: function(error, element)
            {
                var elem = $(element),
                    corners = ['right center', 'left center'],
                    flipIt = elem.parents('span.right').length > 0;

                if(!error.is(':empty')) {
                    elem.filter(':not(.valid)').qtip({
                        overwrite: false,
                        content: error,
                        position: {
                            my: corners[ flipIt ? 0 : 1 ],
                            at: corners[ flipIt ? 1 : 0 ],
                            viewport: $(window)
                        },
                        show: {
                            event: false,
                            ready: true
                        },
                        hide: false,
                        style: {
                            classes: 'ui-tooltip-red'
                        }
                    })
                    .qtip('option', 'content.text', error);
                }
                else { elem.qtip('destroy'); }
            },
            success: $.noop,
    })
});

$("#reset").submit(function(event) {
    if($("#reset").valid()) {
        event.preventDefault(); 

        var $form = $( this ),
            resetkey = $form.find('input[name="resetkey"]').val();


        $.post("inc/action.php?a=reset2", {key: resetkey},
            function(data) {
                if(data['error'] == 1)
                {
                    $("#message").remove();

                    $(".form").prepend('<div id="message"></div>');

                    $("#message").message({type: "error", dismiss: false, message: data['message']});

                    $("#message").effect("shake", {times: 2, distance: 10}, 200);
                }
                else if(data['error'] == 0)
                {                           
                    $(".form").empty();

                    $(".form").append('<form id="resetpass" method="post">');
                    $("#resetpass").append('<input type="hidden" name="resetkey" value="' + resetkey + '" />');
                    $("#resetpass").append('<input type="password" name="password" id="password" placeholder="New Password" />');
                    $("#resetpass").append('<input type="submit" id="reset" value="Change Password" />');
                }
            }, "json"
        );
    }
    else
    {
        $("[id^=ui-tooltip-]").effect("pulsate", {times: 3}, 300);
        return false;
    }
});

$("#resetpass").submit(function(event) {
    if($("#resetpass").valid()) {
        event.preventDefault(); 

        var $form = $( this ),
            resetkey = $form.find( 'input[name="resetkey"]' ).val(),
            pass = $().crypt({method:"sha1",source:$().crypt({method:"sha1",source:$form.find( 'input[name="password"]' ).val()})});

        $.post("inc/action.php?a=reset3", {key: resetkey, password: pass},
            function(data) {
                if(data['error'] == 1)
                {
                    $("#message").remove();

                    $(".form").prepend('<div id="message"></div>');

                    $("#message").message({type: "error", dismiss: false, message: data['message']});

                    $("#message").effect("shake", {times: 2, distance: 10}, 200);
                }
                else if(data['error'] == 0)
                {           
                    $("#message").remove();

                    $(".form").prepend('<div id="message"></div>');

                    $("#message").message({type: "info", dismiss: false, message: data['message']});

                    $("#message").effect("pulsate", {times: 2}, 200);
                }
            }, "json"
        );
    }
    else
    {
        $("[id^=ui-tooltip-]").effect("pulsate", {times: 3}, 300);
        return false;
    }
});
</script>
</body>
</html>

どんな助けでも大歓迎です:)

4

2 に答える 2

0

同じIDのタグが2つあるのはなぜですか'reset'reset.submitの代わりにtry

<form id="resetfrm" method="post" onsubmit="fnSubmit();return false;">

function fnSubmit(){
    if($("#reset").valid()) {      
        var $form = $( this ),
            resetkey = $form.find('input[name="resetkey"]').val();


        $.post("inc/action.php?a=reset2", {key: resetkey},
            function(data) {
                if(data['error'] == 1)
                {
                    $("#message").remove();

                    $(".form").prepend('<div id="message"></div>');

                    $("#message").message({type: "error", dismiss: false, message: data['message']});

                    $("#message").effect("shake", {times: 2, distance: 10}, 200);
                }
                else if(data['error'] == 0)
                {                           
                    $(".form").empty();

                    $(".form").append('<form id="resetpass" method="post">');
                    $("#resetpass").append('<input type="hidden" name="resetkey" value="' + resetkey + '" />');
                    $("#resetpass").append('<input type="password" name="password" id="password" placeholder="New Password" />');
                    $("#resetpass").append('<input type="submit" id="reset" value="Change Password" />');
                }
            }, "json"
        );
    }
    else
    {
        $("[id^=ui-tooltip-]").effect("pulsate", {times: 3}, 300);
        return false;
    }

}
于 2012-07-29T17:21:36.057 に答える
0

irc.freenode.netの#jqueryのShokyのおかげで問題が解決しました

window_timeout関数内でDOMにコンテンツを追加した後、検証と送信のためにすべてのコードをスローする必要がありました。

于 2012-08-02T00:34:34.037 に答える