Додайте type="search"
свій внесок
Підтримка є досить пристойною, але в IE <10 не працюватиме
Очищення даних для старих браузерів
Якщо вам потрібна підтримка IE9, ось кілька вирішень
Використання стандартних <input type="text">
та деяких елементів HTML:
/**
* Clearable text inputs
*/
$(".clearable").each(function() {
var $inp = $(this).find("input:text"),
$cle = $(this).find(".clearable__clear");
$inp.on("input", function(){
$cle.toggle(!!this.value);
});
$cle.on("touchstart click", function(e) {
e.preventDefault();
$inp.val("").trigger("input");
});
});
/* Clearable text inputs */
.clearable{
position: relative;
display: inline-block;
}
.clearable input[type=text]{
padding-right: 24px;
width: 100%;
box-sizing: border-box;
}
.clearable__clear{
display: none;
position: absolute;
right:0; top:0;
padding: 0 8px;
font-style: normal;
font-size: 1.2em;
user-select: none;
cursor: pointer;
}
.clearable input::-ms-clear { /* Remove IE default X */
display: none;
}
<span class="clearable">
<input type="text" name="" value="" placeholder="">
<i class="clearable__clear">×</i>
</span>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Використання лише <input class="clearable" type="text">
(Без додаткових елементів)
встановити class="clearable"
і грати з його фоновим зображенням:
/**
* Clearable text inputs
*/
function tog(v){return v?'addClass':'removeClass';}
$(document).on('input', '.clearable', function(){
$(this)[tog(this.value)]('x');
}).on('mousemove', '.x', function( e ){
$(this)[tog(this.offsetWidth-18 < e.clientX-this.getBoundingClientRect().left)]('onX');
}).on('touchstart click', '.onX', function( ev ){
ev.preventDefault();
$(this).removeClass('x onX').val('').change();
});
// $('.clearable').trigger("input");
// Uncomment the line above if you pre-fill values from LS or server
/* Clearable text inputs */
.clearable{
background: #fff url(http://i.stack.imgur.com/mJotv.gif) no-repeat right -10px center;
border: 1px solid #999;
padding: 3px 18px 3px 4px; /* Use the same right padding (18) in jQ! */
border-radius: 3px;
transition: background 0.4s;
}
.clearable.x { background-position: right 5px center; } /* (jQ) Show icon */
.clearable.onX{ cursor: pointer; } /* (jQ) hover cursor style */
.clearable::-ms-clear {display: none; width:0; height:0;} /* Remove IE default X */
<input class="clearable" type="text" name="" value="" placeholder="" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
демонстрація jsBin
Трюк полягає в тому, щоб встановити кілька правильних накладок (я використав 18 пікселів) до input
та натиснути фонове зображення праворуч, поза полем зору (я використовував right -10px center
).
Ця накладка з 18 пікселів запобігає приховуванню тексту під піктограмою (поки видно).
jQ додасть клас x
(якщо він input
має значення), що відображатиме чітку піктограму.
Тепер все, що нам потрібно, - це націлити на jQ входи з класом x
і виявити, mousemove
чи знаходиться миша в цій області 18 х "х"; якщо всередині, додайте клас onX
.
Клацання onX
класом видаляє всі класи, скидає вхідне значення та приховує піктограму.
7x7px gif:
Base64 рядок:
data:image/gif;base64,R0lGODlhBwAHAIAAAP///5KSkiH5BAAAAAAALAAAAAAHAAcAAAIMTICmsGrIXnLxuDMLADs=