Espaço reservado no IE9


140

Parece que é um problema muito conhecido, mas todas as soluções que encontrei no Google não funcionam no meu IE9 recém-baixado.

Qual é a sua maneira favorita para ativar a Placeholderpropriedade nas tags inpute textarea?

Opcional: perdi muito tempo com isso e ainda não procurei a requiredpropriedade. Você também teria algum conselho para isso? Obviamente, posso verificar o valor em PHP, mas para ajudar o usuário, essa propriedade é muito conveniente.


Estou de volta ao HTML depois de 4 anos. Ou seja, estou aberto a qualquer aconselhamento para substituir minhas ferramentas desatualizadas. Eu reinicio quase do zero. Eu tenho tentado principalmente com JQuery e muitos copy / passado de resultados do Google, a minha mais recente tentativa
chriscatfr

Respostas:


185

Espaço reservado HTML5 jQuery Plugin
- por Mathias Bynens (um colaborador no HTML5 Boilerplate e jsPerf )

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

Demonstração e exemplos

http://mathiasbynens.be/demo/placeholder

ps
Eu usei este plugin muitas vezes e funciona um prazer. Além disso, ele não envia o texto do espaço reservado como um valor quando você envia seu formulário (... uma dor real que encontrei com outros plugins).


Estamos trabalhando com um CRM personalizado. Adicionei esse código e os trabalhos conforme o esperado, mas eles enviam seus formulários via javascript. O botão enviar tem onclick="_IW.FormsRuntime.submit(this.form);". Existe alguma maneira de alterar esse evento onclick para limpar primeiro os espaços reservados e, em seguida, executar esse código CRM existente no onclick?
Leeish

1
copiei o arquivo github js no meu código src. Ainda não vai com o espaço reservado.
Philo

2
Isso realmente funciona, mas é difícil usar em aplicativos de página única. Você precisa acioná-lo manualmente para campos adicionados dinamicamente. Fora isso, funciona muito bem!
smets.kevin

1
Obrigado, plugin puro, no entanto, um problema que tenho é com ie9 o espaço reservado desaparece quando a entrada de texto está em foco. Isto é diferente do comportamento HTML5
gerrytan

1
Ele funciona bem com um grande 'but', $ ('input'). Val () retorna o valor do espaço reservado quando a entrada está vazia. Porque eu estou trabalhando com o quadro AJAX, que espaços reservados são enviados ao servidor ...
Danubian Sailor

21

Eu acho que é isso que você está procurando: jquery-html5-placeholder-fix

Esta solução usa a detecção de recursos (via modernizr ) para determinar se o espaço reservado é suportado. Caso contrário, adiciona suporte (via jQuery).


2
Funciona, mas não é o melhor código. No topo $(this)deve ser atribuído a uma variável que pode ser usada em todo o código. A chamada $para todas as expressões que usa $(this)é um não-não direto de "Não escreva jQuery como este 101".
Sami Samhuri 29/11

20
Você precisa ter cuidado com esse código, pois se você enviar o formulário, o valor do espaço reservado será enviado como um valor de formulário. Deve limpá-lo antes de ser enviado.
Ericbae

2
@chriscatfr Por favor, considere aceitar minha resposta ( stackoverflow.com/a/13281620/114140 ), pois acho que direcionará os usuários de SO a uma solução muito melhor.
Chris Jacob

Curioso, já que sou novo na batalha de recursos do HTML 5: é o modernizador que faz com que essa seja uma solução ruim ou a própria correção jquery-html5-placeholder (ou ambas)?
Snekse

Isso é simples e elegante e fez o trabalho por mim.
Graumanoz

17

Se você quiser fazer isso sem usar o jquery ou o modenizador, use o código abaixo:

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

}());

Para cada campo de texto que você deseja usá-lo, é necessário executar placeHolder(HTMLInputElement), mas acho que você pode simplesmente mudar isso para se adequar! Além disso, fazer dessa maneira, em vez de apenas carregar, significa que você pode fazê-lo funcionar para entradas que não estão no DOM quando a página é carregada.

