Xóa biểu tượng bên trong văn bản đầu vào


184

Có cách nào nhanh chóng để tạo một phần tử văn bản đầu vào với một biểu tượng ở bên phải để xóa chính phần tử đầu vào (như hộp tìm kiếm google) không?

Tôi nhìn xung quanh nhưng tôi chỉ tìm thấy làm thế nào để đặt một biểu tượng làm nền của yếu tố đầu vào. Có một plugin jQuery hay cái gì khác không?

Tôi muốn biểu tượng bên trong thành phần văn bản đầu vào, đại loại như:

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

3
Một plugin jQuery để định vị một hình ảnh trên một hộp đầu vào? Tôi đang thiếu thứ gì đó hay sao?!
Christian

1
@Christian Sciberras Như bạn có thể thấy từ câu trả lời tôi đã chọn, nó có thể là một plugin jquery ...
Giovanni Di Milia

1
Bạn có thể có một plugin jQuery để hiển thị các hộp cảnh báo đơn giản. Điều đó không có nghĩa là bạn thực sự phải làm , và trong hầu hết các trường hợp, đó là sự phình to quá mức . Ồ, nhân tiện, những gì bạn đã chọn không phải là một plugin jQuery , mà là sự pha trộn giữa javascript, html và css. Một plugin sẽ là một tệp / tập lệnh duy nhất có chữ ký jQuery chứa các chi tiết liên quan.
Christian

1
@Christian Sciberras: Tôi có thể phân biệt giữa plugin jQuery và hỗn hợp javascript và CSS. Điều tôi đã nói là nếu bạn muốn làm điều gì đó tốt đẹp, bạn không thể chỉ đặt một hình ảnh vào hộp đầu vào.
Giovanni Di Milia

Mọi người đang tìm kiếm vấn đề này cũng sẽ cần thông tin này: Làm thế nào để bạn phát hiện việc xóa một đầu vào Tìm kiếm HTML5 của HTML5?
brasofilo

Câu trả lời:


342

Thêm một type="search"vào đầu vào của bạn
Hỗ trợ khá tốt nhưng sẽ không hoạt động trong IE <10

<input type="search">

Đầu vào có thể chấp nhận được cho các trình duyệt cũ

Nếu bạn cần hỗ trợ IE9, đây là một số cách giải quyết

Sử dụng một tiêu chuẩn <input type="text">và một số yếu tố 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>

Chỉ sử dụng một <input class="clearable" type="text">(Không có yếu tố bổ sung)

Xóa biểu tượng bên trong yếu tố đầu vào

thiết lập class="clearable"và chơi với hình nền của 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>

bản demo jsBin

Mẹo nhỏ là đặt một số phần đệm bên phải (tôi đã sử dụng 18px) sang inputvà đẩy hình nền bên phải, khuất tầm nhìn (tôi đã sử dụng right -10px center).
Phần đệm 18px đó sẽ ngăn văn bản ẩn bên dưới biểu tượng (trong khi hiển thị).
jQ sẽ thêm lớp x(nếu inputcó giá trị) hiển thị biểu tượng rõ ràng.
Bây giờ tất cả những gì chúng ta cần là nhắm mục tiêu với jQ các đầu vào với lớp xvà phát hiện mousemovexem chuột có ở trong khu vực "x" 18px đó không; nếu bên trong, thêm lớp onX.
Nhấp vào onXlớp sẽ xóa tất cả các lớp, đặt lại giá trị đầu vào và ẩn biểu tượng.


7x7px gif: Xóa biểu tượng 7x7

Chuỗi Base64:

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

5
Tôi đã tự do mượn một số ý tưởng trong mã này để tạo ra một trình tạo đám mây thẻ (với các thẻ css thuần túy và các nút upvote và downvote). Tôi hy vọng nó có vẻ ổn trong trình duyệt của bạn; kiểm tra nó tại jsfiddle.net/7PnKS
mrBorna

1
Wow, giải pháp thực sự tốt đẹp. Đó là những gì tôi đang tìm kiếm. Cảm ơn bạn. Nhưng, làm cách nào tôi có thể thay đổi hình ảnh "x" thành sử dụng glyphicon Bootstrap 3? Do glyphicon là phông chữ, do đó, nó hiển thị tốt hơn khi thu nhỏ.
user1995781

