Znalazłem wiele pytań, które są takie same, obejmują one:

Większość problemów jest spowodowana otwarciem formularza w tabeli / div lub inny problem z HTML. Nie wierzę, że mam żadną z tych problemów; Podejrzewam, że mój JavaScript musi być poprawiony.

Używam jQuery jako tak:

<head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
</head>
  1. Po kliknięciu add Link nowy wiersz tabeli jest dołączony do tbody.newRow

  2. Przy kliknięciu .remove zostaniesz poproszony o potwierdzenie. Po potwierdzeniu wiersz jest usuwany.

  3. Forma składana jest przez AJAX, gdy input.Value traci ostrość.

JQuery:

$(document).ready(function() {
  $(".add").on('click', function() {
    $("tbody.newRow").append(
      '<tr><td><input type="text" name="NewJobLeviesId[]" class="JobLeviesId" /><input type="text" name="NewValue[]" class="Value" /><input type="text" name="MasterId[]" class="Values" /><input type="text" name="LUPChoiceId[]" class="Values" /><input type="text" name="SortOrder[]" class="Values" /></td><td class="removeSelection"><a href="#" class="remove">Remove</a></td></tr>'
    );
  });
  $("tbody").on('click', '.remove', function() {
    $(this).parent().append($(
      '<div class="confirmation"><a href="#" class="removeConfirm">Yes</a><a href="#" class="removeCancel">No</a></div>'
    ))
    $(this).remove();
  });
  $("tbody").on('click', '.removeConfirm', function() {
    $(this).parent().parent().parent().remove();
  });
  $("tbody").on('click', '.removeCancel', function() {
    $(this).parent().parent().append(
      '<a href="#" class="remove">Remove</a>');
    $(this).parent().remove();
  });
  var formTwo = $('.ajaxTwo'); // contact form
  // form submit event
  $(".Value").blur(function() {
    $.ajax({
      type: 'POST', // form submit method get/post
      dataType: 'html', // request type html/json/xml
      data: formTwo.serialize(), // serialize form data 
      success: function(data) {
        url: 'functions.php'; // form action url
      },
      error: function(e) {
        console.log(e)
      }
    });
  });
});

Formularz HTML. Ajax działa cudownie z istniejącym wierszem, który nie jest dodawany dynamicznie. Add wiersz znajduje się w stopce tabeli wyglądając ładnie. Formularz jest publikowany jako tablica.

<form class="ajaxTwo" method="post">
    <table>
    <tbody class="newRow">
        <tr>
          <td>
              <input type="text" name="NewJobLeviesId[]" class="JobLeviesId" />
              <input type="text" name="NewValue[]" class="Value" />
              <input type="text" name="MasterId[]" class="Values" />
              <input type="text" name="LUPChoiceId[]" class="Values" />
              <input type="text" name="SortOrder[]" class="Values" />
          </td>
          <td class="removeSelection">
              <a href="#" class="remove">Remove</a>
          </td>
        </tr>
    </tbody>
   <tfoot>
        <tr>
           <td>
               <a href="#" class="add">Add Row</a>
           </td>
        </tr>
    </tfoot>
    </table>
</form>

Wreszcie PHP. Każdy wiersz jest wkładany do mojej tabeli bazy danych z przygotowaną instrukcją PDO.

if(isset($_SERVER['HTTP_X_REQUESTED_WITH'])){
    if(isset($_POST['NewJobLeviesId'])) {
        for($i=0; $i<count($_POST['NewJobLeviesId']); $i++) {
          $NewJobLeviesId = $_POST['NewJobLeviesId'][$i];
          $NewValue = $_POST['NewValue'][$i];
          $MasterId = $_POST['MasterId'][$i];
          $LUPChoiceId = $_POST['LUPChoiceId'][$i];
          $SortOrder = $_POST['SortOrder'][$i];
          $sql = "INSERT INTO joblevies (JobLeviesId,Value,MasterId,LUPChoiceId,SortOrder) VALUES (:JobLeviesId,:Value,:MasterId,:LUPChoiceId,:SortOrder)";
        $q = $db->prepare($sql);
        $q->execute(array(':JobLeviesId'=>($NewJobLeviesId),':Value'=>($NewValue),':MasterId'=>($MasterId),':LUPChoiceId'=>($LUPChoiceId),':SortOrder'=>($SortOrder)));
        }
    }
}

Ponownie to działa cudownie. Tylko dynamicznie dodane wejścia mają problem. czego mi brakuje?

1
misterManSam 25 listopad 2013, 05:46

2 odpowiedzi

Najlepsza odpowiedź

Dynamicznie utworzone elementy DOM nie mają żadnych zdarzeń dołączonych do $(document).ready(..., ponieważ jeszcze nie istniały, gdy przywiązałeś zdarzenia. Więc rzeczy $('.Value').blur(... są przywiązane tylko do pierwszej formy, a nie w przyszłości. Więc załóż wydarzenie za każdym razem, gdy tworzysz nowy rząd, więc może coś takiego:

Najpierw przekazać działanie wiążące do własnej funkcji

function attachSubmitEvent() {
    // form submit event
    //remove old events first
    $(".Value").off();
    $(".Value").blur(function () {
        var formTwo = $('.ajaxTwo'); // contact form
        $.ajax({
            type: 'POST', // form submit method get/post
            dataType: 'html', // request type html/json/xml
            data: formTwo.serialize(), // serialize form data 
            success: function (data) {
                url: 'functions.php'; // form action url
            },
            error: function (e) {
                console.log(e)
            }
        });
    });
}

Następnie w dokumencie. Należy zadzwoń do tej funkcji

attachSubmitEvent();

, aby upewnić się, że są również przymocowane do nowych elementów, nazywają go ponownie podczas tworzenia nowych elementów

$(".add").on('click', function () {
$("tbody.newRow").append('<tr><td><input type="text" name="NewJobLeviesId[]" class="JobLeviesId" /><input type="text" name="NewValue[]" class="Value" /><input type="text" name="MasterId[]" class="Values" /><input type="text" name="LUPChoiceId[]" class="Values" /><input type="text" name="SortOrder[]" class="Values" /></td><td class="removeSelection"><a href="#" class="remove">Remove</a></td></tr>');
attachSubmitEvent(); //now everyone has the event attached.
});
1
chiliNUT 25 listopad 2013, 03:03

Dla twojego formularza wysłać wydarzenie, spróbuj:

$("tbody").on('focusout', '.Value', function() {
    ...
});

Można również użyć blur w tym przewodniku zdarzeń, ale dokumentacja zaleca przy użyciu focusout dla jasności (patrz "Dodatkowe uwagi" sekcja jQuery On () Dokumentacja metody: http://api.jquery.com/on/)

1
VLS 25 listopad 2013, 02:15