Observe que isso funciona aplicando a classe: usingPlaceHolderao elemento de entrada, para que você possa usá-lo para estilizá-lo (por exemplo, adicione a regra .usingPlaceHolder { color: #999; font-style: italic; }para torná-la melhor).


1
Desculpe - eu realmente não sei se isso é fácil - acho que você deseja exibir o valor real do texto, em vez dos "símbolos". O único truque em que posso pensar em fazer isso seria trocá-lo por uma entrada de texto, a menos que tenha foco ou valor, caso contrário, exibi-lo como um campo de senha.
Mark Rhodes

@StephenPatten Veja minha correção para espaços reservados com campos de senha. Eu faço exatamente o que Mark sugeriu :)
Chev

8

Aqui está uma solução muito melhor. http://bavotasan.com/2011/html5-placeholder-jquery-fix/ Adotei um pouco para trabalhar apenas com navegadores no IE10

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

não funciona no IE8 desde IE não permite jQuery para manipular tipos de entrada (check-out comentário de Bill em 20 de Dezembro de 2011 às 13:48 na bavotasan.com/2011/html5-placeholder-jquery-fix )
Forste

também assume que você está enviando um formulário. A maioria dos aplicativos de página única que eu já vi não usa formulários. basta clicar em manipuladores.
Chovy

5

Se você deseja inserir uma descrição, pode usá-lo. Isso funciona no IE 9 e em todos os outros navegadores.

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

1
Não testei sozinho, mas acho que isso não funcionará bem se você tabular o campo em vez de clicar nele. Eu vejo esse bug em muitos sites ou em sites semelhantes.
eselk

Com esta solução, você também precisa verificar esse valor no envio do formulário.
Igor Jerosimić

Estou surpreso este tem alguma votos, isso não deve ser utilizado mesmo quando postou em 2012/2013
LocalPCGuy

Se você escrever na entrada, qual deve ser o espaço reservado ('CV2:') o que você digitou será excluído.
Daniel

2

Usando mordernizr para detectar navegadores que não oferecem suporte ao Placeholder, criei esse código curto para corrigi-los.

//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
Você precisa ter cuidado com esse código, pois se você enviar o formulário, o valor do espaço reservado será enviado como um valor de formulário. Você deve limpá-lo antes de ser enviado.
Chriscatfr 23/10/2015

3
@chriscatfr: Como alguém faria isso corretamente neste exemplo? Se meu espaço reservado for 'Senha' e minha senha for realmente 'Senha'?
Lain

Você pode usar o conceito de "sujo" para campos como este. Sinalize o campo como limpo na entrada (talvez use data-dirty = "false"). Se eles enviarem o formulário sem alterar o texto do espaço reservado, você verá que o campo está limpo, então limpe-o. Se eles o alteraram, mesmo com o mesmo valor que o espaço reservado, está sujo e você envia esse valor.
oooyaya

para a senha e outra solução por favor, olhar para o jsfiddle.net/AlexanderPatel/1pv2174c/3
Shirish Patel

placeholdera propriedade foi padronizada como string => não há necessidade de Modernizr na verdade :::::::::::::::::::::::::::::: if( typeof $('<input type="text">').get(0).placeholder == "undefined" ){ ... }é um teste completo para não-suporte, testado na emulação de modo IE9 - funciona.
Jave.web 1/11/16

2

Sei que estou atrasado, mas encontrei uma solução inserindo na cabeça a tag:

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


Você testou isso no IE9? Porque de outra forma IE10 + suportes espaço reservado ...
jave.web

É claro, é estranho que o IE9 não suporte a si próprio que uma tag a ativaria - era um recurso experimental por trás disso? Isso é referenciado em algum lugar? :)
jave.web

1

para fazê-lo funcionar no IE-9, use abaixo. funciona para mim

O JQuery precisa incluir:

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

O estilo CSS precisa incluir:

.hasPlaceholder {color: #aaa;}

1
você deve corrigir sua formatação aqui, como add recuo e separar a sua resposta do seu código
um darren

1

Um pouco atrasado para a festa, mas eu uso o meu JS experimentado e confiável que tira proveito do Modernizr . Pode ser copiado / colado e aplicado a qualquer projeto. Funciona sempre:

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

}

Todas essas soluções usando jQuery .. não há solução sem o jQuery inchado?
Spock

0

Eu geralmente penso muito bem em http://cdnjs.com/ e eles estão listando:

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

Não tenho certeza de quem é o código, mas parece direto:

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
Este plugin requer a biblioteca protótipo também
rosswil

0

Eu procurei na internet e encontrei um código jquery simples para lidar com esse problema. Do meu lado, foi resolvido e trabalhado no ie 9.

$("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
seu espaço reservado se torna o valor. Se você enviar, eles serão enviados. Com o placeholder.js da resposta correta, os campos são mantidos em branco
chriscatfr
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.