Trình giữ chỗ trong IE9


140

Có vẻ như đó là một vấn đề rất nổi tiếng nhưng tất cả các giải pháp tôi tìm thấy trên Google không hoạt động trên IE9 mới tải xuống của tôi.

Đó là cách yêu thích của bạn để kích hoạt Placeholdertài sản trên inputtextareathẻ?

Tùy chọn: Tôi đã mất rất nhiều thời gian về điều đó và chưa tìm kiếm requiredtài sản. Bạn cũng sẽ có một số lời khuyên cho việc này? Rõ ràng tôi có thể kiểm tra giá trị trong PHP, nhưng để giúp người dùng thuộc tính này rất thuận tiện.


Tôi trở lại HTML sau 4 năm. Có nghĩa là tôi sẵn sàng tư vấn để thay thế các công cụ lỗi thời của mình. Tôi khởi động lại gần như từ số không. Tôi đã cố gắng chủ yếu với JQuery và nhiều bản sao / quá khứ từ kết quả của google, lần thử cuối cùng
chriscatfr

Câu trả lời:


185

Plugin jQuery Placeholder jQuery
- bởi Mathias Bynens (cộng tác viên trên HTML5 BoilerplatejsPerf )

https://github.com/mathiasbynens/jquery-placeholder

Bản demo & ví dụ

http://mathiasbynens.be/demo/placeholder

ps
Tôi đã sử dụng plugin này nhiều lần và nó hoạt động một điều trị. Ngoài ra, nó không gửi văn bản giữ chỗ như một giá trị khi bạn gửi biểu mẫu của bạn (... một nỗi đau thực sự tôi tìm thấy với các plugin khác).


Chúng tôi đang làm việc với một CRM tùy chỉnh. Tôi đã thêm mã này và các công việc như mong đợi, nhưng họ gửi biểu mẫu của họ thông qua javascript. Nút gửi có onclick="_IW.FormsRuntime.submit(this.form);". Có cách nào tôi có thể thay đổi sự kiện onclick này trước tiên để xóa chỗ dành sẵn, sau đó chạy mã CRM này tồn tại trong onclick không?
Leeish

1
tôi đã sao chép tập tin github js vào mã src của mình. Vẫn không đi với giữ chỗ.
Philo

2
Điều này thực sự có tác dụng đối xử, tuy nhiên thật khó sử dụng trên các ứng dụng trang đơn. Bạn cần kích hoạt nó bằng tay cho các trường được thêm động. Khác hơn thế, hoạt động tuyệt vời!
smets.kevin 18/11/13

1
Cảm ơn, plugin gọn gàng, tuy nhiên một vấn đề tôi gặp phải với eg9, trình giữ chỗ biến mất khi tiêu điểm văn bản được tập trung. Điều này khác với hành vi HTML5
gerrytan

1
Nó hoạt động tốt với một 'nhưng', $ ('đầu vào'). Val () trả về giá trị giữ chỗ khi đầu vào trống. Bởi vì tôi đang làm việc với khung AJAX, các trình giữ chỗ đó được gửi đến máy chủ ...
Danubian Sailor

21

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm: jquery-html5-placeholder-fix

Giải pháp này sử dụng tính năng phát hiện (thông qua Modernizr ) để xác định xem trình giữ chỗ có được hỗ trợ hay không. Nếu không, thêm hỗ trợ (thông qua jQuery).


2
Nó hoạt động, nhưng nó không phải là mã lớn nhất. Ở đầu $(this)nên được gán cho một biến có thể được sử dụng trong suốt mã. Gọi $cho mọi biểu thức sử dụng $(this)là không thể bỏ qua "Đừng viết jQuery như thế này 101".
Sami Samhuri

20
Bạn phải cẩn thận với mã này vì nếu bạn gửi biểu mẫu, giá trị giữ chỗ sẽ được gửi dưới dạng giá trị biểu mẫu. Nên xóa nó trước khi nó được gửi.
ericbae

2
@chriscatfr Vui lòng xem xét chấp nhận câu trả lời của tôi ( stackoverflow.com/a/13281620/114140 ) vì tôi cảm thấy nó sẽ hướng người dùng SO hướng tới một giải pháp tốt hơn nhiều.
Chris Jacob

Tò mò vì tôi chưa quen với trận chiến tính năng HTML 5: Nó có phải là trình hiện đại hóa khiến cho đây là một giải pháp tồi hoặc bản thân jquery-html5-giữ chỗ (hoặc cả hai) không?
Snekse

Điều này là đơn giản và thanh lịch và đã làm công việc cho tôi.
graumanoz

17

Nếu bạn muốn làm điều đó mà không sử dụng jquery hoặc moden, bạn có thể sử dụng mã dưới đây:

