Espaces réservés d'entrée pour Internet Explorer

175

HTML5 a introduit l' placeholderattribut sur les inputéléments, qui permet d'afficher un texte par défaut grisé.

Malheureusement, Internet Explorer, y compris IE 9, ne le prend pas en charge.

Il existe déjà des scripts de simulateur d'espace réservé. Ils fonctionnent généralement en plaçant le texte par défaut dans le champ de saisie, en lui donnant une couleur grise et en le supprimant à nouveau dès que vous ciblez le champ de saisie.

L'inconvénient de cette approche est que le texte de l'espace réservé se trouve dans le champ de saisie. Donc:

  1. les scripts ne peuvent pas facilement vérifier si un champ de saisie est vide
  2. le traitement côté serveur doit vérifier la valeur par défaut, afin de ne pas insérer l'espace réservé dans la base de données.

Je voudrais avoir une solution, où le texte d'espace réservé n'est pas dans l'entrée elle-même.

NikiC
la source

Réponses:

151

En regardant la section "Web Forms: input placeholder" de HTML5 Cross Browser Polyfills , j'ai vu jQuery-html5-placeholder .

J'ai essayé la démo avec IE9, et il semble qu'elle enveloppe votre <input>avec une étendue et superpose une étiquette avec le texte de l'espace réservé.

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

Il y a aussi d'autres cales là-bas, mais je ne les ai pas toutes regardées. L'un d'eux, Placeholders.js , s'annonce comme "Pas de dépendances (donc pas besoin d'inclure jQuery, contrairement à la plupart des scripts polyfill d'espace réservé)."

Edit: Pour ceux qui s'intéressent davantage à «comment» que «quoi», comment créer un polyfill d'espace réservé HTML5 avancé qui parcourt le processus de création d'un plugin jQuery qui fait cela.

Voir également garder l'espace réservé sur le focus dans IE10 pour des commentaires sur la façon dont le texte de l'espace réservé disparaît lors du focus avec IE10, qui diffère de Firefox et Chrome. Je ne sais pas s'il existe une solution à ce problème.

Kevin Hakanson
la source
2
A bien fonctionné pour moi dans IE7, IE8 et IE9.
Mark Rummel
2
Ce plugin n'est plus maintenu et présente de nombreux problèmes connus.
Ian Dunn
13
Un vote négatif? La réponse contenait un lien vers d'autres cales. Mis à jour pour inclure un non-jQuery.
Kevin Hakanson
La page github du plugin n'existe plus. En voici un autre .
1
Pas trop grand d'un fan qui provoque la modification de l'entrée, je recommande de regarder la réponse de Nick ci-dessous. il utilise une superposition transparente plutôt que de modifier la valeur de l'entrée
Nathan Tregillus
38

Le meilleur de mon expérience est https://github.com/mathiasbynens/jquery-placeholder (recommandé par html5please.com ). http://afarkas.github.com/webshim/demos/index.html a également une bonne solution parmi sa bibliothèque beaucoup plus étendue de polyfills.

user161642
la source
3
+1 à cela sur le jQuery-html5-placeholder. Cela a l'air beaucoup plus agréable et gère certains cas
marginaux
2
Je dois dire que cette fois, StackOverflow a fourni un mauvais conseil. jQuery Placeholder n'efface pas l'entrée lorsque vous cliquez dans IE.
firedev
12

Avec une implémentation jQuery, vous pouvez FACILEMENT supprimer les valeurs par défaut lorsqu'il est temps de soumettre. Voici un exemple:

$('#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

});

Je sais que vous recherchez une superposition, mais vous préférerez peut-être la facilité de cet itinéraire (sachant maintenant ce que j'ai écrit ci-dessus). Si c'est le cas, j'ai écrit ceci pour mes propres projets et cela fonctionne vraiment bien (nécessite jQuery) et ne prend que quelques minutes à mettre en œuvre pour l'ensemble de votre site. Il offre du texte gris au début, gris clair lors de la mise au point et noir lors de la saisie. Il propose également le texte d'espace réservé chaque fois que le champ de saisie est vide.

Configurez d'abord votre formulaire et incluez vos attributs d'espace réservé sur les balises d'entrée.

<input placeholder="enter your email here">

Copiez simplement ce code et enregistrez-le sous 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 );

À utiliser sur une seule entrée

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

C'est ainsi que je vous recommande de l'implémenter sur tous les champs de saisie de votre site lorsque le navigateur ne prend pas en charge les attributs d'espace réservé 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();
      });
  });
} 
Jonathan Tonge
la source
Pourriez-vous s'il vous plaît créer un violon / démo pour ce qui précède, cela m'aidera ainsi que le futur spectateur.
user2086641
Prend-il en charge le champ de mot de passe.
user2681579
6

Après avoir essayé quelques suggestions et vu des problèmes dans IE, voici celui qui fonctionne:

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

Ce que j'ai aimé - vous incluez simplement le fichier js. Pas besoin de l'initier ou quoi que ce soit.

