Platzhalter in IE9


140

Es scheint ein sehr bekanntes Problem zu sein, aber alle Lösungen, die ich bei Google gefunden habe, funktionieren auf meinem neu heruntergeladenen IE9 nicht.

Welches ist Ihre bevorzugte Methode, um die PlaceholderEigenschaft für die Tags inputund zu aktivieren textarea?

Optional: Ich habe viel Zeit verloren und noch nicht nach der requiredImmobilie gesucht. Hätten Sie dazu auch einen Rat? Natürlich kann ich den Wert in PHP überprüfen, aber um dem Benutzer zu helfen, ist diese Eigenschaft sehr praktisch.


Nach 4 Jahren bin ich wieder in HTML. Das heißt, ich bin offen für Ratschläge, meine veralteten Tools zu ersetzen. Ich starte fast von Null neu. Ich habe es hauptsächlich mit JQuery und vielen Kopien / Vergangenheit von Google-Ergebnissen versucht
chriscatfr

Antworten:


185

HTML5 Placeholder jQuery Plugin
- von Mathias Bynens (ein Mitarbeiter von HTML5 Boilerplate und jsPerf )

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

Demo & Beispiele

http://mathiasbynens.be/demo/placeholder

ps
Ich habe dieses Plugin schon oft benutzt und es funktioniert ein Vergnügen. Außerdem wird der Platzhaltertext beim Senden Ihres Formulars nicht als Wert gesendet (... ein echter Schmerz, den ich bei anderen Plugins festgestellt habe).


Wir arbeiten mit einem benutzerdefinierten CRM. Ich habe diesen Code und die Werke wie erwartet hinzugefügt, aber sie senden ihre Formulare über Javascript. Der Submit-Button hat onclick="_IW.FormsRuntime.submit(this.form);". Kann ich dieses Onclick-Ereignis trotzdem ändern, um zuerst die Platzhalter zu löschen und dann diesen CRM-Code auszuführen, der im Onclick vorhanden ist?
Leeish

1
ich habe die github js datei in meinen src code kopiert. Immer noch nicht mit dem Platzhalter gehen.
Philo

2
Dies ist in der Tat ein Vergnügen, es ist jedoch ein Schmerz, es auf Anwendungen mit nur einer Seite anzuwenden. Sie müssen es manuell für dynamisch hinzugefügte Felder auslösen. Davon abgesehen funktioniert es super!
smets.kevin

1
Danke, ordentliches Plugin, aber ein Problem, das ich habe, ist mit ie9, dass der Platzhalter verschwindet, wenn die Texteingabe im Fokus steht. Dies ist anders als HTML5-Verhalten
Gerrytan

1
Es funktioniert gut mit einem großen 'aber', $ ('Eingabe'). Val () gibt den Platzhalterwert zurück, wenn die Eingabe leer ist. Da ich mit dem AJAX-Framework arbeite, werden diese Platzhalter an den Server gesendet ...
Danubian Sailor

21

Ich denke, das ist, wonach Sie suchen: jquery-html5-placeholder-fix

Diese Lösung verwendet die Feature-Erkennung (über modernizr ), um festzustellen, ob Platzhalter unterstützt werden. Wenn nicht, wird Unterstützung hinzugefügt (über jQuery).


2
Es funktioniert, aber es ist nicht der beste Code. Oben $(this)sollte eine Variable zugewiesen werden, die im gesamten Code verwendet werden kann. Das Aufrufen $jedes verwendeten Ausdrucks $(this)ist ein Nein-Nein direkt aus "Don't Write jQuery Like This 101".
Sami Samhuri

20
Sie müssen mit diesem Code vorsichtig sein, da beim Senden des Formulars der Platzhalterwert als Formularwert gesendet wird. Sollte es löschen, bevor es eingereicht wird.
Ericbae

2
@chriscatfr Bitte akzeptieren Sie meine Antwort ( stackoverflow.com/a/13281620/114140 ), da ich der Meinung bin, dass dies SO-Benutzer zu einer viel besseren Lösung führen wird.
Chris Jacob

Neugierig, da ich neu im Kampf um HTML 5-Funktionen bin: Ist es der Modernisierer, der dazu führt, dass dies eine schlechte Lösung ist, oder der jquery-html5-Platzhalter-Fix selbst (oder beides)?
Snekse

Das ist einfach und elegant und hat den Job für mich gemacht.
Graumanoz

17

Wenn Sie dies ohne Verwendung von jquery oder modenizer tun möchten, können Sie den folgenden Code verwenden:

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

}());

Für jedes Textfeld, das Sie verwenden möchten, müssen Sie es ausführen placeHolder(HTMLInputElement), aber ich denke, Sie können das einfach ändern, um es anzupassen! Wenn Sie dies auf diese Weise tun und nicht nur laden, können Sie es auch für Eingaben verwenden, die sich beim Laden der Seite nicht im DOM befinden.