(function(){

     "use strict";

     //shim for String's trim function..
     function trim(string){
         return string.trim ? string.trim() : string.replace(/^\s+|\s+$/g, "");
     }

     //returns whether the given element has the given class name..
     function hasClassName(element, className){ 
         //refactoring of Prototype's function..
         var elClassName = element.className;
         if(!elClassName)
             return false;
         var regex = new RegExp("(^|\\s)" + className + "(\\s|$)");
         return regex.test(element.className);
     }

     function removeClassName(element, className){
         //refactoring of Prototype's function..
         var elClassName = element.className;
         if(!elClassName)
             return;
         element.className = elClassName.replace(
             new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ');
     }

     function addClassName(element, className){
         var elClassName = element.className;
         if(elClassName)
             element.className += " " + className;
         else
             element.className = className;
     }

     //strings to make event attachment x-browser.. 
     var addEvent = document.addEventListener ?
            'addEventListener' : 'attachEvent';
     var eventPrefix = document.addEventListener ? '' : 'on';

     //the class which is added when the placeholder is being used..
     var placeHolderClassName = 'usingPlaceHolder';

     //allows the given textField to use it's placeholder attribute
     //as if it's functionality is supported natively..
     window.placeHolder = function(textField){

         //don't do anything if you get it for free..
         if('placeholder' in document.createElement('input'))
             return;

         //don't do anything if the place holder attribute is not
         //defined or is blank..
         var placeHolder = textField.getAttribute('placeholder');        
         if(!placeHolder)
             return;

         //if it's just the empty string do nothing..
         placeHolder = trim(placeHolder);
         if(placeHolder === '')
             return;

         //called on blur - sets the value to the place holder if it's empty..
         var onBlur = function(){
             if(textField.value !== '') //a space is a valid input..
                 return;
             textField.value = placeHolder;
             addClassName(textField, placeHolderClassName);
         };

         //the blur event..
         textField[addEvent](eventPrefix + 'blur', onBlur, false);

         //the focus event - removes the place holder if required..
         textField[addEvent](eventPrefix + 'focus', function(){
             if(hasClassName(textField, placeHolderClassName)){
                removeClassName(textField, placeHolderClassName);
                textField.value = "";
             }
         }, false);

         //the submit event on the form to which it's associated - if the
         //placeholder is attached set the value to be empty..
         var form = textField.form;
         if(form){
             form[addEvent](eventPrefix + 'submit', function(){
                 if(hasClassName(textField, placeHolderClassName))
                     textField.value = '';
            }, false);
         }

         onBlur(); //call the onBlur to set it initially..
    };

}());

Đối với mỗi trường văn bản bạn muốn sử dụng nó cho bạn cần chạy placeHolder(HTMLInputElement), nhưng tôi đoán bạn chỉ có thể thay đổi nó cho phù hợp! Ngoài ra, thực hiện theo cách này, thay vì chỉ tải có nghĩa là bạn có thể làm cho nó hoạt động cho các đầu vào không có trong DOM khi tải trang.

Lưu ý, điều này hoạt động bằng cách áp dụng lớp: usingPlaceHoldercho phần tử đầu vào, vì vậy bạn có thể sử dụng phần này để tạo kiểu cho nó (ví dụ: thêm quy tắc .usingPlaceHolder { color: #999; font-style: italic; }để làm cho nó trông đẹp hơn).


1
Xin lỗi - Tôi thực sự không biết liệu điều đó có dễ thực hiện không - Tôi đoán bạn muốn hiển thị giá trị văn bản thực tế, thay vì "biểu tượng". Cách hack duy nhất tôi có thể nghĩ ra để làm điều này là chuyển nó thành kiểu nhập văn bản trừ khi nó có tiêu điểm hoặc giá trị, nếu không thì hiển thị nó dưới dạng trường mật khẩu.
Mark Rhodes

@StephenPatten Hãy xem cách khắc phục của tôi đối với trình giữ chỗ với các trường mật khẩu. Tôi làm chính xác những gì Mark đề xuất :)
Chev

8

Đây là một giải pháp tốt hơn nhiều. http://bavotasan.com/2011/html5-placeholder-jquery-fix/ Tôi đã chấp nhận một chút để chỉ hoạt động với các trình duyệt trong IE10

<!DOCTYPE html>
<!--[if lt IE 7]><html class="no-js lt-ie10 lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]-->
<!--[if IE 7]><html class="no-js lt-ie10 lt-ie9 lt-ie8" lang="en"> <![endif]-->
<!--[if IE 8]><html class="no-js lt-ie10 lt-ie9" lang="en"> <![endif]-->
<!--[if IE 9]><html class="no-js lt-ie10" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--><html class="no-js" lang="en"><!--<![endif]-->

    <script>
    // Placeholder fix for IE
      $('.lt-ie10 [placeholder]').focus(function() {
        var i = $(this);
        if(i.val() == i.attr('placeholder')) {
          i.val('').removeClass('placeholder');
          if(i.hasClass('password')) {
            i.removeClass('password');
            this.type='password';
          }     
        }
      }).blur(function() {
        var i = $(this);  
        if(i.val() == '' || i.val() == i.attr('placeholder')) {
          if(this.type=='password') {
            i.addClass('password');
            this.type='text';
          }
          i.addClass('placeholder').val(i.attr('placeholder'));
        }
      }).blur().parents('form').submit(function() {
        //if($(this).validationEngine('validate')) { // If using validationEngine
          $(this).find('[placeholder]').each(function() {
            var i = $(this);
            if(i.val() == i.attr('placeholder'))
              i.val('');
              i.removeClass('placeholder');

          })
        //}
      });
    </script>
    ...
    </html>

không hoạt động trên IE8 vì IE không cho phép jQuery thao tác các loại đầu vào (kiểm tra nhận xét từ Bill vào ngày 20 tháng 12 năm 2011 lúc 1:48 chiều trên bavotasan.com/2011/html5-placeholder-jquery-fix )
forste

cũng giả sử bạn đang gửi một hình thức. Hầu hết các ứng dụng trang đơn tôi đã thấy không sử dụng biểu mẫu. chỉ cần nhấp vào xử lý.
chovy

5

Nếu bạn muốn nhập một mô tả, bạn có thể sử dụng này. Điều này hoạt động trên IE 9 và tất cả các trình duyệt khác.

<input type="text" onclick="if(this.value=='CVC2: '){this.value='';}" onblur="if(this.value==''){this.value='CVC2: ';}" value="CVC2: "/>

1
Không tự kiểm tra nó, nhưng đoán điều này không hoạt động tốt nếu bạn tab vào trường thay vì nhấp vào nó. Tôi thấy lỗi này trong rất nhiều trang web, hoặc những trang như thế.
eselk

Với giải pháp này, bạn cũng cần kiểm tra giá trị này trên biểu mẫu gửi.
Igor Jerosimić

Tôi ngạc nhiên khi nhận được bất kỳ phiếu bầu nào, điều này không nên được sử dụng ngay cả khi được đăng vào năm 2012/2013
LocalPCGuy

Nếu bạn tình cờ ghi vào đầu vào, cái nên giữ chỗ ('CV2:') những gì bạn đã nhập sẽ bị xóa.
Daniel

2

Sử dụng mordernizr để phát hiện các trình duyệt không hỗ trợ Placeholder, tôi đã tạo mã ngắn này để sửa chúng.

//If placeholder is not supported
if (!Modernizr.input.placeholder){ 

    //Loops on inputs and place the placeholder attribute
    //in the textbox.
    $("input[type=text]").each( function() { 
       $(this).val($(this).attr('placeholder')); 
    })
}

2
Bạn phải cẩn thận với mã này vì nếu bạn gửi biểu mẫu, giá trị giữ chỗ sẽ được gửi dưới dạng giá trị biểu mẫu. Bạn nên xóa nó trước khi nó được gửi.
chriscatfr

3
@chriscatfr: Làm thế nào một người có thể làm điều đó đúng trong ví dụ này? Nếu giữ chỗ của tôi là 'Mật khẩu' và mật khẩu của tôi thực sự là 'Mật khẩu'?
Lain

Bạn có thể sử dụng khái niệm "bẩn" cho các trường như thế này. Đánh dấu trường là sạch khi nhập cảnh (có thể sử dụng data-bẩn = "false"). Nếu họ gửi biểu mẫu mà không thay đổi văn bản giữ chỗ, bạn sẽ thấy rằng trường sạch, vì vậy hãy xóa nó. Nếu họ đã thay đổi nó, thậm chí thành cùng giá trị với trình giữ chỗ, thì nó sẽ bẩn và bạn đã gửi giá trị đó.
oooyaya

để biết mật khẩu và giải pháp khác, vui lòng xem jsfiddle.net/AlexanderPatel/1pv2174c/3
Shirish Patel

placeholderthuộc tính được tiêu chuẩn hóa thành chuỗi => không cần Modernizr thực sự :::::::::::::::::::::::::::: if( typeof $('<input type="text">').get(0).placeholder == "undefined" ){ ... }là thử nghiệm enaugh cho việc không hỗ trợ, đã thử nghiệm trong mô phỏng chế độ IE9 - hoạt động.
jave.web

2

Tôi biết tôi đến muộn nhưng tôi đã tìm thấy một giải pháp chèn vào đầu thẻ:

<meta http-equiv="X-UA-Compatible" content="IE=edge"/> <!--FIX jQuery INTERNET EXPLORER-->


Bạn đã thử nghiệm điều này trong IE9? Bởi vì nếu không IE10 + hỗ trợ giữ chỗ ...
jave.web

Tất nhiên, thật lạ, IE9 không hỗ trợ chính nó mà một thẻ sẽ bật nó lên - nó có phải là một tính năng thử nghiệm không? Đây có phải là tài liệu tham khảo ở đâu đó? :)
jave.web

1

để làm cho nó hoạt động trong IE-9, hãy sử dụng bên dưới. Nó hoạt động với tôi

JQuery cần bao gồm:

jQuery(function() {
   jQuery.support.placeholder = false;
   webkit_type = document.createElement('input');
   if('placeholder' in webkit_type) jQuery.support.placeholder = true;});
   $(function() {

     if(!$.support.placeholder) {

       var active = document.activeElement;

       $(':text, textarea, :password').focus(function () {

       if (($(this).attr('placeholder')) && ($(this).attr('placeholder').length > 0) &&         ($(this).attr('placeholder') != '') && $(this).val() == $(this).attr('placeholder')) {
          $(this).val('').removeClass('hasPlaceholder');
        }
      }).blur(function () {
if (($(this).attr('placeholder')) && ($(this).attr('placeholder').length > 0) &&  ($(this).attr('placeholder') != '') && ($(this).val() == '' || $(this).val() ==   $(this).attr('placeholder'))) {
     $(this).val($(this).attr('placeholder')).addClass('hasPlaceholder');
}
});

$(':text, textarea, :password').blur();
$(active).focus();
$('form').submit(function () {
     $(this).find('.hasPlaceholder').each(function() { $(this).val(''); });
});
}
});

Phong cách CSS cần bao gồm:

.hasPlaceholder {color: #aaa;}

1
bạn nên sửa định dạng của mình ở đây, như thêm thụt lề và tách câu trả lời của bạn khỏi mã của bạn
một công chúa

1

Đến bữa tiệc muộn một chút nhưng tôi sử dụng JS đã cố gắng và đáng tin cậy của mình để tận dụng Modernizr . Có thể được sao chép / dán và áp dụng cho bất kỳ dự án. Hoạt động mọi lúc:

// Placeholder fallback
if(!Modernizr.input.placeholder){

    $('[placeholder]').focus(function() {
      var input = $(this);
      if (input.val() == input.attr('placeholder')) {
        input.val('');
        input.removeClass('placeholder');
      }
    }).blur(function() {
      var input = $(this);
      if (input.val() == '' || input.val() == input.attr('placeholder')) {
        input.addClass('placeholder');
        input.val(input.attr('placeholder'));
      }
    }).blur();
    $('[placeholder]').parents('form').submit(function() {
      $(this).find('[placeholder]').each(function() {
        var input = $(this);
        if (input.val() == input.attr('placeholder')) {
          input.val('');
        }
      })
    });

}

Tất cả các giải pháp này sử dụng jQuery..có không có giải pháp nào mà không có jQuery cồng kềnh?
Spock

0

Tôi thường nghĩ khá cao về http://cdnjs.com/ và họ đang liệt kê:

//cdnjs.cloudflare.com/ajax/libs/placeholder-shiv/0.2/placeholder-shiv.js

Không chắc ai là mã nhưng nó có vẻ đơn giản:

document.observe('dom:loaded', function(){
  var _test = document.createElement('input');
  if( ! ('placeholder' in _test) ){
    //we are in the presence of a less-capable browser
    $$('*[placeholder]').each(function(elm){
      if($F(elm) == ''){
        var originalColor = elm.getStyle('color');
        var hint = elm.readAttribute('placeholder');
        elm.setStyle('color:gray').setValue(hint);
        elm.observe('focus',function(evt){
          if($F(this) == hint){
            this.clear().setStyle({color: originalColor});
          }
        });
        elm.observe('blur', function(evt){
          if($F(this) == ''){
            this.setValue(hint).setStyle('color:gray');
          }
        });
      }
    }).first().up('form').observe('submit', function(evt){
      evt.stop();
      this.select('*[placeholder]').each(function(elm){
        if($F(elm) == elm.readAttribute('placeholder')) elm.clear();
      });
      this.submit();
    });
  }
});

1
Plugin này cũng yêu cầu thư viện nguyên mẫu
rosswil

0

Tôi đã tìm kiếm trên internet và tìm thấy một mã jquery đơn giản để xử lý vấn đề này. Về phía tôi, nó đã được giải quyết và hoạt động trên tức là 9.

$("input[placeholder]").each(function () {
        var $this = $(this);
        if($this.val() == ""){
            $this.val($this.attr("placeholder")).focus(function(){
                if($this.val() == $this.attr("placeholder")) {
                    $this.val("");
                }
            }).blur(function(){
                if($this.val() == "") {
                    $this.val($this.attr("placeholder"));
                }
            });
        }
    });

2
Placeholder của bạn trở thành giá trị. Nếu bạn gửi chúng sẽ được gửi. Với giữ
chỗ.js
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.