Come supportare l'attributo segnaposto in IE8 e 9


132

Ho un piccolo problema, l' placeholderattributo per le caselle di input non è supportato in IE 8-9.

Qual è il modo migliore per rendere questo supporto nel mio progetto (ASP Net). Sto usando jQuery. Devo usare altri strumenti esterni per questo?

Http://www.hagenburger.net/BLOG/HTML5-Input-Placeholder-Fix-With-jQuery.html è una buona soluzione?


7
L'angolo di Pedant: è un attributo, non un tag. Un tag ha parentesi appuntite (come <input>); un attributo è una coppia chiave-valore all'interno delle parentesi graffe (come placeholder="This is an attribute value"). Lasciare la domanda così com'è, in modo che le persone future che pongono la stessa domanda possano trovarla.
Paul D. Waite,

2
Quel collegamento non funzionava così com'è. Ho rimosso le virgolette aggiuntive attorno al selettore $ ("[segnaposto]") ed è andato tutto bene.
claptimes

1
Inoltre, la soluzione in quel link non gestisce le caselle password come da supporto nativo in
webkit

1
Il link che hai dato funziona davvero molto bene - a parte le password funziona a
meraviglia

1
il collegamento è un'ottima soluzione
Pixelomo,

Risposte:


89

È possibile utilizzare questo plugin jQuery: https://github.com/mathiasbynens/jquery-placeholder

Ma il tuo link sembra essere anche una buona soluzione.


2
Il link suggerito nella domanda non ha funzionato per me; ha avuto problemi con l'invio del modulo. La soluzione che hai suggerito in questa risposta sembra molto più solida e ha funzionato a meraviglia.
Jonny White,

In realtà ho provato questo e funziona benissimo - ma non appena sto caricando una lightbox con un modulo e un campo password, tutto funziona ma non il campo password - è solo vuoto.
Jurik,

6
nella mia password IE8 il segnaposto è a punti
Mladen Janjetovic,

Inoltre non riesco a vederlo in ie8. Ci ho aggirato semplicemente facendo vedere qualche testo sopra i campi in ie8.
Jhawes,

jQuery-segnaposto si comporta diversamente. Rimuove il segnaposto attivo anziché quando l'utente inizia a digitare qualcosa sul campo come il normale comportamento in Firefox per i segnaposto.
supertonsky,

89

Puoi usare uno di questi polyfill:

Questi script aggiungeranno il supporto per l' placeholderattributo nei browser che non lo supportano e non richiedono jQuery!


4
Ho votato questo perché amo l'idea di una soluzione non jquery, ma in questo momento questo codice ha problemi in IE8, quindi non è adatto a me. github.com/jamesallardice/Placeholders.js/issues/17
Dan Searle

3
Questa soluzione non gestisce le caselle delle password
Jurik,

2
@Jurik Ho aggiunto un altro polyfill - spero che sia di aiuto.
Starbeamrainbowlabs,

1
Anche il distributore di questo plugin afferma che questo plugin non gestisce i campi password in <IE9 github.com/jamesallardice/Placeholders.js/issues/…
Jurik,

Il campo password non funziona ancora in iE8. Il link di risposta accettato sembra funzionare in ie8 per il campo password.
Susie,

24

il $ Browser.msie non è sull'ultima JQuery più ... devi usare il $ .support

come sotto:

 <script>

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


     //fix for IE7 and IE8
     $(function () {
         if (!$.support.placeholder) {
             $("[placeholder]").focus(function () {
                 if ($(this).val() == $(this).attr("placeholder")) $(this).val("");
             }).blur(function () {
                 if ($(this).val() == "") $(this).val($(this).attr("placeholder"));
             }).blur();

             $("[placeholder]").parents("form").submit(function () {
                 $(this).find('[placeholder]').each(function() {
                     if ($(this).val() == $(this).attr("placeholder")) {
                         $(this).val("");
                     }
                 });
             });
         }
     });
 </script>

2
funziona come un incantesimo, mi piace di più che aggiungere plugin, grazie
mille

@vsync no se leggi bene ho detto plugin, plurale, la maggior parte delle opzioni che ho trovato è necessario utilizzare più file, con tonnellate di codice, contro poche righe. non sei un po 'arrogante e in che modo questo commento migliora la risposta
LemonCool,

Questo non dovrebbe davvero essere usato. Questo è per uso interno di jQuery e potrebbe essere rimosso in qualsiasi momento. api.jquery.com/category/deprecated/deprecated-1.9
Will

3

se usi jquery puoi fare così. da questo sito Segnaposto con Jquery

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

questi sono i collegamenti alternativi

  1. Libreria segnaposto jquery
  2. Polyfill HTML5: scegli la sezione segnaposto

3
Questa risposta funziona, ma è necessario seguire il collegamento per la funzionalità completa. Il codice qui da solo non funzionerà.
Hawkee,

1
spesso non funzionerà, questo è un codice ridicolo! perché vincoli ancora e ancora lo stesso "modulo" per l' submitevento? cosa c'entra l'evento di invio con qualsiasi cosa
vsync

cosa succederà se scrivo lo stesso testo del testo segnaposto in IE8 ???
Bimal Das,

3

Ho avuto problemi di compatibilità con diversi plugin che ho provato, questo mi sembra il modo più semplice di supportare segnaposto sugli input di testo:

function placeholders(){
    //On Focus
    $(":text").focus(function(){
        //Check to see if the user has modified the input, if not then remove the placeholder text
        if($(this).val() == $(this).attr("placeholder")){
            $(this).val("");
        }
    });

    //On Blur
    $(":text").blur(function(){
        //Check to see if the use has modified the input, if not then populate the placeholder back into the input
        if( $(this).val() == ""){
            $(this).val($(this).attr("placeholder"));
        }
    });
}

