Как проверить, изменилось ли значение в событии размытия?
По сути, мне нужно проверить, изменяется ли значение в текстовом поле события размытия, чтобы, если значение не изменилось, я отменил событие размытия.
Если это возможно проверить, это значение изменено пользователем на событии размытия входного HTML-элемента?
Ответы
Ответ 1
Я не думаю, что есть собственный способ сделать это. Что бы я сделал, добавьте функцию в событие focus
, которое сохраняет текущее значение в переменной, прикрепленной к элементу (element.oldValue = element.value
). Вы можете проверить это значение onBLur.
Ответ 2
Вы не можете отменить событие размытия, вам нужно перефокусировать таймер. Вы можете либо настроить переменную onfocus, либо установить переменную hasChanged
в событии изменения. Событие размытия срабатывает после события изменения (к сожалению, для этой ситуации), иначе вы могли бы просто reset таймер в событии onchange.
Я бы применил подход, подобный этому:
(function () {
var hasChanged;
var element = document.getElementById("myInputElement");
element.onchange = function () { hasChanged = true; }
element.onblur = function () {
if (hasChanged) {
alert("You need to change the value");
// blur event can't actually be cancelled so refocus using a timer
window.setTimeout(function () { element.focus(); }, 0);
}
hasChanged = false;
}
})();
Ответ 3
В событии onblur
вы можете сравнить value
с defaultValue
, чтобы определить, произошло ли изменение:
<input onblur="if(this.value!=this.defaultValue){alert('changed');}">
defaultValue
будет содержать начальное значение объекта, тогда как value
будет содержать текущее значение объекта после внесения изменений.
Литература:
значение vs defaultValue
Ответ 4
Используя события JQuery, мы можем сделать эту логику
Шаг1: объявить переменную для сравнения значения
var lastVal ="";
Шаг 2: В фокусе получите последнее значение из ввода формы
$("#validation-form :input").focus(function () {
lastVal = $(this).val();
});
Шаг 3: по размытию сравните его
$("#validation-form :input").blur(function () {
if (lastVal != $(this).val())
alert("changed");
});
Ответ 5
Вы можете использовать этот код:
var Old_Val;
var Input_Field = $('#input');
Input_Field.focus(function(){
Old_Val = Input_Field.val();
});
Input_Field.blur(function(){
var new_input_val = Input_Field.val();
if (new_input_val != Old_Val){
// execute you code here
}
});
Ответ 6
Я знаю, что это старо, но я подумал, что поставлю это на случай, если кто-то захочет альтернативы. Это кажется уродливым (по крайней мере для меня), но для того, чтобы справиться с тем, как браузер обрабатывает индекс -1, это проблема. Да, я знаю, что это может быть сделано лучше с jquery.data, но я еще не знаком с этим.
Вот код HTML:
<select id="selected">
<option value="1">A</option>
<option value="2">B</option>
<option value="3">C</option>
</select>
Вот код javascript:
var currentIndex; // set up a global variable for current value
$('#selected').on(
{ "focus": function() { // when the select is clicked on
currentIndex = $('#selected').val(); // grab the current selected option and store it
$('#selected').val(-1); // set the select to nothing
}
, "change": function() { // when the select is changed
choice = $('#selected').val(); // grab what (if anything) was selected
this.blur(); // take focus away from the select
//alert(currentIndex);
//setTimeout(function() { alert(choice); }, 0);
}
, "blur": function() { // when the focus is taken from the select (handles when something is changed or not)
//alert(currentIndex);
//alert($('#selected').val());
if ($('#selected').val() == null) { // if nothing has changed (because it is still set to the -1 value, or null)
$('#selected').val(currentIndex); // set the value back to what it originally was (otherwise it will stay at what was newly selected)
} else { // if anything has changed, even if it the same one as before
if ($('#selected').val() == 2) { // in case you want to do something when a certain option is selected (in my case, option B, or value 2)
alert('I would do something');
}
}
}
});
Ответ 7
Что-то вроде этого. Используя Кевина Надсади выше предложение
this.value! = this.defaultValue
Я использую общий класс CSS для нескольких входов, а затем делаю:
for (var i = 0; i < myInputs.length; i++) {
myInputs[i].addEventListener('blur', function (evt) {
if(this.value!=this.defaultValue){
//value was changed now do your thing
}
});
myInputs[i].addEventListener('focus', function (evt) {
evt.target.setAttribute("value",evt.target.value);
});
}
Ответ 8
Даже если это старый пост, я подумал, что поделюсь способом сделать это с помощью простого JavaScript.
Часть JavaScript:
<script type="text/javascript">
function HideLabel(txtField){
if(txtField.name=='YOURBOXNAME'){
if(txtField.value=='YOURBOXNAME')
txtField.value = '';
else
txtField.select();
}
}
function ShowLabel(YOURBOXNAME){
if(txtField.name=='YOURBOXNAME'){
if(txtField.value.trim()=='')
txtField.value = 'YOURDEFAULTVALUE';
}
}
</script>
Ответ 9
Как и в посте @Kevin Nadsady, следующее будет работать в собственных функциях JS и событиях слушателя JQuery. В событии onblur вы можете сравнить значение со значением defaultValue:
$(".saveOnChange").on("blur", function () {
if (this.value != this.defaultValue) {
//Set the default value to the new value
this.defaultValue = this.value;
//todo: save changes
alert("changed");
}
});
Ответ 10
Почему бы просто не поддерживать собственный флаг на элементе ввода?
input.addEventListener('change', () => input.hasChanged = true);
input.addEventListener('blur', () =>
{
if (!input.hasChanged) { return; }
input.hasChanged = false;
// Do your stuff
});
https://jsfiddle.net/d7yx63aj