2011-10-17 9 views
59

Próbowałem różnych sposobów, aby usunąć postać:jQuery: Usuwanie Formularz Wejścia

<form action="service.php" id="addRunner" name="addRunner" method="post"> 
First Name: <input type="text" name="txtFirstName" id="txtFirstName" /><br /> 
Last Name: <input type="text" name="txtLastName" id="txtLastName" /><br /> 
Gender: <select id="ddlGender" name="ddlGender"><option value="">--Please Select--</option> 
<option value="f">Female</option> 
<option value="m">Male</option> 
</select><br /> 
Finish Time: 
<input type="text" name="txtMinutes" id="txtMinutes" size="10" maxlength="2">(Minutes) 
<input type="text" name="txtSeconds" id="txtSeconds" size="10" maxlength="2">(Seconds) 
<br /> 
<button type="submit" name="btnSave" id="btnSave">Add Runner</button> 
<input type="hidden" name="action" value="addRunner" id="action"> 
</form> 

jQuery # 1:

function clearInputs(){ 
$("#txtFirstName").val(''); 
$("#txtLastName").val(''); 
$("#ddlGender").val(''); 
$("#txtMinutes").val(''); 
$("#txtSeconds").val(''); 
} 

to działa doskonale.

jQuery # 2:

function clearInputs(data){ 
$("#addRunner :input").each(function(){ 
$(this).val(''); 
}); 

ten czyści formularz, ale nie pozwól mi przedstawić żadnych więcej informacji do niego. Próbuję ponownie kliknąć przycisk i nic nie robi.

Oto obsługi kliknięcie przycisku: Kod

$("#btnSave").click(function(){ 
    var data = $("#addRunner :input").serializeArray(); 
    $.post($("#addRunner").attr('action'), data, function(json){ 
     if (json.status == "fail"){ 
      alert(json.message); 
     } 
     if (json.status == "success"){ 
      alert(json.message); 
      clearInputs(); 
     } 
    }, "json"); 
}); 

PHP Post:

<?php 
if($_POST){ 
    if ($_POST['action'] == 'addRunner') { 
     $fname = htmlspecialchars($_POST['txtFirstName']); 
     $lname = htmlspecialchars($_POST['txtLastName']); 
     $gender = htmlspecialchars($_POST['ddlGender']); 
     $minutes = htmlspecialchars($_POST['txtMinutes']); 
     $seconds = htmlspecialchars($_POST['txtSeconds']); 
     if(preg_match('/[^\w\s]/i', $fname) || preg_match('/[^\w\s]/i', $lname)) { 
      fail('Invalid name provided.'); 
     } 
     if(empty($fname) || empty($lname)) { 
       fail('Please enter a first and last name.'); 
     } 
     if(empty($gender)) { 
      fail('Please select a gender.'); 
     } 
     if(empty($minutes) || empty($seconds)) { 
      fail('Please enter minutes and seconds.'); 
     } 
     $time = $minutes.":".$seconds; 

    $query = "INSERT INTO runners SET first_name='$fname', last_name='$lname', gender='$gender', finish_time='$time'"; 
    $result = db_connection($query); 

    if ($result) { 
     $msg = "Runner: ".$fname." ".$lname." added successfully" ; 
     success($msg); 
    } else { 
     fail('Insert failed.'); 
    } 
    exit; 
} 

}

Jeśli używam metody jQuery # 2, otrzymuję ten błąd w konsoli:

Uncaught TypeError: Cannot read property 'status' of null 

Dlaczego tak się dzieje?

zapomniałem włączyć tę kluczową informację:

function fail ($message){ 
    die(json_encode(array('status'=>'fail', 'message'=>$message))); 
} 

function success ($message){ 
    die(json_encode(array('status'=>'success', 'message'=>$message))); 

ten wysyła komunikat z powrotem do funkcji AJAX w jQuery. Wygląda na to, że po przesłaniu formularza raz przy użyciu metody # 2 komunikaty o sukcesach/błędach są wygaszone.

+1

Niektóre HTML pomogłyby, podczas gdy twój PHP jest niepotrzebny w tym kontekście. – vzwick

+0

Pokaż kod HTML formularza. – spicavigo

+0

Twój kod może również być podatny na [SQL Injection] (http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain). Lepiej nie składam "Roberta"; DROP TABLE biegaczy; - 'jak moje imię ... – vzwick

Odpowiedz

146

Demo: http://jsfiddle.net/xavi3r/D3prt/

$(':input','#myform') 
    .not(':button, :submit, :reset, :hidden') 
    .val('') 
    .removeAttr('checked') 
    .removeAttr('selected'); 

Original Odpowiedź: Resetting a multi-stage form with jQuery


Mike'a sugestia (z komentarzami) do wyboru i wybiera zachować nienaruszone!

Ostrzeżenie: Jeśli tworzysz elementy (więc nie są one w Domu), wymienić :hidden z [type=hidden] lub wszystkie pola będą ignorowane!

$(':input','#myform') 
    .removeAttr('checked') 
    .removeAttr('selected') 
    .not(':button, :submit, :reset, :hidden, :radio, :checkbox') 
    .val(''); 
+20

Proponuję usunąć atrybuty "sprawdzone" i "wybrane" zaraz po wyborze wejścia, a następnie odfiltrować: przycisk,: prześlij,: zresetuj,: ukryty,: radio i: pole wyboru, aby ustawić wartość pozostałych wejść na " ". W przeciwnym razie znajdziesz się w polach wyboru i radiach, które nie mają żadnych wartości po rozliczeniu. A więc wygląda to następująco: $ (': input', '#myform') .removeAttr ('checked') .removeAttr ('selected') .not (': button,: submit,: reset, : hidden,: radio,: checkbox ') .val (' '); –

+1

Powinieneś używać metody "reset()" w macierzystym javascript. @ see jwaern answer. Jeśli nie jesteś dobry w javascript, nadal możesz $ ("cokolwiek-selektor-jest"). Get (0) .reset(). Oczyść, nie usunie wartości z przycisku opcji i pól wyboru, zajmuje tylko jedną linię javascript, prawdopodobnie szybciej niż to rozwiązanie. – Bene

+0

To najlepsze rozwiązanie, dzięki! –

2

Możesz spróbować

$("#addRunner input").each(function(){ ... }); 

Wejścia nie są selektory, więc nie trzeba : nie testowałem go z kodem. Tylko szybkie przypuszczenie!

18

ja polecam przy użyciu starego dobrego javascript:

document.getElementById("addRunner").reset(); 
+0

@James Nie potrzebujesz '#' dla 'getElementById()', jest używane tylko dla * ciągów selektora * w takich rzeczach, jak jQuery '$ (...)' lub natywny odpowiednik JS 'querySelectorAll (...) '. – MTCoster

4

zajęło trochę wyszukiwanie i czytanie znaleźć metodę, która nadaje moją sytuację, złożyć na formularzu, należy uruchomić ajax do zdalnego skryptu php, na sukces/porażka informują użytkownika, przy wypełnieniu formularza.

Posiadałem pewne wartości domyślne, wszystkie inne metody związane z .val (''), nie resetując, ale czyszcząc formularz.

mam to też działać poprzez dodanie przycisku reset do formularza, który miał identyfikator myform:

$("#myform > input[type=reset]").trigger('click'); 

to dla mnie miało prawidłowy wynik na zresetowanie formę, no i nie zapomnij

event.preventDefault(); 

, aby zatrzymać wysyłanie formularza w przeglądarce, tak jak ja to zrobiłem :).

Pozdrowienia

Jacko

0

zorientowali się, co to było! Kiedy wyczyszczone pola przy użyciu metody each(), ale także otworzyło ukryte pole których php potrzebne do uruchomienia:

if ($_POST['action'] == 'addRunner') 

użyłem: nie() w sprawie wyboru, aby zatrzymać go od wyczyszczenie pola ukrytego .