JQuery AJAX проверить работает частично - PullRequest
2 голосов
/ 19 января 2011

Это мой код:

    $(function() {

        var name = $( "#name" ),
            email = $( "#email" ),
            password = $( "#password" ),
            allFields = $( [] ).add( name ).add( email ).add( password ),
            tips = $( ".validateTips" );

        function updateTips( t ) {
            tips
                .text( t )
                .addClass( "ui-state-highlight" );
            setTimeout(function() {
                tips.removeClass( "ui-state-highlight", 1500 );
            }, 500 );
        }

        function checkLength( o, n, min, max ) {
            if ( o.val().length > max || o.val().length < min ) {
                o.addClass( "ui-state-error" );
                updateTips( "Length of " + n + " must be between " +
                    min + " and " + max + "." );
                return false;
            } else {
                return true;
            }
        }

        function checkRegexp( o, regexp, n ) {
            if ( !( regexp.test( o.val() ) ) ) {
                o.addClass( "ui-state-error" );
                updateTips( n );
                return false;
            } else {
                return true;
            }
        }

function ajaxValidate(type,fval,n) {
    //alert(type+" "+fval.val()+" "+n);
    $.ajax({
       type: "GET",
       url: "ajaxValidate.php",
       data: "type="+type+"&q="+escape(fval.val()),
       success: function(msg){
         if (msg != "") {
         fval.addClass( "ui-state-error" );
         updateTips( n );
             return false;
         }
         else {
             return true;
         }
       }
     });
}

        $( "#dialog-form" ).dialog({
            autoOpen: false,
            height: 540,
            width: 420,
            modal: true,
            buttons: {
                "Create an account": function() {
                    var bValid = true;
                    allFields.removeClass( "ui-state-error" );

                    bValid = bValid && checkLength( name, "username", 3, 16 );
                    bValid = bValid && checkLength( email, "email", 6, 80 );
                    bValid = bValid && checkLength( password, "password", 5, 16 );
                    bValid = bValid && ajaxValidate("user", name,"Username is taken");
                    bValid = bValid && ajaxValidate("email", email,"Email address is taken");


                    bValid = bValid && checkRegexp( name, /^[a-z]([0-9a-z_])+$/i, "Username may consist of a-z, 0-9, underscores, begin with a letter." );
                    // From jquery.validate.js (by joern), contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
                    bValid = bValid && checkRegexp( email, /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i, "eg. john.doe@pokermaps.org" );
                    bValid = bValid && checkRegexp( password, /^([0-9a-zA-Z])+$/, "Password field only allow : a-z 0-9" );

                    if ( bValid ) {
                        $( "#users tbody" ).append( "<tr>" +
                            "<td>" + name.val() + "</td>" + 
                            "<td>" + email.val() + "</td>" + 
                            "<td>" + password.val() + "</td>" +
                        "</tr>" ); 

                        document.forms["regform"].submit();
                        $( this ).dialog( "close" );

                    }
                },
                Cancel: function() {
                    $( this ).dialog( "close" );
                }
            },
            close: function() {
                allFields.val( "" ).removeClass( "ui-state-error" );
            }
        });

        $( "#create-user" )
            .button()
            .click(function() {
                $( "#dialog-form" ).dialog( "open" );
            });
    });

Моя проблема связана с функцией ajaxValidate и двумя строками в коде, который вызывает эту функцию.

По какой-то странной причине, это работает только один раз, то есть, если вы продолжаете первый вызов для проверки пользователя, он будет делать это правильно, но не будет проверять электронную почту, но если вы сначала сделаете вызов проверки электронной почты, он подтвердит это, но не подтвердит пользователя.

Остальная часть сценария проверки работает, поэтому, если я закомментирую две строки вызова, все будет отлично.

PHP-скрипт также работает.

Почему это?

UPDATE:

Хорошо, ребята, я немного изменил функцию, объединив запросы проверки, так что теперь ajaxValidate выглядит так:

function ajaxValidate(fval1,fval2,n) {
    //alert(type+" "+fval.val()+" "+n);
    $.ajax({
       type: "GET",
       url: "ajaxValidate.php",
       data: "?email="+escape(fval1.val())+"&user="+escape(fval2.val()),
       success: function(msg){
         alert(fval1.val());
         alert(msg);
       }
     });
}

Вызов функции выглядит следующим образом:

bValid = bValid && ajaxValidate(email, name ,"Email/User address is taken");

