Wyczyść ikonę wewnątrz tekstu wejściowego

185

Czy istnieje szybki sposób na utworzenie wejściowego elementu tekstowego z ikoną po prawej stronie, aby wyczyścić sam element wejściowy (np. Pole wyszukiwania Google)?

Rozejrzałem się, ale znalazłem tylko sposób umieszczenia ikony jako tła elementu wejściowego. Czy istnieje wtyczka jQuery lub coś innego?

Chcę ikonę wewnątrz wejściowego elementu tekstowego, coś w stylu:

--------------------------------------------------
|                                               X|
--------------------------------------------------
Giovanni Di Milia
źródło
3
Wtyczka jQuery do pozycjonowania obrazu nad polem wprowadzania? Czy coś mi brakuje?
Christian
1
@Christian Sciberras Jak widać z odpowiedzi, którą wybrałem, może to być wtyczka jquery ...
Giovanni Di Milia
1
Możesz mieć wtyczkę jQuery, aby wyświetlać zwykłe pola ostrzeżeń. Nie oznacza to, że naprawdę musisz , aw większości przypadków jest to nadmiernie skonstruowane wzdęcie . A tak przy okazji, to, co wybrałeś nie jest wtyczką jQuery , ale mieszanką javascript, html i css. Wtyczka byłaby pojedynczym plikiem / skryptem z sygnaturą jQuery zawierającą odpowiednie szczegóły.
Christian
1
@Christian Sciberras: Potrafię odróżnić wtyczkę jQuery od mieszanki javascript i CSS. Mówiłem tylko, że jeśli chcesz zrobić coś miłego, nie możesz umieścić obrazu tylko w polu wprowadzania.
Giovanni Di Milia
Ludzie szukający tego problemu również będą potrzebować tych informacji: Jak wykryć wyczyszczenie danych wejściowych HTML5 związanych z „wyszukiwaniem”?
brasofilo

Odpowiedzi:

342

Dodaj type="search"do swoich danych
Wsparcie jest całkiem przyzwoite, ale nie będzie działać w IE <10

<input type="search">

Kasowalne dane wejściowe dla starych przeglądarek

Jeśli potrzebujesz pomocy IE9, oto kilka obejść

Używanie standardowego <input type="text">i niektórych elementów 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>

Używanie tylko <input class="clearable" type="text">(Bez dodatkowych elementów)

Wyczyść ikonę wewnątrz elementu wejściowego

ustaw class="clearable"i graj z jego obrazem tła:

/**
 * 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>

Demo jsBin

Sztuką jest ustawienie odpowiedniego dopełnienia (użyłem 18 pikseli) inputi przesunięcie obrazu tła w prawo, poza zasięgiem wzroku (użyłem right -10px center).
Wypełnienie 18px zapobiegnie ukryciu tekstu pod ikoną (gdy jest widoczny).
jQ doda klasę x(jeśli inputma wartość) pokazującą ikonę usuwania.
Teraz wystarczy namierzyć za pomocą jQ dane wejściowe za pomocą klasy xi wykryć, mousemoveczy mysz znajduje się w tym obszarze „x” o wielkości 18 pikseli; jeśli jest w środku, dodaj klasę onX.
Kliknięcie onXklasy usuwa wszystkie klasy, resetuje wartość wejściową i ukrywa ikonę.


7x7px gif: Wyczyść ikonę 7x7

Ciąg Base64:

data:image/gif;base64,R0lGODlhBwAHAIAAAP///5KSkiH5BAAAAAAALAAAAAAHAAcAAAIMTICmsGrIXnLxuDMLADs=
Roko C. Buljan
źródło
5
Pozwoliłem sobie pożyczyć niektóre pomysły zawarte w tym kodzie, aby stworzyć generator chmury tagów (z czystymi tagami css oraz przyciskami upvote i downvote). Mam nadzieję, że w przeglądarce wygląda dobrze; sprawdź to na jsfiddle.net/7PnKS
mrBorna
1
Wow, naprawdę fajne rozwiązanie. Właśnie tego szukam. Dziękuję Ci. Ale jak mogę zmienić obraz „x” na używanie glifikonu Bootstrap 3? Ponieważ glifik jest czcionką, dlatego lepiej się wyświetla, gdy jest pomniejszany.
user1995781 17.10.13
1
Fajnie, ale obraz tła może kolidować z innym CSS. Poniższa odpowiedź wldaunfr odnosi się do zgrabnej wtyczki jQuery: plugins.jquery.com/clearsearch
Nick Westgate
1
działa dla mnie ładnie w najnowszym Firefox i Chrome. ale musiał zmienić .on('touchstart click', '.onX', ...się .on('touchstart click', '.onX, .x', ..., aby to działało na iOS.
kritzikratzi,
1
@ RokoC.Buljan Właśnie przetestowałem ponownie i oto moje ustalenia 1) Wpisz kilka znaków w polu tekstowym 2) Pojawia się ikona „X” 3) Próbowano Kliknij ikonę „X”, ale tekst nie jest usuwany. Uwaga: w tym momencie klawiatura iPhone'a jest nadal aktywna i nie jest ukryta. 4) Jeśli kliknę przycisk „Gotowe”, aby ukryć klawiaturę, a następnie ponownie kliknij ikonę „X”, tekst zostanie teraz poprawnie wyczyszczony. Wygląda na to, że nie jestem w stanie wyczyścić tekstu za pomocą „X”, gdy widoczna jest klawiatura iPhone'a.
Wstrzymano
61

Czy mogę zasugerować, jeśli nie masz nic przeciwko ograniczeniu przeglądarki do html 5, po prostu używając:

<input type="search" />

Demo JS Fiddle

Trzeba przyznać, że w Chromium (Ubuntu 11.04) wymaga to umieszczenia tekstu wewnątrz inputelementu, zanim pojawi się obraz / funkcja czystego tekstu.

Odniesienie:

David mówi, że przywraca Monikę
źródło
11
pomoc dla innych programistów: Jeśli używasz platformy bootstrap CSS, usuń styl „-webkit-wygląd: pole tekstowe;” w danych wejściowych bootstrap.css [type = "search"] {-webkit-box-sizing: content-box; -moz-box-sizing: content-box; rozmiar pudełka: pole zawartości; -webkit-wygląd: pole tekstowe; }
Riccardo Bassilichi
1
Czy istnieje sposób na zmianę koloru X?
rotaercz
1
@RiccardoBassilichi jest sposób na rozszerzenie mojego pliku css, aby nie musiałem edytować oryginalnego pliku bootstrap.css i nadal działać?
supersan
Myśle że nie! Ale nie jestem czarodziejem css! :-(
Riccardo Bassilichi
2
Niestety nie jest to obsługiwane przez Firefox, patrz: developer.mozilla.org/en-US/docs/Web/CSS/…
Guillaume Husta
27

Możesz użyć przycisku resetowania z obrazem ...

<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>

Zobacz to w akcji tutaj: http://jsbin.com/uloli3/63

KOGI
źródło
10
To resetuje całą formę, a nie tylko jedno pole
konung
Jak ukryć zresetowany obraz, gdy wejście jest puste? Czy mógłbyś KOGI dać przykład na żywo?
Harry
24

Stworzyłem możliwe do wyczyszczenia pole tekstowe w samym CSS. Nie wymaga kodu javascript, aby działał

poniżej znajduje się link do wersji demo

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

Shidhin Cr
źródło
1
Doskonały! Przydałyby się informacje na temat obsługi przeglądarki.
Ian Newson,
1
Dzisiaj jest dla mnie uszkodzony w FF 27.0.1.
Nick Westgate
3
Tekst nie jest zmieniany, aby zrobić miejsce dla przycisku „x”. Nie widać tekstu za przyciskiem.
CrimsonChris
To wciąż usuwa całą formę, a nie tylko jedno pole.
Erik Veland
23

Według MDN , <input type="search" />jest obecnie dostępna we wszystkich nowoczesnych przeglądarek:

typ wejścia = wyszukiwanie

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


Jeśli jednak chcesz mieć różne zachowanie spójne w różnych przeglądarkach, oto kilka lekkich alternatyw, które wymagają tylko JavaScript:

Opcja 1 - Zawsze wyświetlaj „x”: (przykład tutaj)

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>

Opcja 2 - Wyświetlaj „x” tylko podczas najechania kursorem na pole: (przykład tutaj)

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>

Opcja 3 - wyświetlaj „x” tylko, jeśli inputelement ma wartość: (przykład tutaj)

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>

Josh Crozier
źródło
9

Ponieważ żadne z latających rozwiązań nie spełniało naszych wymagań, opracowaliśmy prostą wtyczkę jQuery o nazwie jQuery-ClearSearch -

korzystanie z niego jest tak proste jak:

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

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

Przykład: http://jsfiddle.net/wldaunfr/FERw3/

wldaunfr
źródło
Praca w przeglądarce Firefox 45
Jeff Davis
1
Wygląda na to, że nie działa w najnowszym Google Chrome (wer. 70 ~ listopad 2018)
Ben Clarke
3

EDYCJA: Znalazłem ten link. Mam nadzieję, że to pomoże. http://viralpatel.net/blogs/2011/02/clearable-textbox-jquery.html

Wspomniałeś, że chcesz go po prawej stronie tekstu wejściowego. Najlepszym sposobem byłoby utworzenie obrazu obok pola wprowadzania. Jeśli szukasz czegoś w polu, możesz użyć obrazu tła, ale możesz nie być w stanie napisać skryptu, aby wyczyścić pole.

Tak więc wstaw i obrazuj i napisz kod JavaScript, aby wyczyścić pole tekstowe.

Jaspero
źródło
Miałem na myśli po prawej stronie pola wprowadzania, ale wewnątrz samego wejścia, podobnie jak Google
Giovanni Di Milia
Użyj obrazu tła naśladującego przycisk i użyj następującego kodu<input type="text" name="Search" value="Search..." onclick="this.value='';">
Jaspero
to nie jest to, co chcę zrobić: chcę ikonę, która tylko po kliknięciu usuwa dane wejściowe ....
Giovanni Di Milia
3

Jeśli chcesz, tak jak Google, powinieneś wiedzieć, że „X” tak naprawdę nie znajduje się wewnątrz <input>- są one obok siebie, a zewnętrzny pojemnik ma wygląd przypominający pole tekstowe.

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;
}

Przykład: http://jsfiddle.net/VTvNX/

Jonathan Lonowski
źródło
1

Coś takiego?? Jsfiddle Demo

    <!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>
Toki
źródło
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>
Juboraj Sarker
źródło
1

Możesz to zrobić za pomocą tych poleceń (bez 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>

Andrés M. Jiménez
źródło
0

Oto wtyczka jQuery (i demo na końcu).

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

Zrobiłem to głównie w celu zilustrowania przykładu (i osobistego wyzwania). Chociaż opinie są mile widziane, inne odpowiedzi są dobrze rozdane na czas i zasługują na należyte uznanie.

Mimo to, moim zdaniem, jest to nadmiernie inżynieryjne wzdęcie (chyba że stanowi część biblioteki interfejsu użytkownika).

chrześcijanin
źródło
Jeśli wyczyścisz zawartość i zaczniesz pisać od nowa ... nie będzie już żadnego xprzycisku
Roko C. Buljan
hahaha wygląda jak 2-letni stary błąd niż;) miło cię widzieć tutaj
Roko C. Buljan
0

Za pomocą wtyczki jquery dostosowałem ją do moich potrzeb, dodając niestandardowe opcje i tworząc nową wtyczkę. Można go znaleźć tutaj: https://github.com/david-dlc-cerezo/jquery-clearField

Przykład prostego użycia:

<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>

Uzyskanie czegoś takiego:

wprowadź opis zdjęcia tutaj

David
źródło
0

Nie trzeba dołączać plików CSS ani obrazów. Nie trzeba dołączać całej biblioteki jQuery interfejsu użytkownika ciężkiej artylerii. Napisałem lekką wtyczkę jQuery, która robi dla ciebie magię. Wszystko czego potrzebujesz to jQueryi wtyczki . =)

jQuery InputSearch zajrzeć

Fiddle tutaj: demo jQuery InputSearch .

Glenn Mohammad
źródło