Giữ chỗ đầu vào cho Internet Explorer


175

HTML5 đã giới thiệu placeholderthuộc tính trên inputcác phần tử, cho phép hiển thị văn bản mặc định màu xám.

Đáng buồn là Internet Explorer, bao gồm IE 9 không hỗ trợ nó.

Hiện đã có một số kịch bản giả lập giữ chỗ ngoài kia. Chúng thường hoạt động bằng cách đặt văn bản mặc định vào trường đầu vào, tô màu xám và xóa lại ngay khi bạn tập trung vào trường nhập.

Hạn chế của phương pháp này là văn bản giữ chỗ nằm trong trường đầu vào. Như vậy:

  1. tập lệnh không thể dễ dàng kiểm tra xem trường nhập có trống không
  2. xử lý phía máy chủ phải kiểm tra đối với giá trị mặc định, để không chèn trình giữ chỗ vào cơ sở dữ liệu.

Tôi muốn có một giải pháp, trong đó văn bản giữ chỗ không nằm trong chính đầu vào.

Câu trả lời:


151

Khi xem phần "Biểu mẫu web: trình giữ chỗ đầu vào" của Polyfills HTML5 Cross Browser , một cái tôi thấy là trình giữ chỗ jQuery-html5 .

Tôi đã thử bản demo với IE9 và có vẻ như nó bao bọc bạn <input>bằng một khoảng và phủ một nhãn với văn bản giữ chỗ.

<label>Text:
  <span style="position: relative;">
    <input id="placeholder1314588474481" name="text" maxLength="6" type="text" placeholder="Hi Mom">
    <label style="font: 0.75em/normal sans-serif; left: 5px; top: 3px; width: 147px; height: 15px; color: rgb(186, 186, 186); position: absolute; overflow-x: hidden; font-size-adjust: none; font-stretch: normal;" for="placeholder1314588474481">Hi Mom</label>
  </span>
</label>

Cũng có những miếng chêm khác ở đó, nhưng tôi không nhìn vào tất cả. Một trong số đó, Placeholder.js , tự quảng cáo là "Không phụ thuộc (vì vậy không cần bao gồm jQuery, không giống như hầu hết các tập lệnh polyfill giữ chỗ)."

Chỉnh sửa: Đối với những người quan tâm nhiều hơn đến "làm thế nào" đó là "cái gì", Cách tạo một polyfill giữ chỗ HTML5 nâng cao , hướng dẫn quy trình tạo plugin jQuery thực hiện việc này.

Ngoài ra, hãy xem giữ giữ chỗ tập trung trong IE10 để biết nhận xét về cách văn bản giữ chỗ biến mất khi lấy nét với IE10, khác với Firefox và Chrome. Không chắc chắn nếu có một giải pháp cho vấn đề này.


2
Làm việc tốt với tôi trong IE7, IE8 và IE9.
Đánh dấu Rummel

2
Plugin đó không được duy trì nữa và có rất nhiều vấn đề đã biết.
Ian Dunn

13
Downvote? Câu trả lời có chứa một liên kết đến các miếng chêm khác. Cập nhật để bao gồm một không phải jQuery.
Kevin Hakanson

Trang github của plugin không còn tồn tại nữa. Đây là một cái khác .

1
Không quá lớn của một fan hâm mộ khiến đầu vào bị sửa đổi, tôi khuyên bạn nên xem câu trả lời của Nick bên dưới. nó sử dụng lớp phủ trong suốt thay vì sửa đổi giá trị của đầu vào
Nathan Tregillus

38

Điều tốt nhất theo kinh nghiệm của tôi là https://github.com/mathiasbynens/jquery-placeholder (được đề xuất bởi html5please.com ). http://afarkas.github.com/webshim/demos/index.html cũng có một giải pháp tốt trong số các thư viện polyfill rộng lớn hơn nhiều của nó.


