jQuery: очистка входных данных формы - PullRequest
59 голосов
/ 17 октября 2011

Я пытался разными способами очистить форму:

<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('');
}

Это прекрасно работает.

jQuery # 2:

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

Это очищает форму, но не позволяет мне предоставлять ей какую-либо информацию. Я пытаюсь снова нажать кнопку, и она ничего не делает.

Вот обработчик нажатия кнопки:

$("#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 Почтовый индекс:

<?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;
}

}

Если я использую метод jQuery # 2, я получаю эту ошибку в консоли:

Uncaught TypeError: Cannot read property 'status' of null

Почему это происходит?

Я забыл включить эту ключевую информацию:

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

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

Это отправляет сообщение обратно в функцию AJAX в jQuery. Похоже, что после того, как я отправил форму один раз, используя метод # 2, сообщения об успехе / неудаче исчезли.

Ответы [ 5 ]

148 голосов
/ 17 октября 2011

Демо: http://jsfiddle.net/xavi3r/D3prt/

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

Оригинальный ответ: Сброс многоступенчатой ​​формы с помощью jQuery


Предложение Майка (из комментариев)оставить флажок и выбрать нетронутым!

Предупреждение: Если вы создаете элементы (поэтому их нет в dom), замените :hidden на [type=hidden], или все поля будутбыть проигнорированным!

$(':input','#myform')
  .removeAttr('checked')
  .removeAttr('selected')
  .not(':button, :submit, :reset, :hidden, :radio, :checkbox')
  .val('');
19 голосов
/ 06 июня 2013

Я бы порекомендовал использовать старый добрый javascript:

document.getElementById("addRunner").reset();
4 голосов
/ 17 июля 2013

Потребовался поиск и чтение, чтобы найти метод, подходящий для моей ситуации: при отправке формы запустите ajax для удаленного сценария php, при успешном / неудачном информировании пользователя, при полной очистке формы.

У меня былнекоторые значения по умолчанию, все другие методы включали .val (''), таким образом, не сбрасывая, а очищая форму.

Я тоже получил эту работу, добавив кнопку сброса в форму с идентификатором myform:

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

Это для меня верный результат при сбросе формы, о, и не забудьте

event.preventDefault();

, чтобы остановить отправку формы в браузере, как я сделал :).

С уважением

Джако

2 голосов
/ 17 октября 2011

Вы можете попробовать

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

Входы не являются селекторами, поэтому вам не нужно : Не проверял это с вашим кодом. Просто быстрое предположение!

0 голосов
/ 27 декабря 2014

Я понял, что это было!Когда я очистил поля с помощью метода each (), он также очистил скрытое поле, которое должен был запустить php:

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

Я использовал: not () в выделении, чтобы остановить его очисткускрытое поле.

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