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.