Как поддерживать атрибут placeholder в IE8 и 9


132

У меня небольшая проблема, placeholderатрибут для полей ввода не поддерживается в IE 8-9.

Как лучше всего сделать эту поддержку в моем проекте (ASP Net). Я использую JQuery. Нужно ли мне использовать для этого какие-то другие внешние инструменты?

Является ли http://www.hagenburger.net/BLOG/HTML5-Input-Placeholder-Fix-With-jQuery.html хорошим решением?


7
Уголок Педанта: это атрибут, а не тег. Тег окружен заостренными скобками (например, <input>); атрибут - это пара "ключ-значение" в скобках (например, placeholder="This is an attribute value"). Оставьте вопрос как есть, чтобы будущие люди, которые задают тот же вопрос, могли его найти.
Пол Д. Уэйт,

2
Эта ссылка не работает как есть. Я удалил лишние кавычки вокруг селектора $ ("[placeholder]"), и все прошло нормально.
claptimes

1
Решение в этой ссылке также не обрабатывает ящики с паролями в соответствии с встроенной поддержкой в ​​webkit
geedubb

1
Ссылка, которую вы дали, действительно работает очень хорошо - помимо паролей, она работает неплохо и не может быть проще в настройке
hobailey

1
ссылка - отличное исправление
Pixelomo

Ответы:


89

Вы можете использовать этот плагин jQuery: https://github.com/mathiasbynens/jquery-placeholder

Но ваша ссылка кажется тоже хорошим решением.


2
Ссылка, предложенная в вопросе, не сработала для меня; у него были проблемы с отправкой формы. Решение, которое вы предложили в этом ответе, кажется намного более надежным и сработало.
Джонни Уайт

На самом деле я пробовал это, и он отлично работает, но как только я загружаю лайтбокс с формой и полем пароля, все работает, но не поле пароля - оно просто пустое.
Юрик

6
в моем заполнителе пароля IE8 точки
Младен Джанжетович

Я тоже не вижу этого в ie8. Я работал над этим, просто отображая текст над полями в ie8.
jhawes

jQuery-placeholder ведет себя иначе. Он удаляет заполнитель в фокусе вместо того, когда пользователь начинает вводить что-то в поле, как это обычно происходит в Firefox для заполнителей.
supertonsky

89

Вы можете использовать любой из этих полифиллов:

Эти скрипты добавят поддержку placeholderатрибута в браузеры, которые его не поддерживают, и они не требуют jQuery!


4
Я поддержал это, потому что мне нравится идея решения, отличного от jquery, но сейчас у этого кода есть проблемы в IE8, поэтому он мне не подходит. github.com/jamesallardice/Placeholder.js/issues/17
Дэн Сирл

3
Это решение не обрабатывает ящики с паролями
Юрик

2
@Jurik Я добавил дополнительный полифилл - надеюсь, поможет.
starbeamrainbowlabs

1
Даже распространитель этого плагина говорит, что этот плагин не обрабатывает поля паролей в <IE9 github.com/jamesallardice/Placeholder.js/issues/…
Юрик

Поле пароля по-прежнему не работает в iE8. Ссылка для принятого ответа, похоже, работает в ie8 для поля пароля.
Susie

24

$ .Browser.msie не на последнем JQuery больше ... Вы должны использовать $ .поддержка

как ниже:

 <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
это работает как шарм, мне это нравится больше, чем добавление плагинов, большое спасибо
LemonCool

@vsync нет, если вы хорошо читаете, я сказал плагины, множественное число, большинство вариантов, которые я обнаружил, вам нужно использовать несколько файлов с тоннами кода, а не несколькими строками. не правда ли, вы немного высокомерны, и как этот комментарий улучшает ответ?
LemonCool

На самом деле это не следует использовать. Это для внутреннего использования jQuery и может быть удалено в любое время. api.jquery.com/category/deprecated/deprecated-1.9
Will

3

если вы используете jquery, вы можете сделать это. с этого сайта Заполнитель с JQuery

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

это альтернативные ссылки

  1. Библиотека jquery-заполнителя
  2. Полифиллы HTML5 - перейдите в раздел заполнителя

3
Этот ответ работает, но вам нужно перейти по ссылке, чтобы получить полную функциональность. Код здесь сам по себе не работает.
Hawkee,

1
офс не сработает, это код насмешек! почему вы снова и снова привязываете одну и ту же «форму» к submitмероприятию? какое отношение имеет событие отправки к чему-либо
vsync

что произойдет, если я наберу тот же текст, что и в тексте-заполнителе в IE8 ???
Бимал Дас

3

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

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"));
        }
    });
}

он поддерживает 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("");
                }
            })
        });
    }
});

попробуй это


1

Я использую это одно, это только Javascript.

У меня просто есть элемент ввода со значением, и когда пользователь щелкает элемент ввода, он меняет его на элемент ввода без значения.

Вы можете легко изменить цвет текста с помощью CSS. Цвет заполнителя - это цвет идентификатора #IEinput, а цвет вашего напечатанного текста - это цвет идентификатора #email. Не используйте getElementsByClassName, потому что версии IE, которые не поддерживают заполнитель, также не поддерживают getElementsByClassName!

Вы можете использовать заполнитель при вводе пароля, установив тип исходного пароля для ввода текста.

Тинкер: http://tinker.io/4f7c5/1 - Серверы JSfiddle не работают!

*Извините за мой плохой английский

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
Заполнитель должен вернуться, если поле пусто и фокус потерян
Крис Пратт

1

Для других приземлиться здесь. Вот что сработало для меня:

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

Просто добавьте это в свой файл script.js. Любезно предоставлено http://www.hagenburger.net/BLOG/HTML5-Input-Placeholder-Fix-With-jQuery.html


0

Поскольку в большинстве решений используется jQuery или они не так хороши, как я хотел, я написал для себя фрагмент для 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'));
    }

}

Признаюсь, он выглядит БОЛЬШЕ других, но работает нормально. __placeholder - это класс ccs, позволяющий сделать цвет текста заполнителя необычным.

Я использовал fix_placeholder в window.addEvent ('domready', ... и для любого дополнительного кода, например всплывающих окон.

Надеюсь, вам понравится.

С уважением.



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

0

Добавьте приведенный ниже код, и все будет готово.

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

Загрузите полный код и демонстрацию с https://code.google.com/p/jquery-placeholder-js/downloads/detail?name=jquery.placeholder.1.3.zip


0

Вот функция javascript, которая будет создавать заполнители для IE 8 и ниже, и она также работает для паролей:

/* 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 больше не поддерживается. Попробуйте вместо этого использовать функцию обнаружения.
invot
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.