IE9'daki yer tutucu


140

Çok iyi bilinen bir sorun gibi görünüyor, ancak Google'da bulduğum tüm çözümler yeni indirilen IE9'umda çalışmıyor.

Ve etiketlerindeki Placeholderözelliği etkinleştirmek için en sevdiğiniz yöntem hangisidir?inputtextarea

İsteğe bağlı: Bu konuda çok zaman kaybettim ve requiredmülkü henüz aramadım. Bunun için tavsiyeleriniz var mı? Açıkçası ben PHP değerini kontrol edebilirsiniz, ancak kullanıcıya yardımcı olmak için bu özellik çok uygundur.


4 yıl sonra tekrar HTML'ye dönüyorum. Yani eski takımlarımı değiştirme tavsiyesine açığım. Neredeyse sıfırdan yeniden başlatıyorum. Ben esas olarak JQuery ve google sonuçlarından birçok kopya / geçmiş ile deniyorum
chriscatfr

Yanıtlar:


185

HTML5 Placeholder jQuery Eklentisi
- Mathias Bynens ( HTML5 Boilerplate ve jsPerf üzerinde ortak çalışan )

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

Demo ve Örnekler

http://mathiasbynens.be/demo/placeholder

ps
Birçok kez bu eklentiyi kullandım ve bir tedavi çalışıyor. Ayrıca gelmez Formunuzu (... Ben diğer eklentileri ile bulunan gerçek ağrısı) gönderdiğinizde bir değer olarak yer tutucu metin sunmak.


Özel bir CRM ile çalışıyoruz. Bu kodu ve eserleri beklendiği gibi ekledim, ancak formlarını javascript aracılığıyla gönderdiler. Gönder düğmesi vardır onclick="_IW.FormsRuntime.submit(this.form);". Yine de önce yer tutucuları temizlemek ve sonra onclick var olan bu CRM kodunu çalıştırmak için bu onclick olayı değiştirebilir miyim?
Leeish

1
github js dosyasını src koduma kopyaladım. Hala yer tutucu ile gitmek.
Philo

2
Bu gerçekten bir zevk veriyor, ancak tek sayfa uygulamalarında kullanmak acı verici. Dinamik olarak eklenen alanlar için manuel olarak tetiklemeniz gerekir. Bunun dışında harika çalışıyor!
smets.kevin

1
Teşekkürler, düzgün eklenti, ancak bir sorun ie9 ile metin girişi odak olduğunda yer tutucu kaybolur. Bu HTML5 davranışından farklı
gerrytan

1
Bir büyük 'ama', $ ('input') ile iyi çalışır. Val (), giriş boş olduğunda yer tutucu değerini döndürür. AJAX çerçevesi ile çalıştığım için, bu yer tutucular sunucuya gönderiliyor ...
Danubian Sailor

21

Aradığın şey bu: jquery-html5-placeholder-fix

Bu çözüm, yer tutucunun desteklenip desteklenmediğini belirlemek için özellik algılamayı ( modernizr aracılığıyla ) kullanır . Değilse, destek ekler (jQuery aracılığıyla).


2
Çalışıyor, ancak en büyük kod değil. En üstte $(this)kod boyunca kullanılabilecek bir değişkene atanmalıdır. $Kullanan her ifadenin çağrılması $(this), "Bu 101 gibi jQuery Yazma" seçeneğinin hemen dışındadır.
Sami Samhuri

20
Formu gönderirseniz, yer tutucu değeri bir form değeri olarak gönderileceğinden bu koda dikkat etmeniz gerekir. Göndermeden önce temizlemelisiniz.
ericbae

2
@chriscatfr SO kullanıcılarını çok daha iyi bir çözüme yönlendireceğini düşündüğüm için lütfen yanıtımı kabul etmeyi düşünün ( stackoverflow.com/a/13281620/114140 ).
Chris Jacob

HTML 5 özellikleri savaşında yeni olduğum için merak ediyorum: Bunun kötü bir çözüm veya jquery-html5-placeholder-fix'in kendisi (veya her ikisi) olmasına neden olan modernleştirici mi?
Snekse

Bu basit ve zarif ve benim için işi yaptı.
graumanoz

17

Jquery veya modenizer kullanmadan yapmak istiyorsanız, aşağıdaki kodu kullanabilirsiniz:

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

}());

Kullanmak istediğiniz her metin alanı için çalıştırmanız gerekir placeHolder(HTMLInputElement), ancak sanırım bunu uygun şekilde değiştirebilirsiniz! Ayrıca, yalnızca yükleme yerine bu şekilde yapmak, sayfa yüklendiğinde DOM'da olmayan girişler için çalıştırabileceğiniz anlamına gelir.

