Я хочу выполнить onclick и onsubmit в одно и то же время, возможно ли это? Или если это плохая практика, как я могу объединить два кода для выполнения обоих событий?
У меня есть эта часть кода, проверяющая обязательное поле в теге формы:
onsubmit="return formCheck(this);"
Затем у меня есть эта часть кода в кнопке отправки для той же формы:
onClick="jQuery.facebox({ ajax: (\'wishlist.php?emailme=true&name=\' + this.form.name.value + \'&country=\' + this.form.country.value + \'&email=\' + this.form.email.value + \'&department=\' + this.form.department.value) }); return false;"
Проблема в том, что при нажатии кнопки «Отправить» он полностью игнорирует код onsubmit. Как я могу объединить их вместе?
UPDATE Я хочу, чтобы он сначала проверил обязательные поля, затем отправил форму, если все в порядке.
UPDATE: я вставил весь код здесь , я действительно борется, как это сделал предыдущий разработчик. Если бы кто-то мог буквально поместить решения в код, который был бы замечательным. Я подниму вознаграждение.
Поместите свой код onClick в ту же функцию, что и код onSumbit.
ОБНОВИТЬ
В конце вашего кода onClick
вы return false;
, это останавливает нормальное распространение событий и останавливает событие onSubmit
от стрельбы. Поэтому, если вы хотите, чтобы кнопка отправки отправила форму, удалите return false;
от его обработчика onClick
.
Когда вы нажимаете кнопку «Отправить», вы вызываете событие click
на кнопке и событие submit
в форме, в которой кнопка вложена (если вы не прекратите распространение событий с чем-то вроде return false;
).
Поэтому вам действительно нужен только обработчик событий submit
который выполняет работу обоих ваших текущих обработчиков.
Кроме того, поскольку у вас есть jQuery Core, включенный в вашу страницу, вы можете присоединить обработчики событий следующим образом:
$(function () { $('#form-id').on('submit', function () { var $this = $(this);//$this refers to the form that is being submitted jQuery.facebox({ ajax : 'wishlist.php?emailme=true&name=' + $this.find('#name').val() + '&country=' + $this.find('#country').val() + '&email=' + $this.find('#email').val() + '&department=' + $this.find('#department').val() }); //now we run your normal onSubmit code and return it's return value of this event handler return formCheck(this); }); });
Если вы отправляете всю форму в функцию jQuery.facebox
вы можете использовать .serialize()
jQuery для создания необходимой строки запроса:
$(function () { $('#form-id').on('submit', function () { jQuery.facebox({ ajax : 'wishlist.php?' + $(this).serialize() }); return formCheck(this); }); });
Вот демо: http://jsfiddle.net/vAFfj/
Документы для .serialize()
: http://api.jquery.com/serialize
Обратите внимание, что .on()
является новым в jQuery 1.7 и в этом случае является таким же, как .bind()
более старых версий.
ОБНОВИТЬ
Если вы хотите проверить возвращаемое значение из функции formCheck()
перед запуском плагина facebox
вы можете сделать это:
$(function () { $('#form-id').on('submit', function () { //check if the form data is valid if (formCheck(this) === true) { //if the form data is valid then run the facebox plugin jQuery.facebox({ ajax : 'wishlist.php?' + $(this).serialize() }); //also return true to stop running this function return true; } //if the form data is not valid then return false to stop the submission of the form return false; }); });
Внесите форму onclick в форму.
Не уверен, что у вас есть особые требования для использования как onSubmit()
и onclick()
, но это может помочь.
Вот HTML:
<form id="my_form"> Name: <input type="text" id="name" size="20" /> <br />Country: <input type="text" id="country" size="20" /> <br />Email: <input type="text" id="email" size="20" /> <br />Department: <input type="text" id="dept" size="20" /> <br /><input type="submit" id="submit" value="Login" /> </form>
И вот JS:
$(document).ready(function() { $('#my_form').submit(function() { var name = $('#name').val(); var country = $('#country').val(); var email = $('#email').val(); var dept = $('#dept').val(); /* Validate everything */ if (name != '' && country != '' && email != '' && dept != '') { /* Validation succeeded. Do whatever. */ jQuery.facebox({ ajax : 'wishlist.php?emailme=true&name=' + name + '&country=' + country + '&email=' + email + '&department=' + dept }); } else { alert('Validation failed.'); } return false; }); });
Теперь вы можете сделать две вещи:
1) Если вы используете AJAX для создания своих форм, вам может потребоваться return false;
во второй строке, так как это предотвратит отправку вашей формы.
2) Если вы хотите разместить свою форму в любом случае, просто удалите return false;
, Вы также можете публиковать свою форму, используя $('#my_form').submit()
когда захотите.
Вот скрипка: http://jsfiddle.net/vAFfj/1/
Надеюсь это поможет.
Я предлагаю вам написать отдельную функцию, которая выполняет ту же задачу, что и событие onClick.
Сначала проверьте, были ли введены все обязательные поля в событии onSubmit, если нет возврата false else, если все обязательные поля были введены, вызовите функцию, выполняющую ту же работу, что и функция в событии onClick.
Прежде всего, вам не нужны оба действия. В вашем сценарии вам нужно использовать атрибут onSubmit в теге формы.
Во-вторых, было бы намного лучше (по многим причинам), если бы действия над атрибутами содержали ссылки на функции, а не встроенный код.
Тем не менее, я бы изменил код следующим образом:
//some js file included in the page's header function formSubmitActions(element) { if (formCheck(element)) { jQuery.facebox({ ajax : 'wishlist.php?emailme=true&name=' + element.name.value + '&country=' + element.country.value + '&email=' + element.email.value + '&department=' + element.dept.value }); return true; } return false; } //the form <form [...] onsubmit="return formSubmitActions(this)"> [...]
Надеюсь, поможет!
в вашем коде есть 2 проблемы,
1 – форма может быть представлена нажатием «enter» в любом поле ввода. поэтому событие onclick не будет запущено.
2 – если пользователь нажимает кнопку (при условии, что вы добавили несколько хаков, и запускаются события onclick и onsubmit), но formcheck возвращает false, форма не будет отправлена, но событие click будет успешным ( у вас будет запрос, отправленный в wishlist.php)
мое предложение будет таким, как показано ниже,
onsubmit = "readyToSubmit(this); return false" function readyToSubmit(a){ if(formCheck(a)){ jQuery.ajax({ url : ..., success : function(data){a.submit()} }) } }
Теперь вы отправляете форму в событие onclick (jQuery.facebox ({ajax :)), поэтому просто переместите это на обработчик событий отправки (в нижней части функции formCheck после прохождения всех проверок)
.click(function(e) { e.preventDefault(); // click code }); .submit(function(e) { // submit code });
и ajax async param для FALSE
Почему бы просто не объединить их? подача будет отправляться и нажимать, чтобы вы могли сделать
onsubmit="return formCheck(this);jQuery.facebox({ ajax: (\'wishlist.php?emailme=true&name=\' + this.form.name.value + \'&country=\' + this.form.country.value + \'&email=\' + this.form.email.value + \'&department=\' + this.form.department.value) }); return false;"
Вы можете сделать одно, просто напишите код для отправки своей формы, например $('#form_id').submit();
, вместо return false;
, Таким образом, он будет отправлять форму после завершения функциональности кода .onclick()
.
Попробуйте объединить два типа:
onClick="if (formCheck(this)) { jQuery.facebox({ ajax: (\'wishlist.php?emailme=true&name=\' + this.form.name.value + \'&country=\' + this.form.country.value + \'&email=\' + this.form.email.value + \'&department=\' + this.form.department.value) });} return false;"