#jquery
#jquery
Вопрос:
У меня есть поле ввода, в которое пользователь может либо вводить данные, либо вводить данные, щелкая элемент списка (который создает текст в строках «[текст]»), либо может вводить текст, перетаскивая элемент списка. Последние операции реализуются скриптом, представленным на этой странице.
Я хотел бы удалить лишние пробелы из поля ввода, когда пользователь вводит в него данные любыми способами (включая вышеуказанные, а также копирование и вставку). Я думал, что с этим справится следующее:
$('#my_input').on('change', function() {
$(this).val($(this).val().replace(/ ?/g, ' '));
});
Однако это не учитывает события перетаскивания и не вводит ввод щелчком мыши. Может кто-нибудь сказать мне, как справиться с удалением лишних пробелов при вводе, отбрасывании и щелчке? Спасибо.
РЕДАКТИРОВАТЬ: вот решение, основанное на ответе, предложенном ниже Николасом Хенрардом:
$('#my_input').on('propertychange keyup input paste drop click', function() {
$(this).val($(this).val().replace(/ ?/g, ' '));
});
$('.my_list_item').on('propertychange click', function() {
$('#my_input').val($('#my_input').val().replace(/ ?/g, ' '));
});
Недостатком этого, как и решения Николаса, является то, что он пренебрегает удалением пробелов, добавленных последним тегом, который был удален или нажат (т. Е. При отбрасывании или нажатии тега добавляется что-то вроде » [текст]», что оставляет дополнительный пробел, если перед этим был пробелэлемент до тех пор, пока, если решение выше не будет реализовано, не произойдет какое-либо другое взаимодействие с элементом списка или вводом). Это можно исправить, добавив .trim() ко второму .val обоих операторов выше, но это похоже на что-то вроде взлома. Есть идеи по решению этой проблемы с последним удаленным или нажатым тегом?
Комментарии:
1. вы просто хотите знать только, что пробелы должны быть удалены?
2. @ Pratik Joshi — Да, я хочу, чтобы пробелы были удалены только в упомянутых событиях.
Ответ №1:
Этот код jQuery улавливает немедленные изменения любого элемента и должен работать во всех браузерах:
$('.myElements').each(function() {
var elem = $(this);
// Save current value of element
elem.data('oldVal', elem.val());
// Look for changes in the value
elem.bind("propertychange keyup input paste", function(event){
// If value has changed...
if (elem.data('oldVal') != elem.val()) {
// Updated stored value
elem.data('oldVal', elem.val());
// Do action
....
}
});
});
Итак, вам нужно дождаться этих событий: propertychange keyup input paste
Комментарии:
1. Да, небольшое изменение этого должно позаботиться об этом. Спасибо!
Ответ №2:
Попробуйте использовать .focusOut(), это должно обрабатывать все события, как только пользователь покидает текстовое поле, независимо от щелчка, выпадения, вкладок и т. Д.
$('#my_input').on('focusout', function() {
$(this).val($(this).val().replace(/ ?/g, ' '));
});
Комментарии:
1. Это не в реальном времени, и буква «О» в focusout должна быть строчной, но это интересный способ решения этой проблемы. Спасибо! Я бы проголосовал за это, если бы у меня был представитель.
2. Да, буква «O» должна быть в нижнем регистре, но как это не работает в реальном времени, если вы используете .change()?
3. Что я имел в виду под «realtime», так это то, что он не будет изменять текст в момент его ввода / изменения пользователем — как вы сказали, он ожидает, пока пользователь выйдет из поля ввода, чтобы реализовать изменение.
4. Используете ли вы перетаскивание в пользовательском интерфейсе Jquery?
5. Да, с помощью перетаскивания пользовательского интерфейса jquery.