И ajaxValidate.php выглядит так:

require_once('classes/db/conn.php');
$user = $_GET['user'];
$email = $_GET['email'];


$query_user = mysql_fetch_array(mysql_query("SELECT USR_ID FROM users WHERE USR_Username = '$user'"));

$query_email= mysql_fetch_array(mysql_query("SELECT USR_ID FROM users WHERE USR_Email = '$email'"));


echo("SELECT USR_ID FROM users WHERE USR_Email = " . $email);

Теперь, после отправки формы, я должен получить одно оповещение с заполненным электронным письмом и одно оповещение с содержанием ответа ajax, которым должен быть SQL-запрос с письмом из $_GET var .

Что я получаю, так это то, что при первом оповещении я правильно получаю адрес электронной почты, а во втором оповещении я получаю весь запрос, но без адреса электронной почты. (SELECT USR_ID FROM users WHERE USR_Email =)

Я схожу с ума, я не могу понять это!

Ответы [ 2 ]

0 голосов
/ 25 января 2011

Я думаю, что проблема в том, что вы передаете строковое значение для ключа данных, когда на самом деле он ожидает объект. Например. -

jQuery.ajax ({тип: "GET", url: "/", данные: "? Bob = bob & carol = carol", success: function () {console.log (arguments.length);}})

На самом деле попадает в URL - stackoverflow.com/?_=1295905818376&?bob=bob&carol=carol

Принимая во внимание -

jQuery.ajax ({тип: «GET», url: «/», данные: {bob: «bob», carol: «carol»}, success: function () {console.log (arguments.length)) ;}})

Хиты URL - stackoverflow.com/?_=1295906023724&bob=bob&carol=carol

(дополнительный параметр, который отображается, это временная метка, которую jQuery добавляет для предотвращения кэширования ответа)

Поэтому я считаю, что если вы измените свой код на следующий, он должен дать вам ожидаемые оповещения -

 $.ajax({
   type: "GET",
   url: "ajaxValidate.php",
   data: {email: fval1.val()), user:fval2.val()},
   success: function(msg){
     alert(fval1.val());
     alert(msg);
   }
 });

Вероятно, стоит иметь в виду, что код в функции обратного вызова success будет выполняться в какой-то момент в будущем, а не в этой точке последовательно в коде. Это означает, что вам, вероятно, придется переделать код проверки в нечто вроде:

           "Create an account": function() {
                var bValid = true;
                allFields.removeClass( "ui-state-error" );

                bValid = bValid && checkLength( name, "username", 3, 16 );
                bValid = bValid && checkLength( email, "email", 6, 80 );
                bValid = bValid && checkLength( password, "password", 5, 16 );


                bValid = bValid && checkRegexp( name, /^[a-z]([0-9a-z_])+$/i, "Username may consist of a-z, 0-9, underscores, begin with a letter." );
                // From jquery.validate.js (by joern), contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
                bValid = bValid && checkRegexp( email, /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i, "eg. john.doe@pokermaps.org" );
                bValid = bValid && checkRegexp( password, /^([0-9a-zA-Z])+$/, "Password field only allow : a-z 0-9" );
                var $this = $(this);
                $.ajax({
                  type: "GET",
                  url: "ajaxValidate.php",
                  data: "?email="+escape(fval1.val())+"&user="+escape(fval2.val()),
                  success: function(msg){
                    $( "#users tbody" ).append( "<tr>" +
                        "<td>" + name.val() + "</td>" + 
                        "<td>" + email.val() + "</td>" + 
                        "<td>" + password.val() + "</td>" +
                    "</tr>" ); 

                    document.forms["regform"].submit();
                    $this.dialog( "close" );
                  },
                });
            },

Я никогда раньше не использовал диалоги, так что я не уверен, что плагин ожидает, что функция возвратит и т. Д., Но вы захотите, чтобы структура, похожая на эту, поддерживала асинхронный вызов.

Надеюсь, это поможет,

Chris

0 голосов
/ 19 января 2011

Ваша ajaxValidate функция не возвращает ничего явно, поэтому она возвращает неявно undefined, который затем преобразуется в логическое значение false.

Чтобы иметь возможность вернуть статус проверки из функции, вы должны сделать синхронный вызов валидатору на стороне сервера. Посмотрите jQuery docs о том, как сделать ajax-запрос, вам нужно установить для свойства async значение false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...