firedev
la source
Après avoir utilisé cet espace réservé fonctionne bien dans c'est-à-dire, mais s'il y a une erreur de forme, tout en affichant l'erreur de formulaire, le texte de l'espace réservé est mal aligné à partir du champ de saisie, j'ai essayé de résoudre mais je n'ai pas pu le faire.Pouvez-vous me guider comment résoudre .
user2681579
J'aime vraiment celle-ci mieux que les versions de modification de valeur. J'aimerais que la version html5 des espaces réservés fonctionne également de cette façon! (c'est-à-dire en laissant l'espace réservé jusqu'à ce qu'un texte soit entré, plutôt que de perdre la valeur du focus)
Nathan Tregillus
4
  • Fonctionne uniquement pour IE9 +

La solution suivante se lie aux éléments de texte d'entrée avec l'attribut d'espace réservé. Il émule un comportement d'espace réservé uniquement pour IE et efface le champ de valeur de l'entrée lors de la soumission s'il n'est pas modifié.

Ajoutez ce script et IE semblerait prendre en charge les espaces réservés 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('');
        }
      });
    });
  }
});
Alex
la source
1
De nombreux utilisateurs utilisent encore IE8 et certains utilisent même IE7. Donc, je n'irais pas pour cela si cela ne les prend pas en charge
rzr
4

Je vous propose une fonction simple:

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

    element.blur();
}

Et pour l'utiliser, appelez-le de cette façon:

bindInOut($('#input'),'Here your value :)');
Alpha
la source
2

Vous pouvez utiliser :

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);
Roy MJ
la source
2

Simple comme ça:

$(function() {
    ...

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

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

    ...
});
Yitzchok Glancz
la source
1

J'ai mis au point un script JQuery d'espace réservé simple qui permet une couleur personnalisée et utilise un comportement différent pour effacer les entrées lorsque le focus est mis. Il remplace l'espace réservé par défaut dans Firefox et Chrome et ajoute la prise en charge d'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');
            }
        });
    });
});
mbokil
la source
salut parfait, mais vous avez une erreur (this) .attr ('tooltip', $ (this) .attr ('placeholder')); // buffer change cette ligne en $ (this) .attr ('tooltip', $ (this) .attr ('placeholder')); // buffer
angel.bonev
0

Placeholdr est un espace réservé jQuery polyfill super léger que j'ai écrit. C'est moins de 1 Ko minifié.

Je me suis assuré que cette bibliothèque répond à vos deux préoccupations:

  1. Placeholdr étend la fonction jQuery $ .fn.val () pour éviter les valeurs de retour inattendues lorsque du texte est présent dans les champs d'entrée à la suite de Placeholdr. Donc, si vous vous en tenez à l'API jQuery pour accéder aux valeurs de vos champs, vous n'aurez rien à changer.

  2. Placeholdr écoute les soumissions de formulaire et supprime le texte de l'espace réservé des champs afin que le serveur voie simplement une valeur vide.

Encore une fois, mon objectif avec Placeholdr est de fournir une solution simple et instantanée au problème des espaces réservés. Faites-moi savoir sur Github s'il y a autre chose qui vous intéresserait d'avoir le support de Placeholdr.

sffc
la source
0

Pour insérer le plugin et vérifier que le ie est parfaitement travailléjquery.placeholder.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>
Senthamizhmani.S
la source
0

Voici une fonction javascript pure (pas besoin de jquery) qui créera des espaces réservés pour IE 8 et ci-dessous et qui fonctionne également pour les mots de passe. Il lit l'attribut d'espace réservé HTML5 et crée un élément span derrière l'élément de formulaire et rend l'arrière-plan de l'élément de formulaire transparent:

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

Jeff Baker
la source
0

REMARQUE: l'auteur de ce polyfill affirme qu'il "fonctionne dans à peu près tous les navigateurs que vous pouvez imaginer" mais selon les commentaires ce n'est pas vrai pour IE11, cependant IE11 a un support natif, comme le font la plupart des navigateurs modernes

Placeholders.js est le meilleur polyfill d'espace réservé que j'ai vu, est léger, ne dépend pas de JQuery, couvre d'autres navigateurs plus anciens (pas seulement IE) et propose des options pour les espaces réservés de masquage à l'entrée et d'exécution unique.

Dave Everitt
la source
1
@Niclas IE9 et les versions ultérieures ont leur propre support natif pour les espaces réservés.
Hexodus
J'ai ajouté une note à cette réponse avec un lien vers caniuse pour les espaces réservés.
Dave Everitt
-1

j'utilise jquery.placeholderlabels . Il est basé sur ceci et peut être démo ici .

fonctionne dans ie7, ie8, ie9.

Le comportement imite le comportement actuel de Firefox et Chrome - où le texte «espace réservé» reste visible sur le focus et ne disparaît qu'une fois que quelque chose est tapé dans le champ.

Jaffadog
la source
-1

J'ai créé mon propre plugin jQuery après avoir été frustré par le fait que les shims existants masqueraient l'espace réservé sur le focus, ce qui crée une expérience utilisateur inférieure et ne correspond pas non plus à la façon dont Firefox, Chrome et Safari le gèrent. C'est particulièrement le cas si vous souhaitez qu'une entrée soit focalisée lors du premier chargement d'une page ou d'une fenêtre contextuelle, tout en affichant l'espace réservé jusqu'à ce que le texte soit saisi.

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

nspady
la source