В jQuery есть ли простой способ проверить, изменились ли ЛЮБЫЕ элементы формы?
РЕДАКТИРОВАТЬ: я должен был добавить, что мне нужно только проверить click()
событие.
РЕДАКТИРОВАТЬ: Извините, я действительно должен был быть более конкретным! Скажем, у меня есть форма и кнопка со следующим:
$('#mybutton').click(function() {
// Here is where is need to test
if(/* FORM has changed */) {
// Do something
}
});
Как мне проверить, изменилась ли форма с момента загрузки?
javascript
jquery
Майк
источник
источник
Ответы:
Ты можешь это сделать:
$("form :input").change(function() { $(this).closest('form').data('changed', true); }); $('#mybutton').click(function() { if($(this).closest('form').data('changed')) { //do something } });
Это настраивает
change
обработчик событий для входов в форме, если какой-либо из них изменяется, он использует.data()
для установкиchanged
значенияtrue
, тогда мы просто проверяем это значение при щелчке, это предполагает, что оно#mybutton
находится внутри формы (если не просто заменить$(this).closest('form')
на$('#myForm')
), но вы можете сделать его еще более общим, например:$('.checkChangedbutton').click(function() { if($(this).closest('form').data('changed')) { //do something } });
Ссылки: Обновлено
Согласно jQuery, это фильтр для выбора всех элементов управления формой.
http://api.jquery.com/input-selector/
источник
$('form :input')
Учитывает ли выбор, текстовое поле и другие типы ввода? или это относится к тегу ввода?Если вы хотите проверить, изменились ли данные формы, которые будут отправлены на сервер, вы можете сериализовать данные формы при загрузке страницы и сравнить их с текущими данными формы:
$(function() { var form_original_data = $("#myform").serialize(); $("#mybutton").click(function() { if ($("#myform").serialize() != form_original_data) { // Something changed } }); });
источник
Простое решение в реальном времени:
$('form').on('keyup change paste', 'input, select, textarea', function(){ console.log('Form changed!'); });
источник
'input'
вместо'keyup change'
обработки вставки правой кнопкой мыши, если вам не нужна поддержка старых браузеров.Вы можете использовать несколько селекторов, чтобы присоединить обратный вызов к событию изменения для любого элемента формы.
$("input, select").change(function(){ // Something changed });
РЕДАКТИРОВАТЬ
Поскольку вы упомянули, что вам это нужно только для щелчка, вы можете просто изменить мой исходный код на это:
$("input, select").click(function(){ // A form element was clicked });
РЕДАКТИРОВАТЬ # 2
Хорошо, вы можете установить глобал, который будет установлен после того, как что-то было изменено следующим образом:
var FORM_HAS_CHANGED = false; $('#mybutton').click(function() { if (FORM_HAS_CHANGED) { // The form has changed } }); $("input, select").change(function(){ FORM_HAS_CHANGED = true; });
источник
Глядя на обновленный вопрос, попробуйте что-нибудь вроде
$('input, textarea, select').each(function(){ $(this).data("val", $(this).val()); }); $('#button').click(function() { $('input, textarea, select').each(function(){ if($(this).data("val")!==$(this).val()) alert("Things Changed"); }); });
Для исходного вопроса используйте что-то вроде
$('input').change(function() { alert("Things have changed!"); });
источник
<textarea>
или<select>
.boolean
установить значение true, когда происходит изменение. Кроме того, это все еще не зависит от формы, что, если бы на странице были другие формы?$('form :input').change(function() { // Something has changed });
источник
Вот изящное решение.
Для каждого элемента ввода в форме есть скрытое свойство, которое можно использовать, чтобы определить, было ли изменено значение. У каждого типа ввода есть собственное имя свойства. Например
text/textarea
него defaultValueselect
это defaultSelectcheckbox/radio
это defaultCheckedВот пример.
function bindFormChange($form) { function touchButtons() { var changed_objects = [], $observable_buttons = $form.find('input[type="submit"], button[type="submit"], button[data-object="reset-form"]'); changed_objects = $('input:text, input:checkbox, input:radio, textarea, select', $form).map(function () { var $input = $(this), changed = false; if ($input.is('input:text') || $input.is('textarea') ) { changed = (($input).prop('defaultValue') != $input.val()); } if (!changed && $input.is('select') ) { changed = !$('option:selected', $input).prop('defaultSelected'); } if (!changed && $input.is('input:checkbox') || $input.is('input:radio') ) { changed = (($input).prop('defaultChecked') != $input.is(':checked')); } if (changed) { return $input.attr('id'); } }).toArray(); if (changed_objects.length) { $observable_buttons.removeAttr('disabled') } else { $observable_buttons.attr('disabled', 'disabled'); } }; touchButtons(); $('input, textarea, select', $form).each(function () { var $input = $(this); $input.on('keyup change', function () { touchButtons(); }); }); };
Теперь просто прокрутите формы на странице, и вы увидите, что кнопки отправки отключены по умолчанию, и они будут активированы ТОЛЬКО в том случае, если вы действительно измените какое-либо значение ввода в форме.
$('form').each(function () { bindFormChange($(this)); });
Реализация в виде
jQuery
плагина находится здесь https://github.com/kulbida/jmodifiableисточник
var formStr = JSON.stringify($("#form").serializeArray()); ... function Submit(){ var newformStr = JSON.stringify($("#form").serializeArray()); if (formStr != newformStr){ ... formChangedfunct(); ... } else { ... formUnchangedfunct(); ... } }
источник
Вам нужен плагин jQuery Form Observe . Это то, что вы ищете.
источник
Расширяя ответ Уди, это проверяет только отправку формы, а не каждое изменение ввода.
$(document).ready( function () { var form_data = $('#myform').serialize(); $('#myform').submit(function () { if ( form_data == $(this).serialize() ) { alert('no change'); } else { alert('change'); } }); });
источник
Во-первых, я бы добавил в вашу форму скрытый ввод, чтобы отслеживать состояние формы. Затем я бы использовал этот фрагмент jQuery, чтобы установить значение скрытого ввода, когда что-то в форме изменяется:
$("form") .find("input") .change(function(){ if ($("#hdnFormChanged").val() == "no") { $("#hdnFormChanged").val("yes"); } });
Когда ваша кнопка нажата, вы можете проверить состояние вашего скрытого ввода:
$("#Button").click(function(){ if($("#hdnFormChanged").val() == "yes") { // handler code here... } });
источник
$('form[name="your_form_name"] input, form[name="your_form_name"] select').click(function() { $("#result").html($(this).val()); });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <h2>Form "your_form_name"</h2> <form name="your_form_name"> <input type="text" name="one_a" id="one_a" value="AAAAAAAA" /> <input type="text" name="one_b" id="one_b" value="BBBBBBBB" /> <input type="text" name="one_c" id="one_c" value="CCCCCCCC" /> <select name="one_d"> <option value="111111">111111</option> <option value="222222">222222</option> <option value="333333">333333</option> </select> </form> <hr/> <h2>Form "your_other_form_name"</h2> <form name="your_other_form_name"> <input type="text" name="two_a" id="two_a" value="DDDDDDDD" /> <input type="text" name="two_b" id="two_b" value="EEEEEEEE" /> <input type="text" name="two_c" id="two_c" value="FFFFFFFF" /> <input type="text" name="two_d" id="two_d" value="GGGGGGGG" /> <input type="text" name="two_e" id="two_f" value="HHHHHHHH" /> <input type="text" name="two_f" id="two_e" value="IIIIIIII" /> <select name="two_g"> <option value="444444">444444</option> <option value="555555">555555</option> <option value="666666">666666</option> </select> </form> <h2>Result</h2> <div id="result"> <h2>Click on a field..</h2> </div>
В дополнение к вышеупомянутому ответу @ JoeD.
Если вы хотите настроить таргетинг на поля в определенной форме (при условии, что существует более одной формы), а не только на поля, вы можете использовать следующий код:
$('form[name="your_form_name"] input, form[name="your_form_name"] select').click(function() { // A form element was clicked });
источник
$('form').find('input,select')
$.fn.find
- быстрее, чем даже$.fn.filter
- для ссылки на дочерние элементы, а не использовать дочерние селекторы. vaughnroyko.com/the-real-scoop-on-jquery-find-performanceПопробуй это:
<script> var form_original_data = $("form").serialize(); var form_submit=false; $('[type="submit"]').click(function() { form_submit=true; }); window.onbeforeunload = function() { //console.log($("form").submit()); if ($("form").serialize() != form_original_data && form_submit==false) { return "Do you really want to leave without saving?"; } }; </script>
источник