Делегирование событий в Firefox после Ajax - PullRequest
0 голосов
/ 26 декабря 2011

Ниже приведен пример html, script и php для отправки и перезагрузки двух форм через jquery ajax. В реальном приложении те же формы не будут перезагружены, но после отправки каждой из них будет загружен ряд форм.

В chrome, IE и safari; нажатие кнопки "Отправить" приводит к ожидаемому запросу ajax. Сервер отвечает как задумано. Результаты (с указанием переменных для подтверждения) и новые формы загружаются на страницу, как и предполагалось. Эти новые формы могут быть отправлены, и все хорошо.

В Firefox; все работает, как задумано, пока вы не попытаетесь отправить формы, которые были загружены через AJAX. Они не будут подчиняться. Оригинальные формы работают. Только те, которые добавлены через ajax, не отправляют.

Я предполагаю, что это проблема "делегирования событий", связанная с тем, как firefox обновляет DOM после ajax. Я прочитал документацию в http://api.jquery.com/on/ и других местах, но я в растерянности ...

Любая помощь или предложения будут с благодарностью! Моя цель - получить этот функционал в последних версиях Chrome, IE, Safari и Firefox.

HTML-страница со скриптом

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Example Ajax Form Submit</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
</head>
<body>
<div id="results"></div>
<div id="forms">
<div>
<table width="100%" cellspacing="0" cellpadding="0" class="ui-widget">
<form>
<tr>
    <td width="100"></td><td width="300"></td><td></td>
</tr>
<tr>
    <td class=""colspan="3"><h1>Form 1</h1></td>
</tr>
<tr>
    <td>Input 1A</td><td colspan="2"><input type="text" name="1A"  /></td>
</tr>
<tr>
    <td colspan="3"><input type="hidden" name="1B" value="Form 1 was submitted" /></td>
</tr>
<tr>
    <td colspan="3"><button type="submit" >Click Me!</button><input type="submit" value="Submit Form 1" /></td>
</tr>
</form>
</table>
</div>
<div>
<table width="100%" cellspacing="0" cellpadding="0" class="ui-widget">
<form>
<tr>
    <td width="100"></td><td width="300"></td><td></td>
</tr>
<tr>
    <td class=""colspan="3"><h1>Form 2</h1></td>
</tr>
<tr>
    <td>Input 2A</td><td colspan="2"><input type="text" name="2A"  /></td>
</tr>
<tr>
    <td colspan="3"><input type="hidden" name="2B" value="Form 2 was submitted" /></td>
</tr>
<tr>
    <td colspan="3"><input type="submit" value="Submit Form 2" /></td>
</tr>
</form>
</table>
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){
$("#forms").on("submit", "form", function(e) {
e.preventDefault();
$.ajax({
    url: "testAjax.php",
    type: "POST",
    cache: false,
    data: $(this).serializeArray(),
    success: function(jsonData) {
        htmlData = jQuery.parseJSON(jsonData);
        $.each(htmlData, function(id, data){
            $("#"+id).html(data);
        });
    },
    error: function(jqXHR, textStatus, errorThrown){
        $("#results").html("<p>Somthing went wrong!</p>");
    }
});
});
});
</script>
</body>
</html>

testAjax.php

<?php
$htmlOutput['forms'] = 
'<div>
<table width="100%" cellspacing="0" cellpadding="0" class="ui-widget">
<form id="login" method="post" enctype="multipart/form-data" target="_self" action="_self">
<tr>
    <td width="100"></td><td width="300"></td><td></td>
</tr>
<tr>
    <td class=""colspan="3"><h1>Form 1</h1></td>
</tr>
<tr>
    <td>Input 1A</td><td colspan="2"><input type="text" name="1A"  /></td>
</tr>
<tr>
    <td colspan="3"><input type="hidden" name="1B" value="Form 1 was submitted" /></td>
</tr>
<tr>
    <td colspan="3"><button type="submit" >Click Me!</button><input type="submit" value="Submit Form 1" /></td>
</tr>
</form>
</table>
</div>
<div>
<table width="100%" cellspacing="0" cellpadding="0" class="ui-widget">
<form>
<tr>
    <td width="100"></td><td width="300"></td><td></td>
</tr>
<tr>
    <td class=""colspan="3"><h1>Form 2</h1></td>
</tr>
<tr>
    <td>Input 2A</td><td colspan="2"><input type="text" name="2A"  /></td>
</tr>
<tr>
    <td colspan="3"><input type="hidden" name="2B" value="Form 2 was submitted" /></td>
</tr>
<tr>
    <td colspan="3"><input type="submit" value="Submit Form 2" /></td>
</tr>
</form>
</table>
</div>';
$htmlOutput['results'] =
'<p>Form 1:<br> 1A = ' . $_POST['1A'] . '<br>1B = ' . $_POST['1B'] . '</p>' .
'<p>Form 2:<br> 2A = ' . $_POST['2A'] . '<br>2B = ' . $_POST['2B'] . '</p>';
echo json_encode($htmlOutput);
?>

1 Ответ

0 голосов
/ 26 декабря 2011

Откройте Firebug DOM инспектор и убедитесь, что ваша форма действительно загружена. Я уверен, что вам не разрешено вложить элемент формы непосредственно под элемент таблицы, и FF, скорее всего, просто отбросит его. В целом подобные проблемы всегда связаны с неработающим HTML. Убедитесь, что ваш HTML правильный. Убедитесь, что загруженный DOM соответствует ожидаемому.

Здесь - это способ анализа вашего HTML. Как и ожидалось, форма была искажена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...