2014-11-07 15 views
17

Tôi muốn biết liệu một biểu mẫu đã thay đổi chưa. Biểu mẫu có thể chứa bất kỳ phần tử biểu mẫu nào, chẳng hạn như đầu vào, chọn, văn bản v.v ... Về cơ bản, tôi muốn có cách hiển thị cho người dùng mà họ chưa lưu thay đổi được thực hiện cho biểu mẫu.Sử dụng jQuery, làm thế nào tôi có thể tìm thấy nếu một biểu mẫu đã thay đổi?

Tôi làm cách nào để thực hiện việc này bằng jQuery?

Để làm rõ: Tôi muốn bắt BẤT CỨ thay đổi về hình thức, không chỉ đến các yếu tố đầu vào nhưng cho tất cả các yếu tố hình thức khác là tốt, textarea, chọn, vv

+0

Khi nào bạn muốn hiển thị/kiểm tra xem? – dfsq

+0

@dfsq, nếu biểu mẫu được sửa đổi và người dùng nhấp vào tab ĐÓNG hoặc chuyển đến trang khác, để cảnh báo anh ta, rằng PLz lưu các thay đổi bạn đã thực hiện. –

+1

Vui lòng tham khảo bài đăng sau http://stackoverflow.com/questions/3025396/jquery-form-change – user3275109

Trả lời

44

Cách tiếp cận tôi thường lấy trong ví dụ một trường hợp là tôi kiểm tra giá trị biểu mẫu được tuần tự hóa. Vì vậy, ý tưởng là bạn tính toán trạng thái biểu mẫu ban đầu với phương thức $.fn.serialize. Sau đó, khi cần bạn chỉ cần so sánh trạng thái hiện tại với chuỗi được tuần tự hóa ban đầu.

Để nhắm mục tiêu tất cả các yếu tố đầu vào (chọn, văn bản, hộp kiểm, văn bản đầu vào, v.v.) trong một biểu mẫu bạn có thể sử dụng bộ chọn giả :input.

Ví dụ:

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

Câu trả lời hay. Tuy nhiên, tại sao không làm việc này mà không serializing? Tôi có nghĩa là, có cách nào để làm điều này mà không serializing? – Weblurk

+2

Bạn cần một cách để so sánh ** tất cả các giá trị phần tử biểu mẫu **. Tôi chỉ thấy rằng serialization là cách rất thuận tiện để làm điều đó. Nó chỉ là một dòng mã. Và chuỗi này chỉ phụ thuộc vào giá trị đầu vào, chính xác những gì chúng ta cần. Nó cũng hoạt động đúng khi người dùng hoàn nguyên các thay đổi. Chuỗi được tuần tự hóa cũng trở lại giá trị ban đầu của nó. – dfsq

+1

Hoạt động tuyệt vời. Cảm ơn bạn. – kwoxer

Các vấn đề liên quan