2014-11-07 3 views
17

Я хочу знать, изменилась ли форма вообще. Форма может содержать любой элемент формы, такой как input, select, textarea и т. Д. В принципе, я хочу, чтобы пользователь отображал несохраненные изменения в форме.Использование jQuery, как я могу найти, изменилась ли форма?

Как это сделать с помощью jQuery?

Для уточнения: я хочу, чтобы поймать любые изменения в форме, а не только для элементов ввода, но для всех остальных элементов формы, а также, текстовое поле, выберите т.д.

+0

Когда вы хотите, чтобы показать/проверить? – dfsq

+0

@dfsq, если форма изменена, и пользователь нажимает на вкладку «ЗАКРЫТЬ» или переходит на другую страницу, чтобы предупредить его, что внесенные изменения PLz сохраняются. –

+1

Пожалуйста, обратитесь следующее сообщение http://stackoverflow.com/questions/3025396/jquery-form-change – user3275109

ответ

44

подход, который я обычно принимать в такой Дело в том, что я проверяю значение сериализованной формы. Таким образом, идея состоит в том, что вы вычисляете начальное состояние формы с помощью метода $.fn.serialize. Затем при необходимости вы просто сравниваете текущее состояние с исходной сериализованной строкой.

Чтобы настроить таргетинг на все элементы ввода (выберите, текстовое поле, флажок, ввод-текст и т. Д.) В форме, вы можете использовать псевдоселектор :input.

Например:

var $form = $('form'), 
 
    origForm = $form.serialize(); 
 

 
$('form :input').on('change input', function() { 
 
    $('.change-message').toggle($form.serialize() !== origForm); 
 
});
.change-message { 
 
    display: none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<form> 
 
    <div class="change-message">You have unsaved changes.</div> 
 
    <div> 
 
     <textarea name="description" cols="30" rows="3"></textarea> 
 
    </div> 
 
    <div>Username: <input type="text" name="username" /></div> 
 
    <div> 
 
     Type: 
 
     <select name="type"> 
 
      <option value="1">Option 1</option> 
 
      <option value="2" selected>Option 2</option> 
 
      <option value="3">Option 3</option> 
 
     </select> 
 
    </div> 
 
    <div> 
 
     Status: <input type="checkbox" name="status" value="1" /> 1 
 
     <input type="checkbox" name="status" value="2" /> 2 
 
    </div> 
 
</form>

+0

Отличный ответ. Quesiton, хотя, почему это не работает без сериализации? Я имею в виду, есть ли способ сделать это без сериализации? – Weblurk

+2

Ну, вам нужно сравнить все ** значения элементов формы. Я просто нашел, что сериализация - очень удобный способ сделать это. Это только одна строка кода. И эта строка зависит только от входных значений, именно того, что нам нужно. Он также правильно работает, когда пользователь возвращается к изменениям. Сериализованная строка также возвращается к исходному значению. – dfsq

+1

Прекрасно работает. Спасибо. – kwoxer

Смежные вопросы