1
Đẹp, nhưng hình nền có thể xung đột với CSS khác. Câu trả lời dưới đây của wldaunfr đề cập đến một trình cắm thêm jQuery gọn gàng: plugins.jquery.com/clearsearch
Nick Westgate

1
hoạt động độc đáo cho tôi trong firefox và chrome mới nhất. nhưng đã phải thay đổi .on('touchstart click', '.onX', ...để .on('touchstart click', '.onX, .x', ...làm cho nó hoạt động trên iOS.
kritzikratzi 11/07/2015

1
@ RokoC.Buljan Tôi vừa thử nghiệm lại và đây là kết quả của tôi 1) Nhập vài ký tự vào hộp văn bản đầu vào 2) Biểu tượng 'X' xuất hiện 3) Đã thử Nhấp vào biểu tượng 'X' nhưng văn bản văn bản không xóa. Lưu ý: Tại thời điểm này, bàn phím iPhone vẫn hoạt động và không bị ẩn. 4) Nếu tôi nhấp vào nút "Xong" để ẩn bàn phím và sau đó nhấp lại vào biểu tượng 'X', văn bản sẽ bị xóa ngay bây giờ. Có vẻ như tôi không thể xóa văn bản bằng 'X' khi bàn phím iPhone được hiển thị.
Giữ lại

61

Tôi có thể đề xuất, nếu bạn ổn với việc này bị giới hạn ở các trình duyệt tuân thủ html 5, chỉ cần sử dụng:

<input type="search" />

Bản demo của Fiddle

Phải thừa nhận rằng, trong Chromium (Ubuntu 11.04), điều này không yêu cầu phải có văn bản bên trong inputphần tử trước khi hình ảnh / chức năng văn bản rõ ràng sẽ xuất hiện.

Tài liệu tham khảo:


11
trợ giúp cho các nhà phát triển khác: Nếu bạn sử dụng nền tảng CSS bootstrap, hãy xóa kiểu "-webkit-ngoại hình: textfield;" trong đầu vào bootstrap.css [type = "search"] {-webkit-box-sizing: content-box; -moz-box-sizing: hộp nội dung; kích thước hộp: hộp nội dung; -webkit-ngoại hình: trường văn bản; }
Riccardo Bassilichi

1
Có cách nào để thay đổi màu của X không?
rotaercz 11/03/2015

1
@RiccardoBassilichi có cách nào để mở rộng tệp css của tôi để tôi không phải chỉnh sửa bootstrap.css ban đầu mà vẫn hoạt động được không?
supersan

