Событие ввода не работает, если значение изменено с помощью jQuery val() или JavaScript
Если я программно изменяю значение поля ввода, события input
и change
не запускаются. Например, у меня есть такой сценарий:
var $input = $('#myinput');
$input.on('input', function() {
// Do this when value changes
alert($input.val());
});
$('#change').click(function() {
// Change the value
$input.val($input.val() + 'x');
});
<input id="myinput" type="text" />
<button id="change">Change value</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
Ответы
Ответ 1
Простое решение:
Триггерный input
после вызова val()
:
$input.trigger("input");
var $input = $("#myinput");
$input.on('input', function() {
alert($(this).val());
});
$('#change').click(function() {
// Change the value and trigger input
$input.val($input.val() + 'x').trigger("input");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input id="myinput" type="text" />
<button id="change">Change value</button>
Ответ 2
Есть несколько способов достижения этого. Здесь вы можете использовать событие levelup HTML oninput()
, которое происходит сразу же после изменения элемента и вызова функции.
<input id="myinput" type="text" oninput="sample_func()" />
<button id="change">Change value</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
.
var input = $("#myinput");
function sample_func(){
alert(input.val());
}
$('#change').click(function() {
input.val(input.val() + 'x');
});
Или это jQuery, input
вещь (просто связанная с приведенным выше примером).
<input id="myinput" type="text" />
<button id="change">Change value</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
.
var input = $("#myinput");
input.on("input", function() {
alert(input.val());
});
$('#change').click(function() {
input.val(input.val() + 'x');
});
Вы также можете использовать javascript setInterval()
, который постоянно работает с заданным интервалом времени. Это только необязательно и лучше, если вы выполняете программу, связанную с временем.
<input id="myinput" type="text" />
<button id="change">Change value</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
.
var input = $("#myinput");
setInterval(function() { ObserveInputValue(input.val()); }, 100);
$('#change').click(function() {
input.val(input.val() + 'x');
});
Ответ 3
Похоже, что нет способа, кроме использования .trigger()
.
Попробуйте использовать то же самое, используя событие .change()
:
var $input = $("#myinput");
$input.on('change paste keyup', function() {
alert($(this).val());
});
$('#change').click(function() {
$input.val($input.val() + 'x').trigger("change");
});
<input id="myinput" type="text" />
<button id="change">Change value</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
Ответ 4
Слушатели jQuery работают только с фактическими событиями в браузере, и они не бросаются при программном изменении.
Вы можете создать собственное миниатюрное расширение jQuery для прокси-сервера таким образом, чтобы вы всегда запускали событие, но только должны делать это в одном модульном месте, например:
$.fn.changeTextField = function (value) {
return $(this).val(value).trigger("change");
}
Затем просто вызовите свою новую функцию, когда хотите обновить текстовое поле, вместо использования функции jQuery 'val':
$("#myInput").changeTextField("foo");
Здесь версия, работающая с прокси-функцией:
<!DOCTYPE html>
<html>
<head>
<title>Test stuff</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
</head>
<body>
<input id="myInput" type="text" />
<button id="myButton">Change value</button>
<script type="text/javascript">
$.fn.changeTextField = function (value) {
return $(this).val(value).trigger("change");
}
$( document ).ready(function() {
var $input = $("#myInput");
$input.on("change", function() {
alert($input.val());
});
$('#myButton').click(function() {
$("#myInput").changeTextField("foo");
});
});
</script>
</body>
</html>
Для справки, этот вопрос действительно уже был дан здесь:
Почему событие изменения jquery не запускается, когда я устанавливаю значение select с помощью val()?
и здесь: JQuery обнаружение события изменения программы
Ответ 5
var $input = $('#myinput');
$input.on('input', function() {
// Do this when value changes
alert($input.val());
});
$('#change').click(function() {
// Change the value
$input.val($input.val() + 'x');
});
<input id="myinput" type="text" />
<button id="change">Change value</button>
<script src="*https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js*"></script>
Ответ 6
Триггер не работает для. Создание события и диспетчеризация с нативным JavaScript сделали свою работу.
Источник: fooobar.com/questions/44107/...
<script type="text/javascript">
$.fn.changeTextField = function (value) {
return $(this).val(value).dispatchEvent(new Event("input", { bubbles: true });
}
$( document ).ready(function() {
var $input = $("#myInput");
$input.on("change", function() {
alert($input.val());
});
$('#myButton').click(function() {
$("#myInput").changeTextField("foo");
});
});
</script>
Ответ 7
$input.val($input.val() + 'x')
$input.trigger('change');
Событие изменения срабатывает только при размытии ввода.