Beachten Sie, dass dies funktioniert, indem Sie die Klasse: usingPlaceHolderauf das Eingabeelement anwenden , damit Sie es formatieren können (z. B. die Regel hinzufügen .usingPlaceHolder { color: #999; font-style: italic; }, damit es besser aussieht).


1
Entschuldigung - ich weiß wirklich nicht, ob das einfach ist - ich denke, Sie möchten den tatsächlichen Textwert anstelle der "Symbole" anzeigen. Der einzige Hack, den ich mir vorstellen kann, wäre, ihn für eine Texteingabe zu wechseln, es sei denn, er hat einen Fokus oder einen Wert, andernfalls wird er als Passwortfeld angezeigt.
Mark Rhodes

@StephenPatten Schauen Sie sich meinen Fix für Platzhalter mit Passwortfeldern an. Ich mache genau das, was Mark vorgeschlagen hat :)
Chev

8

Hier ist eine viel bessere Lösung. http://bavotasan.com/2011/html5-placeholder-jquery-fix/ Ich habe es ein wenig übernommen, um nur mit Browsern unter IE10 zu arbeiten

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

funktioniert nicht mit IE8, da IE es jQuery nicht erlaubt, Eingabetypen zu manipulieren ( siehe Kommentar von Bill am 20. Dezember 2011 um 13:48 Uhr auf bavotasan.com/2011/html5-placeholder-jquery-fix )
forste

setzt auch voraus, dass Sie ein Formular senden. Die meisten Single-Page-Apps, die ich gesehen habe, verwenden keine Formulare. Klicken Sie einfach auf Handler.
Chovy

5

Wenn Sie eine Beschreibung eingeben möchten, können Sie diese verwenden. Dies funktioniert unter IE 9 und allen anderen Browsern.

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

1
Ich habe es nicht selbst getestet, aber ich vermute, dass dies nicht gut funktioniert, wenn Sie zum Feld wechseln, anstatt darauf zu klicken. Ich sehe diesen Fehler auf vielen oder ähnlichen Websites.
Eselk

Bei dieser Lösung müssen Sie auch beim Senden des Formulars nach diesem Wert suchen.
Igor Jerosimić

Ich bin überrascht, dass dies irgendwelche Stimmen bekommen hat, dies sollte nicht verwendet werden, auch wenn es in 2012/2013
LocalPCGuy

Wenn Sie zufällig in die Eingabe schreiben, was der Platzhalter sein soll ('CV2:'), wird das, was Sie eingegeben haben, gelöscht.
Daniel

2

Mit mordernizr habe ich diesen Funktionscode erstellt , um Browser zu erkennen, die Placeholder nicht unterstützen.

//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
Sie müssen mit diesem Code vorsichtig sein, da beim Senden des Formulars der Platzhalterwert als Formularwert gesendet wird. Sie sollten es löschen, bevor es gesendet wird.
Chriscatfr

3
@chriscatfr: Wie würde man das in diesem Beispiel richtig machen? Wenn mein Platzhalter "Passwort" ist und mein Passwort tatsächlich "Passwort" ist?
Liegt am

Sie könnten das Konzept "schmutzig" für Felder wie dieses verwenden. Markieren Sie das Feld bei der Eingabe als sauber (verwenden Sie möglicherweise data-dirty = "false"). Wenn sie das Formular senden, ohne den Platzhaltertext zu ändern, sehen Sie, dass das Feld sauber ist. Löschen Sie es daher. Wenn sie es geändert haben, sogar auf den gleichen Wert wie der Platzhalter, dann ist es schmutzig und Sie senden diesen Wert.
Oooyaya

Das Passwort und andere Lösungen finden Sie unter jsfiddle.net/AlexanderPatel/1pv2174c/3
Shirish Patel

placeholderEigenschaft wurde als Zeichenfolge standardisiert => Modernizr wird eigentlich nicht benötigt :::::::::::::::::::::::::::::: if( typeof $('<input type="text">').get(0).placeholder == "undefined" ){ ... }ist ein ausreichender Test für nicht unterstützende, getestete im IE9-Modus Emulation - funktioniert.
jave.web

2

Ich weiß, dass ich zu spät bin, aber ich habe eine Lösung gefunden, die das Tag in den Kopf einfügt:

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


Haben Sie dies in IE9 getestet? Weil sonst IE10 + Platzhalter unterstützt ...
jave.web

Natürlich ist es nur seltsam, dass IE9 es selbst nicht unterstützt, dass ein Tag es einschalten würde - war es damals eine experimentelle Funktion? Wird irgendwo darauf verwiesen? :)
jave.web

1

Damit es in IE-9 funktioniert, verwenden Sie unten. Es funktioniert für mich

JQuery muss Folgendes enthalten:

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

Der CSS-Stil muss Folgendes enthalten:

.hasPlaceholder {color: #aaa;}

1
Sie sollten Ihre Formatierung hier korrigieren, z. B. Einrückungen hinzufügen und Ihre Antwort von Ihrem Code trennen
ein Darren

1

Ein bisschen spät zur Party, aber ich benutze mein bewährtes JS, das Modernizr ausnutzt . Kann kopiert / eingefügt und auf jedes Projekt angewendet werden. Funktioniert jedes Mal:

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

}

Alle diese Lösungen mit jQuery ... gibt es keine Lösung ohne die aufgeblähte jQuery?
Spock

0

Ich denke normalerweise ziemlich hoch von http://cdnjs.com/ und sie listen auf:

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

Ich bin mir nicht sicher, wer der Code ist, aber er sieht einfach aus:

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
Dieses Plugin benötigt auch die Prototyp-Bibliothek
Rosswil

0

Ich habe im Internet gesucht und einen einfachen Abfragecode gefunden, um dieses Problem zu lösen. In meiner Seite wurde es gelöst und an dh 9 gearbeitet.

$("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
Ihr Platzhalter wird zum Wert. Wenn Sie einreichen, werden sie gesendet. Mit den placeholder.js der richtigen Antwort werden die Felder leer gehalten
chriscatfr
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.