Tôi nghĩ rằng không! Nhưng tôi không phải là một thuật sĩ css! :-(
Riccardo Bassilichi

2
Thật không may, điều này không được Firefox hỗ trợ, xem: developer.mozilla.org/en-US/docs/Web/CSS/
mẹo

27

Bạn có thể sử dụng nút đặt lại được tạo kiểu bằng hình ảnh ...

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

Xem nó trong hành động ở đây: http://jsbin.com/uloli3/63


10
Điều này đặt lại toàn bộ biểu mẫu, không chỉ một trường
konung

Làm thế nào để ẩn hình ảnh thiết lập lại khi đầu vào trống? Bạn có thể, KOGI cho một ví dụ trực tiếp?
Harry

24

Tôi đã tạo một hộp văn bản có thể xóa được chỉ bằng CSS. Nó không yêu cầu mã javascript để làm cho nó hoạt động

dưới đây là liên kết demo

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


1
Thông minh! Một số thông tin về hỗ trợ trình duyệt sẽ hữu ích.
Ian Newson

1
Nó bị hỏng trong FF 27.0.1 đối với tôi ngày hôm nay.
Nick Westgate

3
Văn bản không được định vị lại để nhường chỗ cho nút 'x'. Bạn không thể nhìn thấy văn bản đằng sau nút.
CrimsonChris

Điều này vẫn xóa toàn bộ biểu mẫu, không chỉ một trường.
Erik Veland

23

Theo MDN , <input type="search" />hiện được hỗ trợ trong tất cả các trình duyệt hiện đại:

kiểu nhập = tìm kiếm

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


Tuy nhiên, nếu bạn muốn các hành vi khác nhau nhất quán trên các trình duyệt thì đây là một số lựa chọn thay thế nhẹ chỉ yêu cầu JavaScript:

Tùy chọn 1 - Luôn hiển thị 'x': (ví dụ tại đây)

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>

Tùy chọn 2 - Chỉ hiển thị 'x' khi di chuột qua trường: (ví dụ ở đây)

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>

Tùy chọn 3 - Chỉ hiển thị 'x' nếu inputphần tử có giá trị: (ví dụ ở đây)

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

Vì không có giải pháp nào bay xung quanh thực sự đáp ứng yêu cầu của chúng tôi, chúng tôi đã tìm ra một plugin jQuery đơn giản có tên jQuery-ClearSearch -

sử dụng nó dễ dàng như:

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

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

Ví dụ: http://jsfiddle.net/wldaunfr/FERw3/


Làm việc trong Firefox 45
Jeff Davis

1
Dường như không hoạt động trong Google Chrome mới nhất (v70 ~ tháng 11 năm 2018)
Ben Clarke

3

EDIT: Tôi tìm thấy liên kết này. Hy vọng nó giúp. http://viruspatel.net/bloss/2011/02/cleaabilities-textbox-jquery.html

Bạn đã đề cập bạn muốn nó ở bên phải của văn bản đầu vào. Vì vậy, cách tốt nhất sẽ là tạo một hình ảnh bên cạnh hộp nhập liệu. Nếu bạn đang tìm kiếm thứ gì đó bên trong hộp, bạn có thể sử dụng hình nền nhưng bạn không thể viết một tập lệnh để xóa hộp.

Vì vậy, chèn và hình ảnh và viết mã JavaScript để xóa hộp văn bản.


Tôi có nghĩa là ở bên phải của hộp đầu vào, nhưng bên trong chính đầu vào, giống như google vậy
Giovanni Di Milia

Sử dụng hình ảnh nền bắt chước một nút và sử dụng mã sau đây<input type="text" name="Search" value="Search..." onclick="this.value='';">
Jaspero

đây không phải là điều tôi muốn làm: tôi muốn một biểu tượng mà chỉ khi nhấp vào sẽ xóa đầu vào ....
Giovanni Di Milia

3

Nếu bạn muốn nó giống như Google, thì bạn nên biết rằng "X" không thực sự nằm trong <input> - chúng nằm cạnh nhau với hộp chứa bên ngoài được tạo kiểu giống như hộp văn bản.

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

Ví dụ: http://jsfiddle.net/VTvNX/


1

Một cái gì đó như thế này ?? Bản thử nghiệm của 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

Bạn có thể làm với các lệnh này (không có 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

Đây là một plugin jQuery (và một bản demo ở cuối).

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

Tôi đã làm nó chủ yếu để minh họa một ví dụ (và một thách thức cá nhân). Mặc dù upvote được chào đón, các câu trả lời khác được đưa ra đúng thời gian và xứng đáng được công nhận.

Tuy nhiên, theo tôi, đó là sự phình to quá mức (trừ khi nó là một phần của thư viện UI).


Nếu bạn xóa nội dung và bắt đầu nhập lại ... không còn xnút nào nữa
Roko C. Buljan

hahaha trông giống như một con bọ già hơn 2 tuổi;) rất vui khi thấy bạn vẫn ở đây
Roko C. Buljan


0

Sử dụng một plugin jquery tôi đã điều chỉnh nó theo nhu cầu của mình để thêm các tùy chọn tùy chỉnh và tạo một plugin mới. Bạn có thể tìm thấy nó ở đây: https://github.com/david-dlc-cerezo/jquery-clearField

Một ví dụ về cách sử dụng đơn giản:

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

Có được một cái gì đó như thế này:

nhập mô tả hình ảnh ở đây



0

Không cần bao gồm các tệp CSS hoặc hình ảnh. Không cần bao gồm toàn bộ thư viện UI UI pháo hạng nặng đó. Tôi đã viết một plugin jQuery nhẹ, điều kỳ diệu cho bạn. Tất cả bạn cần là jQuerycác plugin . =)

jQuery InputSearch sneak peek

Fiddle ở đây: jQuery InputSearch demo .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.