Входные заполнители для Internet Explorer - PullRequest
173 голосов
/ 02 апреля 2011

HTML5 ввел атрибут placeholder в элементах input, что позволяет отображать неактивный текст по умолчанию.

К сожалению, Internet Explorer, включая IE 9, не поддерживает его.

Там уже есть несколько скриптов-симуляторов. Обычно они работают, помещая текст по умолчанию в поле ввода, присваивая ему серый цвет и удаляя его снова, как только вы сфокусируете поле ввода.

Недостаток этого подхода заключается в том, что текстовый заполнитель находится в поле ввода. Таким образом:

  1. сценарии не могут легко проверить, является ли поле ввода пустым
  2. Обработка на стороне сервера должна проверять значение по умолчанию, чтобы не добавлять заполнитель в базу данных.

Мне бы хотелось иметь решение, в котором текст-заполнитель отсутствует в самом вводе.

Ответы [ 17 ]

149 голосов
/ 29 августа 2011

При просмотре раздела «Веб-формы: заполнитель ввода» HTML5-кросс-браузерные полифиллы я увидел jQuery-html5-заполнитель .

Iпопробовал demo с IE9, и похоже, что он оборачивает ваш <input> с пролетом и накладывает метку на текст заполнителя.

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

Есть и другие прокладки, но я не смотрел на них всех.Один из них, Placeholder.js , объявляет себя как «Нет зависимостей (поэтому нет необходимости включать jQuery, в отличие от большинства скриптов-заполнителей заполнителей)».

Редактировать: Для тех, кто более заинтересован в том, «как», «что», Как создать расширенный полифилл заполнителя HTML5 , который проходит процесс создания плагина jQuery, который делает это.

Также см. Держите заполнитель в фокусе в IE10 для комментариев о том, как текст заполнителя исчезает в фокусе в IE10, который отличается от Firefox и Chrome.Не уверен, что есть решение этой проблемы.

38 голосов
/ 28 марта 2012

Лучшим в моем опыте является https://github.com/mathiasbynens/jquery-placeholder (рекомендуется html5please.com ). http://afarkas.github.com/webshim/demos/index.html также имеет хорошее решение среди гораздо более обширной библиотеки полифилов.

12 голосов
/ 01 июля 2012

С реализацией jQuery вы можете ЛЕГКО удалить значения по умолчанию, когда настало время отправки. Ниже приведен пример:

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

});

Я знаю, что вы ищете оверлей, но вы могли бы предпочесть легкость этого маршрута (теперь, зная, что я написал выше). Если так, то я написал это для своих собственных проектов, и это работает очень хорошо (требует jQuery) и занимает всего пару минут, чтобы реализовать для всего вашего сайта. Сначала он предлагает серый текст, светло-серый в фокусе и черный при наборе текста. Он также предлагает заполнитель текста всякий раз, когда поле ввода пусто.

Сначала настройте форму и включите атрибуты заполнителя во входные теги.

<input placeholder="enter your email here">

Просто скопируйте этот код и сохраните его как 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 );

Для использования только на одном входе

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

Вот как я рекомендую вам применять его во всех полях ввода на вашем сайте, когда браузер не поддерживает атрибуты-заполнители 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();
      });
  });
} 
6 голосов
/ 18 апреля 2013

После попытки внести некоторые предложения и увидеть проблемы в IE, вот то, что работает:

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

Что мне понравилось - вы просто включили файл js. Не нужно инициировать это или что-то еще.

4 голосов
/ 18 января 2012
  • Работает только для IE9 +

Следующее решение привязывает к элементам ввода текста с атрибутом placeholder. Он эмулирует поведение заполнителя только для IE и очищает поле ввода при отправке, если оно не изменилось.

Добавьте этот скрипт, и IE, похоже, будет поддерживать заполнители 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('');
        }
      });
    });
  }
});
4 голосов
/ 25 ноября 2012

Я предлагаю вам простую функцию:

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

    element.blur();
}

И чтобы использовать ее, вызовите ее так:

2 голосов
/ 05 января 2017

Просто так:

$(function() {
    ...

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

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

    ...
});
2 голосов
/ 28 августа 2013

Вы можете использовать:

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);
2 голосов
/ 01 сентября 2011

Я нашел довольно простое решение, используя этот метод:

http://www.hagenburger.net/BLOG/HTML5-Input-Placeholder-Fix-With-jQuery.html

это взлом jquery, и он отлично работал на моих проектах

1 голос
/ 18 июня 2013

Я придумал простой скрипт-заполнитель JQuery, который позволяет использовать собственный цвет и использует другое поведение очистки входных данных при фокусировке. Он заменяет заполнитель по умолчанию в Firefox и Chrome и добавляет поддержку 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');
            }
        });
    });
});
...