Отображение текста-заполнителя для поля пароля в IE

Я знаю, что есть тонна вопросов с заполнителем, но я пытаюсь совершенствовать свою.

Мой текущий код отлично работает и делает то, что он должен. Проблема заключается в том, что когда я перехожу к месту заполнения "пароля", он помещает заполнитель в маскирующие символы. Любые идеи о том, как обойти это?

    $(function() {
if(!$.support.placeholder) { 
        var active = document.activeElement;
    $(':text').focus(function () {
        if ($(this).attr('placeholder') != '' && $(this).val() ==  $(this).attr('placeholder')) {
            $(this).val('').removeClass('hasPlaceholder');
        }
    }).blur(function () {
        if ($(this).attr('placeholder') != '' && ($(this).val() == '' || $(this).val() == $(this).attr('placeholder'))) {
            $(this).val($(this).attr('placeholder')).addClass('hasPlaceholder');
        }
    });
    $(':text').blur();
    $(active).focus();
    $('form').submit(function () {
        $(this).find('.hasPlaceholder').each(function() { $(this).val(''); });
    });

    var active = document.activeElement;
    $(':password').focus(function () {
        if ($(this).attr('placeholder') != '' && $(this).val() == $(this).attr('placeholder')) {
            $(this).val('').removeClass('hasPlaceholder');
        }
    }).blur(function () {
        if ($(this).attr('placeholder') != '' && ($(this).val() == '' || $(this).val() == $(this).attr('placeholder'))) {
            $(this).val($(this).attr('placeholder')).addClass('hasPlaceholder');
        }
    });
    $(':password').blur();
    $(active).focus();
    $('form').submit(function () {
        $(this).find('.hasPlaceholder').each(function() { $(this).val(''); });
    });
}
   });

Мое поле для прохода:

  <div id="loginform_pass"><input class="login" tabindex="2" type="password" placeholder="Password" name="password" maxlength="30"></div>

Ответ 1

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

function FauxPlaceholder() {
        if(!ElementSupportAttribute('input','placeholder')) {
            $("input[placeholder]").each(function() {
                var $input = $(this);
                $input.after('<input id="'+$input.attr('id')+'-faux" style="display:none;" type="text" value="' + $input.attr('placeholder') + '" />');
                var $faux = $('#'+$input.attr('id')+'-faux');

                $faux.show().attr('class', $input.attr('class')).attr('style', $input.attr('style'));
                $input.hide();

                $faux.focus(function() {
                    $faux.hide();
                    $input.show().focus();
                });

                $input.blur(function() {
                    if($input.val() === '') {
                        $input.hide();
                        $faux.show();
                    }
                });
            });
        }
    }
    function ElementSupportAttribute(elm, attr) {
        var test = document.createElement(elm);
        return attr in test;
    }

Ответ 2

Не могли бы вы поменять исходное текстовое поле на поле пароля?

$('#pass').focus(
    function(){
        var pass = $('<input id="pass" type="password">');
        $(this).replaceWith(pass);
        pass.focus();
    }
);

<input id="pass" type="text" value="Passowrd">

http://jsfiddle.net/UrNFV/

Ответ 3

Я столкнулся с этой проблемой с IE раньше. Вот мое решение:)

http://jsfiddle.net/mNchn/

Ответ 4

Если я понимаю это право, вы хотите, чтобы в поле говорилось "Пароль", когда в него ничего не было введено; однако "Пароль" отображается как "********".

Порядочное исправление к этому (что также изящно ухудшается, в зависимости от того, как вы его кодируете):

  • Поместите ЛАБОРАТОР перед паролем INPUT. Установите текст LABEL в "Пароль" и установите для атрибута for значение INPUT ID, чтобы INPUT сфокусировался при нажатии кнопки LABEL.
  • Используйте CSS, чтобы расположить LABEL поверх INPUT, чтобы они перекрывались, и похоже, что "Пароль" находится внутри INPUT.
  • Сделайте так, чтобы LABEL была видна только тогда, когда к ней применяется некоторый CSS-класс (.showMe, например).
  • Используйте JavaScript, чтобы скрыть LABEL
    • ... если значение INPUT является пустой строкой
    • ... или пользователь выбрал (сфокусировал) INPUT.

Ответ 5

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

input {
    background: url(_img/placeholder.png) 50% 5px no-repeat;
    .
    .
    .
}
input:focus {
    background: none;
}

Ясно, что существует много разных способов использования этого метода, и вам придется использовать какое-то исправление, чтобы получить :focus для работы с браузерами, которые его не поддерживают.

Ответ 6

Здесь мой плагин:

if(jQuery.support.placeholder==false){
    // No default treatment
    $('[placeholder]').focus(function(){
        if($(this).val()==$(this).attr('placeholder'))
            $(this).val('');
        if($(this).data('type')=='password')
            $(this).get(0).type='password';
    });
    $('[placeholder]').blur(function(){
        if($(this).val()==''){
            if($(this).attr('type')=='password'){
                $(this).data('type','password').get(0).type='text';
            }
            $(this).val($(this).attr('placeholder'));
        }
    }).blur();
}

Ответ 7

У меня была такая же проблема, поэтому я написал небольшой плагин

$.fn.passLabel = function(){
var 
T = $(this),
P = T.find('input[type=password]'),
V = pass.val();

P.attr('type','text');
P.focus(function(){ 
if(V == "")
P.attr('type','password');
});
}

теперь вы просто вызываете его для from from, он найдет все поля ввода с паролем атрибут.

например.

$('form').passLabel();

Ответ 8

Немного поздно, но здесь же, я тоже работал над проблемой. IE9 не показывает пароль-заполнитель как текст, почти во всех ответах в Интернете некоторые предлагают изменить тип какой-то, но если у вас это будет, у вас будет другая проблема на странице входа в систему, например, когда вы увидите двойное нажатие на поле пароля, поскольку его тип изменен на текст с паролем, а btw работает с поддержкой. например prop ( "тип", "пароль" ), если вы хотите изменить тип элемента.

с другой стороны, я думаю, что большинство ответов исходит из одного решения, такого как фокус и размытие действий элементов. но когда вы примените этот плагин, будут также выполняться другие текстовые поля, нет конкретного или я могу сказать, что это обобщенное решение, у меня все еще есть незначительная проблема на странице входа с полем пароля, но он правильно показывает текст. так или иначе. вот как я сконфигурировал, скопировал, изменил и/или другие унаследованные анонсы здесь.

(function($) {
    $.fn.placeholder = function() {
        $('input[placeholder], textarea[placeholder]').focus(function() {
            var input = $(this);
            if (input.val() === input.attr('placeholder')) {
                if (input.prop("id") === "password") {
                    input.prop("type", "password");
                }
                input.val('');
                input.removeClass('placeholder');
            }
        }).blur(function() {
            var input = $(this);
            if (input.val() === '' || input.val() === input.attr('placeholder')) {
                input.addClass('placeholder');
                if (input.prop("type") === "password") {
                    input.prop("type", "text");
                }
                input.val(input.attr('placeholder'));
            }
        }).blur().parents('form').submit(function() {
            $(this).find('input[placeholder], textarea[placeholder]').each(function() {
                var input = $(this);
                if (input.val() === input.attr('placeholder')) {
                    input.val('');
                }
            });
        });
    };
})(jQuery);

все еще активный пролем...: D