Giriş metninin içindeki simgeyi temizle


185

Giriş öğesinin kendisini (google arama kutusu gibi) temizlemek için sağda bir simgeyle giriş metin öğesi oluşturmanın hızlı bir yolu var mı?

Etrafa baktım ama sadece bir ikonun giriş elemanının arka planı olarak nasıl yerleştirileceğini buldum. Bir jQuery eklentisi veya başka bir şey var mı?

Giriş metin öğesinin içindeki simgeyi istiyorum, şuna benzer:

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

3
Görüntüyü giriş kutusunun üzerine yerleştirmek için bir jQuery eklentisi? Bir şey mi kaçırıyorum yoksa ne ?!
Christian

1
@Christian Sciberras Seçtiğim cevaptan görebileceğiniz gibi, bir jquery eklentisi olabilir ...
Giovanni Di Milia

1
Düz uyarı kutularını göstermek için bir jQuery eklentisine sahip olabilirsiniz. Bu gerçekten anlamına gelmez zorunda ve çoğu durumda, bu kabartmak aşırı tasarlanmıştır . Oh ve bu arada, seçtiğiniz şey bir jQuery eklentisi değil, javascript, html ve css karışımı. Bir eklenti, ilgili ayrıntıları içeren jQuery imzasına sahip tek bir dosya / komut dosyası olabilir.
Christian

1
@Christian Sciberras: Bir jQuery eklentisi ile javascript ve CSS karışımı arasında ayrım yapabilirim. Söylediğim şey, güzel bir şey yapmak istiyorsanız, bir giriş kutusuna yalnızca bir görüntü koyamazsınız.
Giovanni Di Milia

Bu sorunu arayan kişiler için de bu bilgilere ihtiyaç duyulacaktır: “Arama” HTML5 girişinin temizlendiğini nasıl tespit edersiniz?
brasofilo

Yanıtlar:


342

Bir ekleme type="search"girişinize
destek oldukça iyi ama olacak <10 IE çalışmıyor

<input type="search">

Eski tarayıcılar için silinebilir giriş

IE9 desteğine ihtiyacınız varsa , bazı geçici çözümler

Standart <input type="text">ve bazı HTML öğelerini kullanma:

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

Yalnızca a <input class="clearable" type="text">(Ek öğe yok) kullanma

Giriş öğesinin içindeki simgeyi temizle

a ayarlayın class="clearable"ve arka plan resmi ile oynayın:

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

İşin püf noktası, bazı sağ dolguları (18px kullandım) inputve arka plan görüntüsünü sağa, göze çarpmadan (kullandım) itmektir right -10px center.
Bu 18 piksel dolgu, metnin simgenin altına gizlenmesini önler (görünür durumdayken).
jQ , temiz simgesini gösteren sınıfı x( inputdeğere sahipse) ekleyecektir .
Şimdi tek ihtiyacımız olan sınıf jQ ile girişleri hedeflemek ve fare bu 18px "x" alanı içinde olup olmadığını xtespit etmek mousemove; içerideyse sınıfı ekleyin onX. Sınıfı
tıklatmak onXtüm sınıfları kaldırır, giriş değerini sıfırlar ve simgeyi gizler.


7x7 piksel gif: Açık simge 7x7

Base64 dizesi:

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

5
Bir etiket bulutu jeneratörü (saf css etiketleri, upvote ve downvote düğmeleriyle) yapmak için bu koddaki bazı fikirleri ödünç alma özgürlüğünü aldım. Umarım tarayıcınızda iyi görünür; jsfiddle.net/7PnKS
mrBorna

1
Vay be, gerçekten güzel bir çözüm. Aradığım şey bu. Teşekkür ederim. Ancak, "x" görüntüsünü Bootstrap 3 glifikonunu kullanarak nasıl değiştirebilirim? Glifik yazı tipi olduğundan, uzaklaştırıldığında daha iyi görüntülenir.
user1995781

1
Güzel, ancak arka plan görüntüsü diğer CSS ile çakışabilir. Wldaunfr tarafından verilen cevap, düzgün bir jQuery eklentisine atıfta bulunur: plugins.jquery.com/clearsearch
Nick Westgate

1
en son firefox ve chrome'da benim için iyi çalışıyor. ancak iOS'ta çalışmasını sağlamak için değişmek .on('touchstart click', '.onX', ...zorunda .on('touchstart click', '.onX, .x', ...kaldı.
kritzikratzi

1
@ RokoC.Buljan Az önce tekrar test ettim ve işte bulgularım 1) Giriş metin kutusuna birkaç karakter girin 2) 'X' simgesi görünüyor 3) Denendi 'X' simgesini tıklayın, ancak metin metni silinmez. Not: Bu noktada, iPhone klavyesi hala etkindir ve gizli değildir. 4) Klavyeyi gizlemek için "Bitti" düğmesine tıkladıktan sonra tekrar "X" simgesine tıklarsam, metin şimdi doğru şekilde silinecektir. İPhone klavyesi gösterildiğinde metni 'X' ile silemiyorum.
Withhelds

61

Bu html 5 uyumlu tarayıcılarla sınırlı iseniz, sadece şunu kullanarak önerebilir miyim?

<input type="search" />

JS Fiddle demosu

Kuşkusuz, Chromium'da (Ubuntu 11.04), bu , açık metin görüntüsü / işlevselliği görünmeden önceinput öğenin içinde metin olmasını gerektirir .

Referans:


11
diğer geliştiriciler için bir yardım: Eğer bootstrap CSS platformu kullanıyorsanız "-webkit-view: textfield;" bootstrap.css girdisinde [type = "arama"] {-webkit-box-sizing: content-box; -moz-kutusu-boyutlandırma: içerik-kutusu; kutu boyutlandırma: içerik kutusu; -webkit-görünüm: metin alanı; }
Riccardo Bassilichi