3
+1 cho điều này qua trình giữ chỗ jQuery-html5. Cái này trông đẹp hơn rất nhiều và xử lý một số trường hợp cạnh bị bỏ qua bởi cái khác (ví dụ: các trường ẩn)
andygeers

2
Phải nói rằng lần này StackOverflow đã đưa ra một lời khuyên tồi. jQuery Placeholder không xóa đầu vào khi bạn nhấp vào IE.
fireev

12

Với triển khai jQuery, bạn có thể DỄ DÀNG loại bỏ các giá trị mặc định khi đến lúc nộp. Dưới đây là một ví dụ:

$('#submit').click(function(){
   var text = this.attr('placeholder');
   var inputvalue = this.val();  // you need to collect this anyways
   if (text === inputvalue) inputvalue = "";

   // $.ajax(...  // do your ajax thing here

});

Tôi biết rằng bạn đang tìm kiếm một lớp phủ, nhưng bạn có thể thích sự dễ dàng của tuyến đường này (bây giờ biết những gì tôi đã viết ở trên). Nếu vậy, thì tôi đã viết nó cho các dự án của riêng tôi và nó hoạt động rất tốt (yêu cầu jQuery) và chỉ mất vài phút để thực hiện cho toàn bộ trang web của bạn. Nó cung cấp văn bản màu xám lúc đầu, màu xám nhạt khi lấy nét và màu đen khi gõ. Nó cũng cung cấp văn bản giữ chỗ bất cứ khi nào trường đầu vào trống.

Đầu tiên hãy thiết lập biểu mẫu của bạn và bao gồm các thuộc tính giữ chỗ của bạn trên các thẻ đầu vào.

<input placeholder="enter your email here">

Chỉ cần sao chép mã này và lưu nó dưới dạng placeholder.js.

(function( $ ){

   $.fn.placeHolder = function() {  
      var input = this;
      var text = input.attr('placeholder');  // make sure you have your placeholder attributes completed for each input field
      if (text) input.val(text).css({ color:'grey' });
      input.focus(function(){  
         if (input.val() === text) input.css({ color:'lightGrey' }).selectRange(0,0).one('keydown', function(){     
            input.val("").css({ color:'black' });  
         });
      });
      input.blur(function(){ 
         if (input.val() == "" || input.val() === text) input.val(text).css({ color:'grey' }); 
      }); 
      input.keyup(function(){ 
        if (input.val() == "") input.val(text).css({ color:'lightGrey' }).selectRange(0,0).one('keydown', function(){
            input.val("").css({ color:'black' });
        });               
      });
      input.mouseup(function(){
        if (input.val() === text) input.selectRange(0,0); 
      });   
   };

   $.fn.selectRange = function(start, end) {
      return this.each(function() {
        if (this.setSelectionRange) { this.setSelectionRange(start, end);
        } else if (this.createTextRange) {
            var range = this.createTextRange();
            range.collapse(true); 
            range.moveEnd('character', end); 
            range.moveStart('character', start); 
            range.select(); 
        }
      });
   };

})( jQuery );

Để sử dụng chỉ trên một đầu vào

$('#myinput').placeHolder();  // just one

Đây là cách tôi khuyên bạn nên triển khai nó trên tất cả các trường đầu vào trên trang web của mình khi trình duyệt không hỗ trợ các thuộc tính giữ chỗ HTML5:

var placeholder = 'placeholder' in document.createElement('input');  
if (!placeholder) {      
  $.getScript("../js/placeholder.js", function() {   
      $(":input").each(function(){   // this will work for all input fields
        $(this).placeHolder();
      });
  });
} 

Bạn có thể vui lòng tạo một fiddle / demo cho ở trên, sẽ giúp tôi và người xem trong tương lai.
user2086641

Liệu nó có hỗ trợ cho trường mật khẩu.
dùng2681579

6

Sau khi thử một số đề xuất và thấy các vấn đề trong IE, đây là một trong những hoạt động:

https://github.com/parndt/jquery-html5-placeholder-shim/

