Ответ 1
Я только что сделал это -
$("#myform").bind('ajax:complete', function() {
// tasks to do
});
И все сработало отлично.
Подробнее см. эту документацию api.
У меня есть простая форма с удаленным = true.
Эта форма фактически находится в HTML-диалоге, который закрывается, как только нажимается кнопка "Отправить".
Теперь мне нужно внести некоторые изменения на главной HTML-странице после успешной отправки формы.
Я попробовал это с помощью jQuery. Но это не гарантирует, что задачи будут выполнены после некоторой формы ответа на отправку формы.
$("#myform").submit(function(event) {
// do the task here ..
});
Как прикрепить обратный вызов, чтобы мой код выполнялся только после успешной отправки формы? Есть ли способ добавить какой-либо обратный вызов .success или .complete в форму?
Я только что сделал это -
$("#myform").bind('ajax:complete', function() {
// tasks to do
});
И все сработало отлично.
Подробнее см. эту документацию api.
Я не мог получить решение номер один, чтобы работать надежно, но нашел, что это работает. Не уверен, требуется ли это или нет, но у меня нет атрибута action или method в теге, который гарантирует, что POST обрабатывается функцией $.ajax и предоставляет вам функцию обратного вызова.
<form id="form">
...
<button type="submit"></button>
</form>
<script>
$(document).ready(function() {
$("#form_selector").submit(function() {
$.ajax({
type: "POST",
url: "form_handler.php",
data: $(this).serialize(),
success: function() {
// callback code here
}
})
})
})
</script>
Вам придется делать все вручную с помощью вызова AJAX на сервер. Это потребует от вас также переопределить форму.
Но не беспокойтесь, это кусок пирога. Вот обзор того, как вы будете работать с вашей формой:
preventDefault
)Сначала вам нужно отменить действие отправки формы следующим образом:
$("#myform").submit(function(event) {
// Cancels the form submit action.
event.preventDefault();
});
И затем, возьмите значение данных. Предположим, что у вас есть одно текстовое поле.
$("#myform").submit(function(event) {
event.preventDefault();
var val = $(this).find('input[type="text"]').val();
});
И затем отпустите запрос. Предположим, что это запрос POST.
$("#myform").submit(function(event) {
event.preventDefault();
var val = $(this).find('input[type="text"]').val();
// I like to use defers :)
deferred = $.post("http://somewhere.com", { val: val });
deferred.success(function () {
// Do your stuff.
});
deferred.error(function () {
// Handle any errors here.
});
});
И это должно сделать это.
Примечание 2: Для анализа данных формы предпочтительнее использовать плагин. Это сделает вашу жизнь очень легкой, а также предоставит приятную семантику, которая имитирует действительную действительность формы.
Примечание 2: Вам не нужно использовать перебежчики. Это просто личное предпочтение. Вы также можете сделать следующее, и оно тоже должно работать.
$.post("http://somewhere.com", { val: val }, function () {
// Start partying here.
}, function () {
// Handle the bad news here.
});
Для MVC здесь был еще более простой подход. Вам нужно использовать форму Ajax и установить AjaxOptions
@using (Ajax.BeginForm("UploadTrainingMedia", "CreateTest", new AjaxOptions() { HttpMethod = "POST", OnComplete = "displayUploadMediaMsg" }, new { enctype = "multipart/form-data", id = "frmUploadTrainingMedia" }))
{
... html for form
}
вот код отправки, это находится в разделе готового документа и связывает событие onclick кнопки, чтобы отправить форму
$("#btnSubmitFileUpload").click(function(e){
e.preventDefault();
$("#frmUploadTrainingMedia").submit();
});
здесь обратный вызов, указанный в AjaxOptions
function displayUploadMediaMsg(d){
var rslt = $.parseJSON(d.responseText);
if (rslt.statusCode == 200){
$().toastmessage("showSuccessToast", rslt.status);
}
else{
$().toastmessage("showErrorToast", rslt.status);
}
}
в методе контроллера для MVC это выглядит как
[HttpPost]
[ValidateAntiForgeryToken]
public JsonResult UploadTrainingMedia(IEnumerable<HttpPostedFileBase> files)
{
if (files != null)
{
foreach (var file in files)
{
// there is only one file ... do something with it
}
return Json(new
{
statusCode = 200,
status = "File uploaded",
file = "",
}, "text/html");
}
else
{
return Json(new
{
statusCode = 400,
status = "Unable to upload file",
file = "",
}, "text/html");
}
}
Я не верю, что есть функция обратного вызова, подобная той, которую вы описываете.
Что здесь нормально, так это делать изменения, используя какой-то серверный язык, например PHP.
В PHP вы можете, например, извлечь скрытое поле из своей формы и внести некоторые изменения, если он присутствует.
PHP:
$someHiddenVar = $_POST["hidden_field"];
if (!empty($someHiddenVar)) {
// do something
}
Один из способов сделать это в JQuery - использовать Ajax. Вы можете слушать submit, возвращать false, чтобы отменить свое поведение по умолчанию и вместо этого использовать jQuery.post(). jQuery.post имеет успешный обратный вызов.
$.post("test.php", $("#testform").serialize(), function(data) {
$('.result').html(data);
});
Обработчики формы "при отправке" вызываются до отправки формы. Я не знаю, есть ли обработчик для вызова после отправки формы. В традиционном не Javascript смысле отправка формы перезагрузит страницу.
$("#formid").ajaxForm({ success: function(){ //to do after submit } });