Очистити значок всередині вхідного тексту


185

Чи є швидкий спосіб створити вхідний текстовий елемент із піктограмою праворуч, щоб очистити сам елемент введення (наприклад, поле пошуку Google)?

Я озирнувся, але знайшов лише те, як поставити значок як фон вхідного елемента. Чи є плагін jQuery чи щось інше?

Я хочу, щоб піктограма всередині елемента введення тексту була приблизно такою:

--------------------------------------------------
|                                               X|
--------------------------------------------------

3
Плагін jQuery для розміщення зображення над полем введення? Я щось пропускаю чи що ?!
Крістіан

1
@Christian Sciberras Як видно з відповіді, яку я вибрав, це може бути плагін jquery ...
Giovanni Di Milia

1
Ви можете мати плагін jQuery, щоб показувати звичайні поля попередження. Це не означає, що вам дійсно потрібно , і в більшості випадків це надмірно розроблений наліт . Ну і до речі, те, що ви вибрали, - це не плагін jQuery , а суміш javascript, html та css. Плагіном буде єдиний файл / скрипт з підписом jQuery, що містить відповідні дані.
Крістіан

1
@Christian Sciberras: Я можу розрізняти плагін jQuery та суміш javascript та CSS. Що я казав, це те, що якщо ви хочете зробити щось приємне, ви не можете помістити лише зображення на поле введення.
Джованні Ді Мілія

Люди, які шукають цю проблему, також потребуватимуть цієї інформації: Як ви виявите очищення введення HTML5 для пошуку?
brasofilo

Відповіді:


342

Додайте type="search"свій внесок
Підтримка є досить пристойною, але в IE <10 не працюватиме

<input type="search">

Очищення даних для старих браузерів

Якщо вам потрібна підтримка 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">&times;</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: Очистити значок 7x7

Base64 рядок:

data:image/gif;base64,R0lGODlhBwAHAIAAAP///5KSkiH5BAAAAAAALAAAAAAHAAcAAAIMTICmsGrIXnLxuDMLADs=

5
Я взяв на себе гроші позичити деякі ідеї в цьому коді, щоб створити генератор хмарних тегів (з чистими тегами css, кнопками підняття та знищення). Я сподіваюся, що у вашому браузері це виглядає нормально перевірити це на jsfiddle.net/7PnKS
mrBorna

1
Нічого собі, дуже приємне рішення. Це те, що я шукаю. Дякую. Але як я можу змінити "х" зображення на використання гліфікону Bootstrap 3? Оскільки гліфікон - це шрифт, він відображається краще, коли зменшується.
користувач1995781

1
Приємно, але фонове зображення може зіткнутися з іншими CSS. Відповідь wldaunfr нижче стосується акуратного модуля jQuery: plugins.jquery.com/clearsearch
Нік Вестгейт,

1
добре працює для мене в останніх firefox та chrome. але довелося змінити, .on('touchstart click', '.onX', ...щоб .on('touchstart click', '.onX, .x', ...він працював на iOS.
kritzikratzi

1
@ RokoC.Buljan Я тільки тестував ще раз, і ось мої висновки 1) Введіть декілька символів у текстове поле введення 2) З'явиться значок «X» 3) Пробував Клацніть піктограму «X», але текст не видаляється. Примітка. На даний момент клавіатура iPhone все ще активна і не прихована. 4) Якщо я натиснув кнопку "Готово", щоб приховати клавіатуру, а потім натиснути назад на піктограму "X", текст буде очищено правильно. Здається, я не в змозі очистити текст із "X", коли відображається клавіатура iPhone.
Утримано

61

Чи можу я підказати, якщо ви все гаразд обмежуєтесь браузерами, сумісними з html 5, просто використовуючи:

<input type="search" />

Демонстрація JS Fiddle

Щоправда, у Chromium (Ubuntu 11.04) для цього обов'язково повинен бути текст усередині inputелемента, перш ніж з'явиться чітко-текстове зображення / функціональність.

Довідка:


11
допомога іншим розробникам: Якщо ви використовуєте завантажувальну платформу CSS, видаліть стиль "-webkit-izgled: textfield;" у вхід bootstrap.css [type = "search"] {-webkit-box-sizing: content-box; -moz-box-розмір: content-box; розмір поля: контент-коробка; -webkit-поява: текстове поле; }
Ріккардо Бассілічі

