Запуск кода JavaScript с отправкой HTML-формы
-
05-07-2019 - |
Вопрос
Привет, я использую 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}