Вопрос

Привет, я использую html-форму, которая используется для входа людей на мой веб-сайт, я создаю его, чтобы он использовал AJAX (jQuery), но у меня возникли некоторые проблемы.

Вот JavaScript:

function validateLoginDetails() {
    $('[name=loginUser]').click(function() {
        $("#mainWrap").css({ width:"600px", height:"200px" });
        $("#interfaceScreen").load("modules/web/loginForm.php?username=" + encodeURIComponent(username) + "&password=" + encodeURIComponent(password));
    });
}

Вот HTML-форма:

<form id="formLogin" name="loginUser" method="post">
    Username<br /><input id="username" name="username" type="text" maxlength="30" style="width:160px; border:solid 1px #444444;" /><br /><br />
    Password<br /><input id="password" name="password" type="password" maxlength="50" style="width:160px; border:solid 1px #444444;" /><br /><br />
    <input id="submit" type="submit" value="Play" style="width:100px; background:#FFFFFF; border:solid 1px #444444;" />
</form>

Проблема в том, что когда я отправляю форму, она запускает код, но затем возвращается к тому, как это было раньше, это может звучать странно, но я могу сказать, потому что я вижу, как оно изменяет размер div, а затем сразу после возврата к его оригинальный размер.

Есть идеи?

РЕДАКТИРОВАТЬ: если я, например, запускаю код с приведенной ниже ссылкой, он работает нормально.

<a href="#" name="loginUser">Clicky</a>
Это было полезно?

Решение

Вам нужно возвращать false из вашего обработчика, чтобы он не выполнял фактическую отправку формы после выполнения вызова AJAX.

Вот что я хотел бы сделать.

$(function() {
     $('#formLogin').submit( function() {
         $('#mainWrap').css( { width: '600px', height: '200px' });
         $.post( 'modules/web/loginForm.php',
                 $(this).serialize(),
                 function(data) {
                     $('#interfaceScreen').html(data);
                 }
         );
         return false;
     });
});

Обратите внимание, что я использую сообщение, чтобы убедиться, что URL-адрес (включая имя пользователя и пароль) не отображается в веб-журналах. Я также предполагаю, что страница, содержащая форму, была загружена через https и, таким образом, пост также будет защищен.

Другие советы

Я уверен, что tvanfosson находится на правильном пути. Попробуйте переместить возвращаемое значение false в функцию щелчка или попробуйте отменить событие.

$('[name=loginUser]').click(function() {
    //do stuff
    return false;
});

or

$('[name=loginUser]').click(function(e) {
    e.cancel();
});

Если вы имеете дело с отправкой формы, вам следует выбрать обработчик события .form (), а не обработчик события .click (). В первом случае, если форма отправляется с помощью любых других методов, ваши проверки по-прежнему будут выполняться, тогда как щелчок зависит от того, какой элемент запускает действие. Вам также нужно будет вернуть false или warnDefault () в этом событии, чтобы ваша функция действительно работала правильно.

Другая вещь (и это может быть незначительным / неважным в зависимости от предоставленной вами выборки кода) заключается в том, что вы связываете этот обработчик событий с функцией, которая должна вызываться - почему бы не загрузить его в готовый документ, как так (см. ниже)?

Я бы лично переделал ваш код следующим образом:

$(document).ready(function() {
    $('#formLogin').submit(function() {
        $("#mainWrap").css({ width:"600px", height:"200px" });
        $("#interfaceScreen").load("modules/web/loginForm.php?username=" + encodeURIComponent(username) + "&password=" + encodeURIComponent(password));
        return false;
    });
});

Во-первых, вы подтвердили, что ваш файл .php возвращает содержимое, а не ошибку? Если вы вставляете контент (с помощью $ load ), вам не следует запускать команды CSS для div, пока ожидаемый контент (из загрузки) не будет успешно возвращен, например, использовать обратный вызов. Кроме того, я бы предложил использовать .submit () , специфичную для формы функцию, с прямой ссылкой на тег формы и / или id для ускорения процесса (не делая jquery-поиск таким же количеством вещей в DOM ).

< style >

.loadReg{ width:[yourBeginWidth]; height:[yourBeginHeight];}

.loadSuccess{ width:600px; height:200px;}

< / style >

function validateLoginDetails() {
  $('#formLogin').submit(function() {
    // using load(url,{data:toPOST},callback(if successful));

    $("#interfaceScreen").load("modules/web/loginForm.php?",
    {"username": encodeURIComponent(username), "password": encodeURIComponent(password)},
    function(){$("#mainWrap").toggleClass('loadSuccess');} 
    );// end load

  });// end submit

  return false;
}

Это могло бы быть еще более эффективным и менее навязчивым, но хотелось оставить его узнаваемым. Другие парни правы ... если ваш Div возвращается к своему первоначальному размеру ... это потому, что странице разрешено перезагружаться ... в этом случае ваша начальная ширина / высота DIV применяется браузером ... поскольку ваша альтернативная ширина / высота применяется только в jquery onsubmit.

Напомним:

<Ол>
  • назначить событие отправки для прямой формы
  • использовать $ load для передачи пар значений является объект {name: val}
  • перевести CSS в ненавязчивое состояние, а не в коде
  • активировать CSS в случае успеха
  • остановка загрузки страницы и перезагрузки дисплея
  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top