22 декабря 2015
8 июля 2009
51
Создаем кнопочку отмены на текстовом поле
Сегодня я расскажу о создании jQuery-плагина, который из обыкновенного текстового инпута делает инпут как на картинке слева.
Начнем. Без лишних слов.
Примерчики
Текстовое поле с возможностью отмены вы можете увидеть на яндексе (если в качестве браузера используете Safari или Google Chrome)
Или на вебораме (они по-моему даже крестик используют одинаковый):
UPD. Как выяснилось, заслуги авторов вышеупомянутых сайтов в этом мало. Дело в том, что если у текстового указано type = 'search', то такой крестик автоматически будет появляться в браузерах Хром и Сафари. Спасибо анонимному читателю за информацию.
Еще такую функцию можно увидеть в Виндуз Виста:
Что и зачем?
Принцип работы крестика элементарен как кирпич. Крестик появляется, когда в текстовом поле есть какой-то текст. При нажатии на крестик, текст из поля стирается. Не надо долго зажимать Backspace или совершать другие телодвижения, вроде Ctrl+A, Del.
Особенно такая функция полезна при использовании мобильных девайсов вроде iPod Touch или iPhone. Более того, в i-девайсах такая функция является привычной: в адресной строке браузера там всегда появляется крестик и им постоянно и с удовольствием пользуешься.
За работу
В первый день я создал HTML:
<div class="inputWrapper">
<input id="searchInput" type="text" />
</div>
Во второй подключил jQuery.
В третий нарисовал крестик: .
В четвертый создал макет для jQuery-плагина.
В пятый написал плагин. Комменты привожу в коде.
(function($) {
$.fn.AddXbutton = function(options) {
var defaults = {
img: 'x.gif'//расположение картинки крестика по-умолчанию (относительно страницы, на которой находится инпут)
};
var opts = $.extend(defaults, options);
$(this)
.after($('<input type="image" id="xButton" src="' + opts['img'] + '" />') //после текстового инпута вставляем image-input
.css({ 'display': 'none', 'cursor': 'pointer', 'marginLeft': '-15px' })// делаем его стильным
.click(function() { //вешаем обработчик на клик
$('#searchInput').val('').focus();
$('#xButton').hide();
}))
.keyup(function() { //на кейап мы проверяем, показывать нам крестик или нет
if ($(this).val().length > 0) {
$('#xButton').show(); //если текст какой-нибудь есть, но показываем
} else {
$('#xButton').hide();
}
});
if ($(this).val() != '') $('#xButton').show(); //если при загрузке страницы в текстовом поле что-то есть, крестик надо сразу показать (например, при обновлении страницы)
};
})(jQuery);
Все. Теперь вызываем функцию AddXbutton при загрузке страницы:
$(document).ready(function() {
$('#searchInput').AddXbutton({ img: 'images/x.gif' });
$('#searchInput').focus();
});
Спасибо за внимание!
Смотрим демо Загружаем архив с примером Загружаем плагин
UPD. Спасибо читателям за дельные замечания. Благодаря вам наш несложный плагин эволюционировал и стал более толковым.
Новый код плагина:
(function($) {
$.fn.AddXbutton = function(options) {
var defaults = {
img: 'x.gif'
};
var opts = $.extend(defaults, options);
$obj = $(this);
$(this).each(
function(i) {
$(this).after(
$('<input type="image" id="xButton' + i + '" src="' + opts['img'] + '" />')
.css({ 'display': 'none', 'cursor': 'pointer', 'marginLeft': '-15px' })
.click(function() {
$obj.val('').focus();
$("#xButton" + i).hide();
}))
.keyup(function() {
if ($(this).val().length > 0) {
$("#xButton" + i).show();
} else {
$("#xButton" + i).hide();
}
if ($(this).val() != '') $("#xButton" + i).show();
});
});
};
})(jQuery);
Демо [Updated] Плагин [Updated]
Нада будет взять на заметку.
так что думаю полезна штука... тем более никто не отменял комбинацию клавишь если вам удобно пользоваться клавой, в данном случае ещё и "мышатникам" добавили удобство
Вообще конечно в десктопных прогах много таких мелочей, которые сделают сайты удобнее и красивее... дело в том что не все это замечают и применяют
Извините, Glader. В ближайшее время отписку поправим.
Только хотел намекнуть на изменения в этой строчке кода
А Ву уже все исправил :-)
Молодец!!!
И я, честно говоря, не знаю как отловить эту вставку с помощью мыши.
jquery.form.js
то при проверки формы и выдаче ошибки плагином, ваш крестик съезжает : ((
В этой версии присваивается абсолютное позиционирование к крестику и добавляется верхний маргин:
Но если человек нажмет Tab, Enter либо мышью на кнопку, то всё ок.
Такого тайпа у инпута быть не может:
http://www.w3.org/TR/html401/interact/forms.html#input-control-types
Zhenya, форму можно понять. Как выяснилось, input type='image' является сабмит батоном, а не просто кнопкой. Поэтому изменив следующие строчки в плагине:
Мы будем вставлять input type = button. А форма уже будет сабмититься, используя Ваш сабмит батон.
Обновленный плагин можно найти здесь
И не имеет никакого смысла ставить здесь type=search. Такой инпут ничем не отличается от input type='text'. Разница исключительно семантическая.
Но для всех прочих браузеров нужен плагин.
http://upload.wikimedia.org/wikipedia/commons/thumb/5/54/KDE_4.png/800px-KDE_4.png
Первое поле "To" - справа у конца поля черного цвета.
И так появляется на всех текстовых полях, которые рисуются через кеды, в гномовских (и в том числе в firefox) не рисуется ;(
Из-за использования id для инеднификации элементов нельзя иметь на странице несколько таких полей. Неправильный плагин получается.
Как такое можно исправить?? у меня никак не получается. Помогите пожалуйста
в этом скрипте есть возможность использовать несколько Id на странице в таком виде:
$("#id1, #id2, id3, ...").AddXbutton({img:'x.gif'});
а мне нужно что можно было так:
$("#id1").AddXbutton({img:'x.gif'});
$("#id2").AddXbutton({img:'y.gif'});
$("#id3").AddXbutton({img:'z.gif'});
что бы для каждого можно было использавать свои настройки.
Помогите пожалуйста...
http://wintoni.us/post/123029056/jquery-plugin-patterns
посмотрите на указанной странице то, что найдётся над строкой "data store to associate options with each individual element".
Это решение для сохранения опций к каждому элементу.
Да, возникнет проблема с идентификаторами крестика.
Надо поменять "#xButton" + i на что-то вроде "#xButton" + $obj.attr('id')
Надеюсь, хоть кому-нибудь это поможет)))