60 votes

Supprimer la valeur par défaut d'un texte saisi lors d'un clic

J'ai un texte d'entrée :

<input name="Email" type="text" id="Email" value="email@abc.example" />

Je veux mettre une valeur par défaut comme "Quelle est votre question de programmation ? soyez précis" dans Stack Overflow, et quand l'utilisateur clique dessus la valeur par défaut disparaît.

112voto

MvanGeest Points 6421

Pour référence future, je avoir pour inclure la manière HTML5 de le faire.

<input name="Email" type="text" id="Email" value="email@abc.example" placeholder="What's your programming question ? be specific." />

Si vous avez un doctype HTML5 et un navigateur compatible HTML5, cela fonctionnera. Cependant, de nombreux navigateurs ne prennent pas en charge cette fonction pour l'instant Ainsi, au moins les utilisateurs d'Internet Explorer ne pourront pas voir votre espace réservé. Cependant, voir JQuery HTML5 placeholder fix " Kamikazemusic.com pour trouver une solution. Grâce à cela, vous serez très moderne et conforme aux normes, tout en offrant des fonctionnalités à la plupart des utilisateurs.

De plus, le lien fourni est une solution bien testée et bien développée, qui devrait fonctionner sans problème.

0 votes

Bonne réponse, très pertinente de nos jours. Fonctionne bien en tant que <textarea placeholder="Write something..."></textarea> aussi.

2 votes

Value="" semble remplacer l'espace réservé et ne fonctionne pas si les deux sont présents.

1 votes

@Brian : Le lien fonctionne pour moi, mais j'ai ajouté un lien vers la version d'archive.org de la page à peu près au moment où j'ai écrit cette réponse. Gardez à l'esprit que c'était en 2010 - de nos jours tous les navigateurs modernes prennent en charge l'attribut placeholder Vous ne devriez donc pas avoir besoin d'un script pour améliorer la compatibilité, et vous ne devriez probablement pas l'utiliser.

64voto

mqchen Points 3621

Bien que cette solution fonctionne, je vous recommande d'essayer La solution de MvanGeest ci-dessous qui utilise le placeholder -et une solution de repli JavaScript pour les navigateurs qui ne le prennent pas encore en charge.

Si vous cherchez un équivalent Mootools au fallback jQuery dans la réponse de MvanGeest, en voici une .

--

Vous devriez probablement utiliser onfocus et onblur afin de prendre en charge les utilisateurs de clavier qui naviguent dans les formulaires.

En voici un exemple :

<input type="text" value="email@abc.example" name="Email" id="Email"
 onblur="if (this.value == '') {this.value = 'email@abc.example';}"
 onfocus="if (this.value == 'email@abc.example') {this.value = '';}" />

2 votes

Appuyé. -1 pour la pollution du DOM, il y a des solutions plus sémantiques (sans parler des solutions plus propres, plus courtes, etc.)

0 votes

Qu'entendez-vous par "polluer le DOM" ? Voulez-vous dire utiliser les attributs de l'événement ? Qu'y a-t-il de mal à cela ?

0 votes

@MvanGeest : Montrez-nous en un :) Je fais cela depuis longtemps et bien que je ferais ce script discret, je ne suis pas d'accord avec votre argument le plus court. Pouvez-vous me montrer n'importe quoi plus court et travaux maintenant d'une manière inter-navigateurs, remarquez que j'ai dit maintenant et non dans 5 ans.

26voto

Jani Points 442

C'est un peu plus propre, je pense. Notez l'utilisation de la propriété "defaultValue" de l'entrée :

<script>
function onBlur(el) {
    if (el.value == '') {
        el.value = el.defaultValue;
    }
}
function onFocus(el) {
    if (el.value == el.defaultValue) {
        el.value = '';
    }
}
</script>
<form>
<input type="text" value="[some default value]" onblur="onBlur(this)" onfocus="onFocus(this)" />
</form>

7voto

roosteronacid Points 9678

En utilisant jQuery, vous pouvez le faire :

$("input:text").each(function ()
{
    // store default value
    var v = this.value;

    $(this).blur(function ()
    {
        // if input is empty, reset value to default 
        if (this.value.length == 0) this.value = v;
    }).focus(function ()
    {
        // when input is focused, clear its contents
        this.value = "";
    }); 
});

Et vous pouvez placer tout cela dans un plug-in personnalisé, comme par exemple :

jQuery.fn.hideObtrusiveText = function ()
{
    return this.each(function ()
    {
        var v = this.value;

        $(this).blur(function ()
        {
            if (this.value.length == 0) this.value = v;
        }).focus(function ()
        {
            this.value = "";
        }); 
    });
};

Voici comment utiliser le plug-in :

$("input:text").hideObtrusiveText();

Les avantages de l'utilisation de ce code sont les suivants :

  • Il est discret et ne pollue pas le DOM
  • Réutilisation du code : il fonctionne sur plusieurs champs
  • Il calcule lui-même la valeur par défaut des entrées

Approche non JQuery :

function hideObtrusiveText(id)
{
    var e = document.getElementById(id);

    var v = e.value;

    e.onfocus = function ()
    {
        e.value = "";
    };

    e.onblur = function ()
    {
        if (e.value.length == 0) e.value = v;
    };
}

1 votes

3 commentaires ici : 1) if (this.value == v) this.value = v; devrait être if (this.value === "") this.value = v; 2) Vous effacez la valeur au moment de la mise au point, même s'il s'agit d'une valeur valide qui n'est pas une valeur par défaut, et 3) Ne pas assumer ils utilisent jQuery.

0 votes

Oui. J'ai repéré l'erreur et je l'ai corrigée. Merci Nick :)

0 votes

Votre solution efface toujours l'élément si je mets une entrée et recentre l'élément, ce qui n'est pas un comportement souhaitable.

3voto

Myke Points 11

Saisir les éléments suivants à l'intérieur du il suffit d'ajouter onFocus="value=''" pour que votre code final ressemble à ceci :

<input type="email" id="Email" onFocus="value=''"> 

Cela permet d'utiliser le support d'événement javascript onFocus().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X