1
Чи є спосіб змінити колір X?
rotaercz

1
@RiccardoBassilichi Чи є спосіб розширити свій файл css, щоб мені не довелося редагувати оригінальний bootstrap.css і все-таки працювати так?
supersan

Я думаю, що ні! Але я не майстер css! :-(
Ріккардо Бассілічі

2
На жаль, це не підтримується Firefox, дивіться: developer.mozilla.org/en-US/docs/Web/CSS/…
Гійом Хуста

27

Ви можете використовувати кнопку скидання, стилізовану до зображення ...

<form action="" method="get">
   <input type="text" name="search" required="required" placeholder="type here" />
   <input type="reset" value="" alt="clear" />
</form>

<style>
   input[type="text"]
   {
      height: 38px;
      font-size: 15pt;
   }

   input[type="text"]:invalid + input[type="reset"]{
     display: none;
   } 

   input[type="reset"]
   {
      background-image: url( http://png-5.findicons.com/files/icons/1150/tango/32/edit_clear.png );
      background-position: center center;
      background-repeat: no-repeat;
      height: 38px;
      width: 38px;
      border: none;
      background-color: transparent;
      cursor: pointer;
      position: relative;
      top: -9px;
      left: -44px;
   }
</style>

Побачити це в дії тут: http://jsbin.com/uloli3/63


10
Це скидає всю форму, а не лише одне поле
konung

Як приховати скинути зображення, коли вхід порожній? Не могли б ви, KOGI, надати живий приклад?
Гаррі

24

Я створив чітке текстове поле лише у CSS. Для його роботи не потрібен код JavaScript

нижче - демо-посилання

http://codepen.io/shidhincr/pen/ICLBD


1
Відмінно! Будь-яка інформація про підтримку браузера буде корисною.
Ян Ньюсон

1
Сьогодні він розбитий у FF 27.0.1.
Нік Вестгейт,

3
Текст не розміщується, щоб звільнити місце для кнопки "x". Ви не можете бачити текст за кнопкою.
Багряний Крис

Це все одно очищає всю форму, а не лише одне поле.
Ерік Веланд

23

За даними MDN , <input type="search" />наразі підтримується у всіх сучасних браузерах:

тип вводу = пошук

<input type="search" value="Clear this." />


Однак, якщо ви хочете, щоб інша поведінка відповідала веб-переглядачам, тут є кілька альтернатив, які потребують лише JavaScript:

Варіант 1 - Завжди відображати "x": (приклад тут)

Array.prototype.forEach.call(document.querySelectorAll('.clearable-input>[data-clear-input]'), function(el) {
  el.addEventListener('click', function(e) {
    e.target.previousElementSibling.value = '';
  });
});
.clearable-input {
  position: relative;
  display: inline-block;
}
.clearable-input > input {
  padding-right: 1.4em;
}
.clearable-input > [data-clear-input] {
  position: absolute;
  top: 0;
  right: 0;
  font-weight: bold;
  font-size: 1.4em;
  padding: 0 0.2em;
  line-height: 1em;
  cursor: pointer;
}
.clearable-input > input::-ms-clear {
  display: none;
}
<p>Always display the 'x':</p>

<div class="clearable-input">
  <input type="text" />
  <span data-clear-input>&times;</span>
</div>

<div class="clearable-input">
  <input type="text" value="Clear this." />
  <span data-clear-input>&times;</span>
</div>

Варіант 2 - відображати "x" лише під час наведення курсору на поле: (приклад тут)

Array.prototype.forEach.call(document.querySelectorAll('.clearable-input>[data-clear-input]'), function(el) {
  el.addEventListener('click', function(e) {
    e.target.previousElementSibling.value = '';
  });
});
.clearable-input {
  position: relative;
  display: inline-block;
}
.clearable-input > input {
  padding-right: 1.4em;
}
.clearable-input:hover > [data-clear-input] {
  display: block;
}
.clearable-input > [data-clear-input] {
  display: none;
  position: absolute;
  top: 0;
  right: 0;
  font-weight: bold;
  font-size: 1.4em;
  padding: 0 0.2em;
  line-height: 1em;
  cursor: pointer;
}
.clearable-input > input::-ms-clear {
  display: none;
}
<p>Only display the 'x' when hovering over the field:</p>

<div class="clearable-input">
  <input type="text" />
  <span data-clear-input>&times;</span>
</div>

<div class="clearable-input">
  <input type="text" value="Clear this." />
  <span data-clear-input>&times;</span>
</div>

Варіант 3 - Відображайте лише "x", якщо inputелемент має значення: (приклад тут)

Array.prototype.forEach.call(document.querySelectorAll('.clearable-input'), function(el) {
  var input = el.querySelector('input');

  conditionallyHideClearIcon();
  input.addEventListener('input', conditionallyHideClearIcon);
  el.querySelector('[data-clear-input]').addEventListener('click', function(e) {
    input.value = '';
    conditionallyHideClearIcon();
  });

  function conditionallyHideClearIcon(e) {
    var target = (e && e.target) || input;
    target.nextElementSibling.style.display = target.value ? 'block' : 'none';
  }
});
.clearable-input {
  position: relative;
  display: inline-block;
}
.clearable-input > input {
  padding-right: 1.4em;
}
.clearable-input >[data-clear-input] {
  display: none;
  position: absolute;
  top: 0;
  right: 0;
  font-weight: bold;
  font-size: 1.4em;
  padding: 0 0.2em;
  line-height: 1em;
  cursor: pointer;
}
.clearable-input > input::-ms-clear {
  display: none;
}
<p>Only display the 'x' if the `input` element has a value:</p>

<div class="clearable-input">
  <input type="text" />
  <span data-clear-input>&times;</span>
</div>

<div class="clearable-input">
  <input type="text" value="Clear this." />
  <span data-clear-input>&times;</span>
</div>


9

Оскільки жодне з рішень, що летять навколо, насправді не відповідало нашим вимогам, ми створили простий плагін jQuery під назвою jQuery-ClearSearch -

використовувати його так просто, як:

<input class="clearable" type="text" placeholder="search">

<script type="text/javascript">
    $('.clearable').clearSearch();
</script>

Приклад: http://jsfiddle.net/wldaunfr/FERw3/


Робота в Firefox 45
Джефф Девіс

1
Здається, це не працює в останній версії Google Chrome (v.70 ~ листопада 2018)
Бен Кларк

3

EDIT: Я знайшов це посилання. Сподіваюся, це допомагає. http://viralpatel.net/blogs/2011/02/clearable-textbox-jquery.html

Ви згадали, що хочете це праворуч від введеного тексту. Отже, найкращим способом було б створити зображення поруч із полем введення. Якщо ви шукаєте щось у полі, ви можете використовувати фонове зображення, але ви, можливо, не зможете написати сценарій, щоб очистити поле.

Отже, вставте та зображіть та напишіть код JavaScript, щоб очистити текстове поле.


Я мав на увазі праворуч від поля введення, але всередині самого вводу, як google,
Джованні Ді Мілія

Використовуйте фонове зображення, яке імітує кнопку, та використовуйте наступний код<input type="text" name="Search" value="Search..." onclick="this.value='';">
Jaspero

це не те, що я хочу зробити: я хочу піктограму, яка лише при натисканні очищає введення ....
Джованні Ді Мілія

3

Якщо ви хочете, як Google, то ви повинні знати, що "X" насправді не знаходиться всередині <input>- вони поруч один з одним зовнішнім контейнером, який виглядає як текстове поле.

HTML:

<form>
    <span class="x-input">
        <input type="text" class="x-input-text" />
        <input type="reset" />
    </span>
</form>

CSS:

.x-input {
    border: 1px solid #ccc;
}

.x-input input.x-input-text {
    border: 0;
    outline: 0;
}

Приклад: http://jsfiddle.net/VTvNX/


1

Щось на зразок цього?? Демо Jsfiddle

    <!DOCTYPE html>
<html>
<head>
    <title></title>
    <style type="text/css">
    .searchinput{
    display:inline-block;vertical-align: bottom;
    width:30%;padding: 5px;padding-right:27px;border:1px solid #ccc;
        outline: none;
}
        .clearspace{width: 20px;display: inline-block;margin-left:-25px;
}
.clear {
    width: 20px;
    transition: max-width 0.3s;overflow: hidden;float: right;
    display: block;max-width: 0px;
}

.show {
    cursor: pointer;width: 20px;max-width:20px;
}
form{white-space: nowrap;}

    </style>
</head>
<body>
<form>
<input type="text" class="searchinput">
</form>
<script src="jquery-1.11.3.min.js" type="text/javascript"></script> <script>
$(document).ready(function() {
$("input.searchinput").after('<span class="clearspace"><i class="clear" title="clear">&cross;</i></span>');
$("input.searchinput").on('keyup input',function(){
if ($(this).val()) {$(".clear").addClass("show");} else {$(".clear").removeClass("show");}
});
$('.clear').click(function(){
    $('input.searchinput').val('').focus();
    $(".clear").removeClass("show");
});
});
</script>
</body>
</html>

1
<form action="" method="get">
   <input type="text" name="search" required="required" placeholder="type here" />
   <input type="reset" value="" alt="clear" />
</form>

<style>
   input[type="text"]
   {
      height: 38px;
      font-size: 15pt;
   }

   input[type="text"]:invalid + input[type="reset"]{
     display: none;
   } 

   input[type="reset"]
   {
      background-image: url( http://png-5.findicons.com/files/icons/1150/tango/32/edit_clear.png );
      background-position: center center;
      background-repeat: no-repeat;
      height: 38px;
      width: 38px;
      border: none;
      background-color: transparent;
      cursor: pointer;
      position: relative;
      top: -9px;
      left: -44px;
   }
</style>

1

Ви можете робити з цими командами (без Bootstrap).

Array.from(document.querySelectorAll('.search-field')).forEach(field => {
  field.querySelector('span').addEventListener('click', e => {
    field.querySelector('input').value = '';
  });
});
:root {
  --theme-color: teal;
}

.wrapper {
  width: 80%;
  margin: 0 auto;
}

div {
  position: relative;
}

input {
  background:none;
  outline:none;
  display: inline-block;
  width: 100%;
  margin: 8px 0;
  padding: 13px 15px;
  padding-right: 42.5px;
  border: 1px solid var(--theme-color);
  border-radius: 5px;
  box-sizing: border-box;
}

span {
  position: absolute;
  top: 0;
  right: 0;
  margin: 8px 0;
  padding: 13px 15px;
  color: var(--theme-color);
  font-weight: bold;
  cursor: pointer;
}
span:after {
  content: '\2716';
}
<div class="wrapper">
  <div class="search-field">
    <input placeholder="Search..." />
    <span></span>
  </div>
</div>


0

Ось плагін jQuery (і демонстрація в кінці).

http://jsfiddle.net/e4qhW/3/

Я зробив це здебільшого, щоб проілюструвати приклад (і особистий виклик). Незважаючи на те, що оновлення вітаються, інші відповіді добре роздаються вчасно і заслуговують належного визнання.

Все-таки, на мою думку, це надмірно інженерія (якщо вона не є частиною бібліотеки інтерфейсу).


Якщо ви очистите вміст і почніть вводити знову ... більше немає xкнопки
Roko C. Buljan

hahaha схожий на 2-річну помилку, ніж;) Приємно бачити, як ти все ще тут
Roko C. Buljan


0

Використовуючи плагін jquery, я адаптував його до моїх потреб, додавши спеціальні параметри та створивши новий плагін. Ви можете знайти його тут: https://github.com/david-dlc-cerezo/jquery-clearField

Приклад простого використання:

<script src='http://code.jquery.com/jquery-1.9.1.js'></script>
<script src='http://code.jquery.com/ui/1.10.3/jquery-ui.js'></script>
<script src='src/jquery.clearField.js'></script>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css">
<link rel="stylesheet" href="css/jquery.clearField.css">

<table>
    <tr>
        <td><input name="test1" id="test1" clas="test" type='text'></td>
        <td>Empty</td>
    </tr>
    <tr>
        <td><input name="test2" id="test2" clas="test" type='text' value='abc'></td>
        <td>Not empty</td>
    </tr>
</table>

<script>
    $('.test').clearField();
</script>

Отримання чогось подібного:

введіть тут опис зображення



0

Не потрібно включати CSS або файли зображень. Не потрібно включати всю цю важко-артилерійську бібліотеку jQuery UI. Я написав легкий плагін jQuery, який робить для вас магію. Все, що вам потрібно, це jQueryі плагін . =)

jQuery InputSearch підкрадається

Скрипку тут: JQuery InputSearch демо .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.