Я считаю, что проблема в
$(this).dialog('close');
$(this).remove();
... в вашем post
обратном вызове, потому что вы не указали контекст для обратного вызова. Если это так, изменение post
на это должно исправить это:
$.ajax({
url: url+tack+"/process",
type: 'POST',
data: $("#formdialog").serialize(),
context: this,
success: function(data){
alert($("#formdialog").serialize());
$(this).dialog('close');
$(this).remove();
}
});
... потому что тогда вы сохраняете значение this
, когда вызывается функция success
.
Так почему эта проблема вызывает поведение, которое вы видите? Потому что, если вы не удаляете formwin
div
, вы не удаляете formdialog
form
, что означает, что вы получите несколько form
s на странице с одинаковым идентификатором. Хотя наличие одного и того же идентификатора на нескольких элементах недопустимо и, следовательно, имеет неопределенное поведение, большинство браузеров предоставят вам первый соответствующий элемент при запросе элемента по идентификатору & mdash; которая в вашем случае была бы более ранней формой с более ранними данными.
Редактировать Re ваш комментарий: Да, я вроде пропустил $(this).dialog('close')
там. :-) Пара вариантов: один из них - запомнить $(formwin)
в локальной переменной, а затем использовать его в обратном вызове, например ::
var formwin = '<div><form id="formdialog">'+data['form']+'</form></div>';
var formwinElement = $(formwin); // <== Remember it here
var dialog = formwinElement.dialog({ // <== Use it here
// ...
$.post(url+tack+"/process",
$("#formdialog").serialize(),
function(data){
alert($("#formdialog").serialize());
$(this).dialog('close');
formWinElement.remove(); // <== And again here
}
);
... и не беспокойтесь о параметре context
(поэтому я использовал ваш оригинальный $.post
в этом обновлении). Это работает, потому что обработчик успеха post
является замыканием над переменной formwinElement
(и некоторыми другими вещами).