Những gì tôi đã thích - bạn chỉ cần bao gồm các tập tin js. Không cần phải bắt đầu nó hoặc bất cứ điều gì.


Sau khi sử dụng trình giữ chỗ này đang hoạt động tốt, nhưng nếu đó là bất kỳ lỗi nào trong biểu mẫu, trong khi hiển thị lỗi biểu mẫu, văn bản giữ chỗ bị sai lệch từ trường nhập, tôi đã cố gắng giải quyết nhưng không thể làm được. Bạn có thể hướng dẫn tôi cách giải quyết .
dùng2681579

Tôi thực sự thích cái này tốt hơn các phiên bản sửa đổi giá trị. Tôi muốn phiên bản html5 của chủ sở hữu địa điểm cũng hoạt động theo cách này! (tức là rời khỏi trình giữ chỗ cho đến khi một số văn bản được nhập, thay vì mất giá trị tập trung)
Nathan Tregillus

4
  • Chỉ hoạt động cho IE9 +

Giải pháp sau đây liên kết với các thành phần văn bản đầu vào với thuộc tính giữ chỗ. Nó mô phỏng một hành vi giữ chỗ chỉ dành cho IE và xóa trường giá trị của đầu vào khi gửi nếu nó không bị thay đổi.

Thêm tập lệnh này và IE dường như sẽ hỗ trợ trình giữ chỗ HTML5.

  $(function() {
  //Run this script only for IE
  if (navigator.appName === "Microsoft Internet Explorer") {
    $("input[type=text]").each(function() {
      var p;
     // Run this script only for input field with placeholder attribute
      if (p = $(this).attr('placeholder')) {
      // Input field's value attribute gets the placeholder value.
        $(this).val(p);
        $(this).css('color', 'gray');
        // On selecting the field, if value is the same as placeholder, it should become blank
        $(this).focus(function() {
          if (p === $(this).val()) {
            return $(this).val('');
          }
        });
         // On exiting field, if value is blank, it should be assigned the value of placeholder
        $(this).blur(function() {
          if ($(this).val() === '') {
            return $(this).val(p);
          }
        });
      }
    });
    $("input[type=password]").each(function() {
      var e_id, p;
      if (p = $(this).attr('placeholder')) {
        e_id = $(this).attr('id');
        // change input type so that the text is displayed
        document.getElementById(e_id).type = 'text';
        $(this).val(p);
        $(this).focus(function() {
          // change input type so that password is not displayed
          document.getElementById(e_id).type = 'password';
          if (p === $(this).val()) {
            return $(this).val('');
          }
        });
        $(this).blur(function() {
          if ($(this).val() === '') {
            document.getElementById(e_id).type = 'text';
            $(this).val(p);
          }
        });
      }
    });
    $('form').submit(function() {
      //Interrupt submission to blank out input fields with placeholder values
      $("input[type=text]").each(function() {
        if ($(this).val() === $(this).attr('placeholder')) {
          $(this).val('');
        }
      });
     $("input[type=password]").each(function() {
        if ($(this).val() === $(this).attr('placeholder')) {
           $(this).val('');
        }
      });
    });
  }
});

1
Nhiều người dùng vẫn sử dụng IE8 và một số thậm chí sử dụng IE7. Vì vậy, tôi sẽ không làm điều này nếu nó không hỗ trợ họ
rzr

4

Tôi đề nghị bạn một chức năng đơn giản:

function bindInOut(element,value)
{
    element.focus(function()
    {
        if(element.val() == value) element.val('');         
    }).
    blur(function()
    {
        if(element.val() == '') element.val(value);
    });

    element.blur();
}

Và để sử dụng nó, hãy gọi nó theo cách này:

bindInOut($('#input'),'Here your value :)');


2

Bạn có thể dùng :

var placeholder = 'search  here';