Bunun class: usingPlaceHolderöğesini giriş öğesine uygulayarak işe yaradığına dikkat edin, böylece bunu stil oluşturmak için kullanabilirsiniz (örneğin .usingPlaceHolder { color: #999; font-style: italic; }daha iyi görünmesi için kuralı ekleyin ).


1
Maalesef, bunun kolay olup olmadığını gerçekten bilmiyorum - Sanırım "semboller" yerine gerçek metin değerini görüntülemek istersiniz. Bunu yapmayı düşünebildiğim tek kesmek, odak veya değer olmadığı sürece metin girişi için değiştirmek, aksi takdirde bir şifre alanı olarak görüntülemek olacaktır.
Mark Rhodes

@StephenPatten Şifre alanlarına sahip yer tutucular için yaptığım düzeltmeye bir göz atın . Mark'ın önerdiği şeyi tam olarak yapıyorum :)
Chev

8

İşte çok daha iyi bir çözüm. http://bavotasan.com/2011/html5-placeholder-jquery-fix/ Sadece IE10 altındaki tarayıcılarla çalışmayı birazcık kabul ettim

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

IE beri IE8 üzerinde çalışmak jQuery girdi türlerini işlemek (üzerinde 01:48 pm 20 Aralık 2011 tarihinde Bill yorumunu kontrol etmek izin vermez vermez bavotasan.com/2011/html5-placeholder-jquery-fix )
Forste

ayrıca bir form gönderdiğinizi varsayar. Gördüğüm tek sayfa uygulamalarının çoğu form kullanmıyor. sadece işleyicileri tıklayın.
chovy

5

Bir açıklama girmek istiyorsanız bunu kullanabilirsiniz. Bu IE 9 ve diğer tüm tarayıcılarda çalışır.

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

1
Bunu kendim test etmedim, ancak alanı tıklatmak yerine sekmeniz halinde bunu yapmak işe yaramaz. Bu hatayı birçok web sitesinde veya benzeri web sitelerinde görüyorum.
eselk

Bu çözümle ayrıca form gönderirken bu değeri kontrol etmeniz gerekir.
Igor Jerosimić

Bunun herhangi bir oyu aldığını şaşırdım, 2012
2013'te

Girişe yazarsanız, yer tutucu ne olmalıdır ('CV2:') yazdığınız şey silinir.
Daniel

2

Yer Tutucuyu desteklemeyen tarayıcıları tespit etmek için mordernizr kullanarak , bunları düzeltmek için bu kısa kodu oluşturdum.

//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
Formu gönderirseniz, yer tutucu değeri bir form değeri olarak gönderileceğinden bu koda dikkat etmeniz gerekir. Göndermeden önce temizlemelisiniz.
chriscatfr

3
@chriscatfr: Bu örnekte bunu nasıl düzgün yaparsınız? Yer tutucum 'Şifre' ve şifrem aslında 'Şifre' ise?
Lain

Bunun gibi alanlar için "kirli" kavramını kullanabilirsiniz. Girişte alanı temiz olarak işaretleyin (belki data-dirty = "false" kullanın). Formu yer tutucu metnini değiştirmeden gönderirlerse, alanın temiz olduğunu görürsünüz, bu yüzden temizleyin. Bunu yer tutucu ile aynı değere bile değiştirdiyse, o zaman kirli olur ve bu değeri gönderirsiniz.
oooyaya

şifre ve diğer çözüm için lütfen jsfiddle.net/AlexanderPatel/1pv2174c/3
Shirish Patel

placeholderözellik string = olarak standartlaştırıldı => Modernizr için gerek yok aslında :::::::::::::::::::::::::::::: if( typeof $('<input type="text">').get(0).placeholder == "undefined" ){ ... }desteklemeyen test için enaugh test, test IE9 modunda öykünme - çalışır.
jave.web

2

Geç kaldığımı biliyorum ama kafasına etiketi ekleyerek bir çözüm buldum:

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


Bunu IE9'da test ettiniz mi? Çünkü aksi takdirde IE10 + yer tutucuyu destekler ...
jave.web

Elbette, IE9'un bir etiketin açacağını desteklememesi garip - bu deneysel bir özellik miydi? Bu bir yere mi atıfta bulunuyor? :)
jave.web

1

IE-9'da çalışmasını sağlamak için aşağıda kullanın. benim için çalışıyor

JQuery şunları içermelidir:

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(''); });
});
}
});

CSS Style şunları içermelidir:

.hasPlaceholder {color: #aaa;}

1
girinti eklemek ve yanıtınızı kodunuzdan ayırmak gibi biçimlendirmenizi burada düzeltmelisiniz
darren

1

Partiye biraz geç ama Modernizr'den yararlanan denenmiş ve güvenilir JS'imi kullanıyorum . Kopyalanabilir / yapıştırılabilir ve herhangi bir projeye uygulanabilir. Her zaman çalışır:

// 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('');
        }
      })
    });

}

JQuery .. kullanarak tüm bu çözümler şişirilmiş jQuery olmadan hiçbir çözüm var mı?
Spock

0

Genellikle http://cdnjs.com/ oldukça yüksek düşünüyorum ve listeleme:

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

Kimin kod olduğundan emin değilim ama basit görünüyor:

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
Bu eklenti prototip kütüphanesini de gerektirir
rosswil

0

İnternette arama yaptım ve bu sorunu çözmek için basit bir jquery kodu buldum. Benim tarafımda çözüldü ve yani 9 üzerinde çalıştı.

$("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
Yer Tutucunuz değer olur. Eğer gönderirseniz gönderilirler. Doğru yanıtın placeholder.js ile alanlar boş tutulur
chriscatfr
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.