supporta IE9?
Viku,

2
$(function(){    
    if($.browser.msie && $.browser.version <= 9){
        $("[placeholder]").focus(function(){
            if($(this).val()==$(this).attr("placeholder")) $(this).val("");
        }).blur(function(){
            if($(this).val()=="") $(this).val($(this).attr("placeholder"));
        }).blur();

        $("[placeholder]").parents("form").submit(function() {
            $(this).find('[placeholder]').each(function() {
                if ($(this).val() == $(this).attr("placeholder")) {
                    $(this).val("");
                }
            })
        });
    }
});

prova questo


1

Uso questo, è solo Javascript.

Ho semplicemente un elemento di input con un valore e quando l'utente fa clic sull'elemento di input, lo cambia in un elemento di input senza un valore.

Puoi cambiare facilmente il colore del testo usando i CSS. Il colore del segnaposto è il colore nell'ID #IEinput e il colore che sarà il testo digitato è il colore nell'ID #email. Non usare getElementsByClassName, perché le versioni di IE che non supportano un segnaposto, non supportano neanche getElementsByClassName!

È possibile utilizzare un segnaposto per l'immissione della password impostando il tipo di immissione della password originale su testo.

Tinker: http://tinker.io/4f7c5/1 - I server JSfiddle sono inattivi!

*scusa per il mio cattivo inglese

JAVASCRIPT

function removeValue() {
    document.getElementById('mailcontainer')
        .innerHTML = "<input id=\"email\" type=\"text\" name=\"mail\">";
    document.getElementById('email').focus(); }

HTML

<span id="mailcontainer">
    <input id="IEinput" onfocus="removeValue()" type="text" name="mail" value="mail">
</span>

3
Il segnaposto dovrebbe tornare se il campo è vuoto e lo stato attivo viene perso
Chris Pratt

1

Per gli altri che atterrano qui. Questo è ciò che ha funzionato per me:

//jquery polyfill for showing place holders in IE9
$('[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('');
        }
    })
});

Basta aggiungere questo nel tuo file script.js. Per gentile concessione di http://www.hagenburger.net/BLOG/HTML5-Input-Placeholder-Fix-With-jQuery.html


0

Poiché la maggior parte delle soluzioni utilizza jQuery o non è così soddisfacente come avrei voluto, ho scritto uno snippet per me stesso per i mootools.

function fix_placeholder(container){
    if(container == null) container = document.body;

    if(!('placeholder' in document.createElement('input'))){

        var inputs = container.getElements('input');
        Array.each(inputs, function(input){

            var type = input.get('type');

            if(type == 'text' || type == 'password'){

                var placeholder = input.get('placeholder');
                input.set('value', placeholder);
                input.addClass('__placeholder');

                if(!input.hasEvent('focus', placeholder_focus)){
                    input.addEvent('focus', placeholder_focus);
                }

                if(!input.hasEvent('blur', placeholder_blur)){
                    input.addEvent('blur', placeholder_blur);
                }

            }

        });

    }
}

function placeholder_focus(){

    var input = $(this);    

    if(input.get('class').contains('__placeholder') || input.get('value') == ''){
        input.removeClass('__placeholder');
        input.set('value', '');
    }

}

function placeholder_blur(){

    var input = $(this);    

    if(input.get('value') == ''){
        input.addClass('__placeholder');
        input.set('value', input.get('placeholder'));
    }

}

Confesso che sembra un po 'più PIÙ di altri ma funziona benissimo. __placeholder è una classe ccs per rendere fantasia il colore del testo segnaposto.

Ho usato fix_placeholder in window.addEvent ('domready', ... e per qualsiasi codice aggiunto come popup.

Spero ti piaccia.

Cordiali saluti.



0
<input type="text" name="Name" value="Name" onfocus="this.value = ''" onblur=" if(this.value = '') { value = 'Name'}" />

0

Aggiungi il codice qui sotto e sarà fatto.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    <script src="https://code.google.com/p/jquery-placeholder-js/source/browse/trunk/jquery.placeholder.1.3.min.js?r=6"></script>
    <script type="text/javascript">
        // Mock client code for testing purpose
        $(function(){
            // Client should be able to add another change event to the textfield
            $("input[name='input1']").blur(function(){ alert("Custom event triggered."); });    
            // Client should be able to set the field's styles, without affecting place holder
            $("textarea[name='input4']").css("color", "red");

            // Initialize placeholder
            $.Placeholder.init();

            // or try initialize with parameter
            //$.Placeholder.init({ color : 'rgb(255, 255, 0)' });

            // call this before form submit if you are submitting by JS
            //$.Placeholder.cleanBeforeSubmit();
        });
    </script>

Scarica il codice completo e la demo da https://code.google.com/p/jquery-placeholder-js/downloads/detail?name=jquery.placeholder.1.3.zip


0

Ecco una funzione javascript che creerà segnaposto per IE 8 e versioni precedenti e funziona anche per le password:

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


-1
    <script>
        if ($.browser.msie) {
            $('input[placeholder]').each(function() {

                var input = $(this);

                $(input).val(input.attr('placeholder'));

                $(input).focus(function() {
                    if (input.val() == input.attr('placeholder')) {
                        input.val('');
                    }
                });

                $(input).blur(function() {
                    if (input.val() == '' || input.val() == input.attr('placeholder')) {
                        input.val(input.attr('placeholder'));
                    }
                });
            });
        }
        ;
    </script>

$ .browser.msie non è più supportato. Prova invece a utilizzare il rilevamento delle funzionalità.
Invita il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.