$('#search').focus(function(){
    if ($.trim($(this).val()) ===  placeholder){
        this.value ='';
    }
}).blur(function(){
    if ($.trim($(this).val()) ===  ''){
        this.value = placeholder;
    }
}).val(placeholder);

2

Đơn giản như thế này:

$(function() {
    ...

    var element = $("#selecter")
    if(element.val() === element.attr("placeholder"){

        element.text("").select().blur();
    }

    ...
});


1

Tôi đã đưa ra một tập lệnh JQuery giữ chỗ đơn giản cho phép màu tùy chỉnh và sử dụng một hành vi khác để xóa đầu vào khi tập trung. Nó thay thế trình giữ chỗ mặc định trong Firefox và Chrome và thêm hỗ trợ cho IE8.

// placeholder script IE8, Chrome, Firefox
// usage: <input type="text" placeholder="some str" />
$(function () { 
    var textColor = '#777777'; //custom color

    $('[placeholder]').each(function() {
        (this).attr('tooltip', $(this).attr('placeholder')); //buffer

        if ($(this).val() === '' || $(this).val() === $(this).attr('placeholder')) {
            $(this).css('color', textColor).css('font-style','italic');
            $(this).val($(this).attr('placeholder')); //IE8 compatibility
        }

        $(this).attr('placeholder',''); //disable default behavior

        $(this).on('focus', function() {
            if ($(this).val() === $(this).attr('tooltip')) {
                $(this).val('');
            }
        });

        $(this).on('keydown', function() {
            $(this).css('font-style','normal').css('color','#000');
        });

        $(this).on('blur', function() {
            if ($(this).val()  === '') {
                $(this).val($(this).attr('tooltip')).css('color', textColor).css('font-style','italic');
            }
        });
    });
});

chào hoàn hảo, nhưng bạn có một lỗi (này) .attr ('tooltip', $ (this) .attr ('giữ chỗ')); // bộ đệm thay đổi dòng này thành $ (this) .attr ('tooltip', $ (this) .attr ('placeholder')); // bộ đệm
angel.bonev 7/12/2016

0

Placekeepr là một phần mềm giữ chỗ jQuery siêu nhẹ thả xuống mà tôi đã viết. Nó nhỏ hơn 1 KB.

Tôi chắc chắn rằng thư viện này giải quyết cả hai mối quan tâm của bạn:

  1. Placekeepr mở rộng hàm jQuery $ .fn.val () để ngăn các giá trị trả về không mong muốn khi văn bản xuất hiện trong các trường đầu vào là kết quả của Placekeepr. Vì vậy, nếu bạn gắn bó với API jQuery để truy cập các giá trị của trường, bạn sẽ không cần thay đổi điều gì.

  2. Placekeepr lắng nghe các lần gửi biểu mẫu và nó sẽ xóa văn bản giữ chỗ khỏi các trường để máy chủ chỉ nhìn thấy một giá trị trống.

Một lần nữa, mục tiêu của tôi với Placekeepr là cung cấp một giải pháp thả vào đơn giản cho vấn đề giữ chỗ. Hãy cho tôi biết trên Github nếu có bất cứ điều gì khác mà bạn quan tâm khi có sự hỗ trợ của Placekeepr.


0

Để chèn plugin và kiểm tra tức là hoàn toàn làm việc.quanher.js

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="jquery.placeholder.js"></script>
    <script>
        // To test the @id toggling on password inputs in browsers that don’t support changing an input’s @type dynamically (e.g. Firefox 3.6 or IE), uncomment this:
        // $.fn.hide = function() { return this; }
        // Then uncomment the last rule in the <style> element (in the <head>).
        $(function() {
            // Invoke the plugin
            $('input, textarea').placeholder({customClass:'my-placeholder'});
            // That’s it, really.
            // Now display a message if the browser supports placeholder natively
            var html;
            if ($.fn.placeholder.input && $.fn.placeholder.textarea) {
                html = '<strong>Your current browser natively supports <code>placeholder</code> for <code>input</code> and <code>textarea</code> elements.</strong> The plugin won’t run in this case, since it’s not needed. If you want to test the plugin, use an older browser ;)';
            } else if ($.fn.placeholder.input) {
                html = '<strong>Your current browser natively supports <code>placeholder</code> for <code>input</code> elements, but not for <code>textarea</code> elements.</strong> The plugin will only do its thang on the <code>textarea</code>s.';
            }
            if (html) {
                $('<p class="note">' + html + '</p>').insertAfter('form');
            }
        });
    </script>

0

Đây là một hàm javascript thuần túy (không cần jquery) sẽ tạo các trình giữ chỗ cho IE 8 trở xuống và nó cũng hoạt động với mật khẩu. Nó đọc thuộc tính giữ chỗ HTML5 và tạo một phần tử span phía sau phần tử biểu mẫu và làm cho nền của phần tử biểu mẫu trong suốt:

/* Function to add placeholders to form elements on IE 8 and below */
function add_placeholders(fm) {	
	for (var e = 0; e < document.fm.elements.length; e++) {
		if (fm.elements[e].placeholder != undefined &&
		document.createElement("input").placeholder == undefined) { // IE 8 and below					
			fm.elements[e].style.background = "transparent";
			var el = document.createElement("span");
			el.innerHTML = fm.elements[e].placeholder;
			el.style.position = "absolute";
			el.style.padding = "2px;";
			el.style.zIndex = "-1";
			el.style.color = "#999999";
			fm.elements[e].parentNode.insertBefore(el, fm.elements[e]);
			fm.elements[e].onfocus = function() {
					this.style.background = "yellow";	
			}
			fm.elements[e].onblur = function() {
				if (this.value == "") this.style.background = "transparent";
				else this.style.background = "white";	
			}		
		} 
	}
}

add_placeholders(document.getElementById('fm'))
<form id="fm">
  <input type="text" name="email" placeholder="Email">
  <input type="password" name="password" placeholder="Password">
  <textarea name="description" placeholder="Description"></textarea>
</form>


0

LƯU Ý: tác giả của polyfill này tuyên bố nó "hoạt động trong hầu hết mọi trình duyệt mà bạn có thể tưởng tượng" nhưng theo các nhận xét không đúng với IE11, tuy nhiên IE11 có hỗ trợ riêng, cũng như hầu hết các trình duyệt hiện đại

Placeholder.js là polyfill giữ chỗ tốt nhất mà tôi từng thấy, rất nhẹ, không phụ thuộc vào JQuery, bao gồm các trình duyệt cũ hơn (không chỉ IE) và có các tùy chọn cho trình giữ chỗ ẩn đầu vào và chạy một lần.


1
@Niclas IE9 trở lên có hỗ trợ riêng cho người giữ chỗ.
Hexodus

Tôi đã thêm một ghi chú cho câu trả lời này bằng một liên kết đến caniuse cho giữ chỗ.
Dave Everitt

-1

tôi sử dụng jquery.placeholderlabels . Nó dựa trên điều này và có thể được demo ở đây .

hoạt động trong eg7, eg8, eg9.

hành vi bắt chước hành vi firefox và chrome hiện tại - trong đó văn bản "giữ chỗ" vẫn hiển thị trên tiêu điểm và chỉ biến mất sau khi một cái gì đó được nhập vào trường.


-1

Tôi đã tạo plugin jQuery của riêng mình sau khi thất vọng vì các miếng chêm hiện tại sẽ ẩn chỗ giữ chỗ tập trung, điều này tạo ra trải nghiệm người dùng kém hơn và cũng không khớp với cách Firefox, Chrome và Safari xử lý nó. Điều này đặc biệt là trường hợp nếu bạn muốn một đầu vào được tập trung khi tải trang hoặc cửa sổ bật lên đầu tiên, trong khi vẫn hiển thị trình giữ chỗ cho đến khi văn bản được nhập.

https://github.com/nspady/jquery-placeholder-labels/

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.