1
X'in rengini değiştirmenin bir yolu var mı?
rotaercz

1
@RiccardoBassilichi orijinal bootstrap.css düzenlemek ve hala bu çalışma almak zorunda kalmamak için css dosyamı genişletmek için bir yolu var mı?
supersan

Bence hayır! Ama ben bir css sihirbazı değilim! :-(
Riccardo Bassilichi

2
Ne yazık ki bu Firefox tarafından desteklenmiyor, bkz: developer.mozilla.org/en-US/docs/Web/CSS/…
Guillaume Husta

27

Bir resimle şekillendirilmiş bir sıfırlama düğmesi kullanabilirsiniz ...

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

Burada iş başında görün: http://jsbin.com/uloli3/63


10
Bu sıfırlar tüm form değil, sadece bir alan
Konung

Giriş boşken sıfırlama görüntüsü nasıl gizlenir? KOGI canlı bir örnek verebilir misiniz?
Harry

24

Sadece CSS'de silinebilir bir metin kutusu oluşturdum. Çalışması için herhangi bir javascript kodu gerektirmez

demo linki aşağıda

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


1
Mükemmel! Tarayıcı desteği hakkında bazı bilgiler yardımcı olacaktır.
Ian Newson

1
Bugün benim için 27.0.1'de kırıldı.
Nick Westgate

3
'X' düğmesine yer açmak için metin yeniden konumlandırılmıyor. Düğmenin arkasındaki metni göremezsiniz.
CrimsonChris

Bu, yalnızca tek bir alanı değil, tüm formu temizler.
Erik Veland

23

MDN'ye göre , <input type="search" />şu anda tüm modern tarayıcılarda desteklenmektedir:

girdi türü = arama

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


Ancak, tarayıcılar arasında tutarlı olan farklı davranışlar istiyorsanız, yalnızca JavaScript gerektiren bazı hafif alternatifler şunlardır:

Seçenek 1 - Her zaman 'x' göster: (burada örnek)

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>

Seçenek 2 - Alanın üzerine geldiğinizde yalnızca 'x' değerini görüntüleyin: (burada örnek)

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>

Seçenek 3 - Yalnızca inputöğenin değeri varsa 'x' değerini görüntüleyin: (burada örnek)

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

Uçan çözümlerin hiçbiri gereksinimlerimizi gerçekten karşılamadığından, jQuery-ClearSearch adlı basit bir jQuery eklentisi bulduk -

kullanmak şu kadar kolaydır:

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

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

Örnek: http://jsfiddle.net/wldaunfr/FERw3/


Firefox 45'te çalışma
Jeff Davis

1
En son Google Chrome'da çalışmıyor gibi görünüyor (v.70 ~ Kas 2018)
Ben Clarke

3

EDIT: Bu bağlantıyı buldum. Umarım yardımcı olur. http://viralpatel.net/blogs/2011/02/clearable-textbox-jquery.html

Giriş metninin sağında olmasını istediğinizden bahsettiniz. Bu nedenle, en iyi yol giriş kutusunun yanında bir görüntü oluşturmaktır. Kutunun içinde bir şey arıyorsanız, arka plan resmini kullanabilirsiniz, ancak kutuyu temizlemek için komut dosyası yazamayabilirsiniz.

Bu nedenle, metin kutusunu temizlemek için bir JavaScript kodu ekleyin ve resim yazın.


Giriş kutusunun sağında anlam ifade ediyordum, ancak girişin içinde, google'ın yaptığı gibi
Giovanni Di Milia

Bir düğmeyi taklit eden bir arka plan resmi kullanın ve aşağıdaki kodu kullanın<input type="text" name="Search" value="Search..." onclick="this.value='';">
Jaspero

yapmak istediğim bu değil: Sadece tıklandığında girişi temizler bir simge istiyorum ....
Giovanni Di Milia

3

Google gibi olmasını istiyorsanız, o zaman "X" in aslında içinde olmadığını bilmelisiniz <input>- dış kap metin kutusu gibi görünecek şekilde tasarlanmışlardır.

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

Örnek: http://jsfiddle.net/VTvNX/


1

Böyle bir şey ?? Jsfiddle Demosu

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

Bu komutlarla (Bootstrap olmadan) yapabilirsiniz.

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

İşte bir jQuery eklentisi (ve sonunda bir demo).

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

Çoğunlukla bir örnek (ve kişisel bir meydan okuma) göstermek için yaptım. Upvotes açık olsa da, diğer cevaplar zamanında dağıtılıyor ve gerekli tanımayı hak ediyor.

Yine de, bence, aşırı tasarlanmış bir şişkinlik (bir UI kütüphanesinin parçası olmadıkça).


İçeriği temizleyip tekrar x
yazmaya

hahaha daha 2y eski bir hata gibi görünüyor;) hala burada olduğunu görmek güzel
Roko C. Buljan


0

Bir jquery eklentisi kullanarak, özelleştirilmiş seçenekler ekleyerek ve yeni bir eklenti oluşturarak ihtiyaçlarıma uyarladım. Burada bulabilirsiniz: https://github.com/david-dlc-cerezo/jquery-clearField

Basit bir kullanım örneği:

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

Bunun gibi bir şey elde etmek:

resim açıklamasını buraya girin



0

CSS veya resim dosyaları eklemenize gerek yoktur. Bu ağır topçu jQuery UI kütüphanesini eklemenize gerek yok. Senin için sihri yapan hafif bir jQuery eklentisi yazdım. İhtiyacınız olan tek şey jQueryve eklenti . =)

jQuery InputSearch gizlice gözatma

Burada keman yapın: jQuery InputSearch demosu .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.