#javascript #jquery
#javascript #jquery
Вопрос:
Пытаюсь изучить jquery для реализации функции автосохранения и нуждаюсь в некоторой помощи. У меня есть некоторый код для отслеживания состояния полей формы, чтобы увидеть, произошли ли какие-либо изменения. Все работает, но мне нужно отслеживать изменения только в определенной форме, а не во всех входных данных формы на странице. На одной странице есть окно поиска и форма рассылки новостей, и когда эти поля формы изменены, они также обнаруживаются, которые мне нужно как-то отфильтровать или, что еще лучше, настроить таргетинг только на определенную форму.
$(function(){
setInterval("CheckDirty()",10000);
$(':input').each(function() {
$(this).data('formValues', $(this).val());
});
});
function CheckDirty()
{
var isDirty = false;
$(':input').each(function () {
if($(this).data('formValues') != $(this).val()) {
isDirty = true;
}
});
if(isDirty == true){
alert("isDirty=" isDirty);
}
}
Ответ №1:
Просто добавьте класс в форму и используйте его для фильтрации
$('.form :input').each(function() {
$(this).data('formValues', $(this).val());
});
Редактировать
Просто предложение, вы можете прикрепить событие изменения непосредственно к форме
живая демо — версия здесь: http://jsfiddle.net/jomanlk/kNx8p/1 /
<form>
<p><input type='text'></p>
<p><input type='text'></p>
<p><input type='checkbox'></p>
</form>
<p><input type='text'></p>
<div id='log'></div>
$('form :input').change(function(){
$('#log').prepend('<p>Form changed</p>')
});
Вы можете легко улучшить это, добавив таймер и сделав так, чтобы он сохранялся каждые xx секунд.
Комментарии:
1. Хотя вы можете прикрепить событие изменения непосредственно к форме в Firefox (и, вероятно, других), оно не работает в IE8, если вы используете jQuery 1.3.2 или ниже… Я думаю , это зависит от того, работает ли .live () с .change() . jsfiddle.net/kNx8p/17
Ответ №2:
var $jq= jQuery.noConflict();
$jq(function() { $jq('#extensibleForm').data('serialize',$jq('#extensibleForm').serialize());
});
function formHasChanged(){
if($jq('#extensibleForm').serialize()!=$jq('#extensibleForm').data('serialize')){
alert("Data Changed....");
return (false);
}
return true;
}
Ответ №3:
какой идентификатор вашей формы?
вам просто нужно сделать ваш селектор более конкретным 🙂
вместо $(':input').each(function() {
использование
$('#yourFormId').find(':input').each(function() {
Ответ №4:
Вы можете использовать .change()
функцию, а затем использовать $(this)
для обозначения того, что вы хотите работать только с полем, которое активно изменяется.
$('#myForm input[type="text"]').change(function() {
$(this)...
});
Редактировать: #myForm — это ваш идентификатор формы, поэтому вы можете настроить таргетинг на определенную форму. Вы даже можете указать просто поля type=»text» внутри этой формы, как в моем примере.
Комментарии:
1.
$('#myForm input:text')
выбирает те же элементы, но немного более лаконично …:text
-selector .
Ответ №5:
Здесь вы можете увидеть, как это работает: http://jsfiddle.net/paska/zNE2C /
$(function(){
setInterval(function() {
$("#myForm").checkDirty();
},10000);
$("#myForm :input").each(function() {
$(this).data('formValues', $(this).val());
});
$.fn.checkDirty = function() {
var isDirty = false;
$(this).find(':input').each(function () {
if($(this).data('formValues') != $(this).val()) {
isDirty = true;
}
});
if(isDirty == true){
alert("isDirty=" isDirty);
}
};
});
Ответ №6:
Я думаю, вы можете использовать класс, чтобы выбрать тип ввода, который вы хотите.
<input class="savethis" ... />
Затем в jQuery используйте это.
$(':input .savethis').each(function() { ...
Ответ №7:
Вы можете указать атрибут id (скажем theForm
) для вашего элемента формы, а затем выбрать только те поля ввода внутри него.
затем попробуйте выбрать с
$(':input', '#theForm')
Ответ №8:
Я уважаю все рабочие ответы, но для меня, я думаю, использование focus
события может быть намного лучше, чем change
event. Вот как я выполнил свою функцию watchChange () на JS:
var changeInterval = 0;
var changeLength = 0; //the length of the serverData
var serverData = {value:''}; //holds the data from the server
var fieldLength = 0; //the length of the value of the field we are tracking
var frequency = 10000;
function watchChange() {
$input.on('focus', function() {
var $thisInput = $(this);
//we need the interval value so that we destroy
//setInterval when the input loses focus.
changeInterval = setInterval(function() {
changeLength = serverData.value.length;
fieldLength = $thisInput.val().length;
//we only save changes if there is any modification
if (changeLength !== fieldLength) {
$.ajax({
url: 'path/to/data/handler',
dataType: 'json',
data: "data=" $thisInput.val(),
method: 'post'
}).done(function(data) {
serverData = data;
}); //end done
} //end if
}, frequency); //end setInterval
//and here we destroy our watcher on the input
//when it loses focus
}).on('blur', function() {
clearInterval(changeInterval);
});
}
Хотя этот подход кажется наивным, но он дал мне то, что я хотел!