тип изменения поля ввода с jQuery

Наследование не всегда означает, что существует, "-" отношения и отсутствие, каждый не всегда подразумевает, что нет.

Примеры:

  • при использовании защищенного или частного наследования тогда Вы теряете внешнюю замещаемость, то есть, насколько любой за пределами Вашей иерархии обеспокоен, что Полученным не является тип Основы.
  • при переопределении основного виртуального участника и поведения изменения, заметного от кого-то ссылающегося на Основу, от исходного Базового внедрения, тогда Вы эффективно повредили замещаемость. Даже при том, что у Вас есть общедоступная иерархия наследования Полученная Основа is-not-a.
  • Ваш класс может иногда быть substituitable для другого без любых отношений наследования на работе. Например, если необходимо было использовать шаблоны и идентичные интерфейсы для соответствующих функций членства константы тогда "Эллипс const&"; то, где Эллипс, оказывается, является совершенно круговым, могло быть substituitable для "Круга const&";.

, Что я пытаюсь сказать вот, это, берет длительное размышление, и работа для поддержания "-" substitutable отношения между двумя типами, используете ли Вы наследование или нет.

200
задан Rory O'Kane 15 August 2013 в 05:59
поделиться

5 ответов

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

Редактировать: действительно, при тестировании прямо сейчас в Safari я получаю ошибку свойство типа не может быть изменено .

Редактировать 2: похоже, это ошибка прямо из jQuery. Использование следующего прямого кода DOM отлично работает:

var pass = document.createElement('input');
pass.type = 'password';
document.body.appendChild(pass);
pass.type = 'text';
pass.value = 'Password';

Редактировать 3: Прямо из источника jQuery, похоже, это связано с IE (и может быть либо ошибкой, либо частью их модели безопасности, но jQuery не является конкретным) :

// We can't allow the type property to be changed (since it causes problems in IE)
if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
    throw "type property can't be changed";
256
ответ дан 23 November 2019 в 05:05
поделиться

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

2
ответ дан 23 November 2019 в 05:05
поделиться

Просто создайте новое поле, чтобы обойти эту проблему безопасности:

var $oldPassword = $("#password");
var $newPassword = $("<input type='text' />")
                          .val($oldPassword.val())
                          .appendTo($oldPassword.parent());
$oldPassword.remove();
$newPassword.attr('id','password');
3
ответ дан 23 November 2019 в 05:05
поделиться

Окончательный способ использования jQuery:


Оставьте оригинальное поле ввода скрытым от экрана.

$("#Password").hide(); //Hide it first
var old_id = $("#Password").attr("id"); //Store ID of hidden input for later use
$("#Password").attr("id","Password_hidden"); //Change ID for hidden input

Создайте новое поле ввода "на лету" с помощью JavaScript.

var new_input = document.createElement("input");

Перенести идентификатор и значение из скрытого поля ввода в новое поле ввода.

new_input.setAttribute("id", old_id); //Assign old hidden input ID to new input
new_input.setAttribute("type","text"); //Set proper type
new_input.value = $("#Password_hidden").val(); //Transfer the value to new input
$("#Password_hidden").after(new_input); //Add new input right behind the hidden input

Чтобы обойти ошибку на IE, например, свойство типа нельзя изменить , это может оказаться полезным в следующих случаях:

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

$(new_input).click(function(){$("#Password_hidden").click();});
//Replicate above line for all other events like focus, change and so on...

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

Немного хитро, но РАБОТЫ!!! ;-)

6
ответ дан 23 November 2019 в 05:05
поделиться

Еще проще... нет необходимости в создании динамических элементов. Просто создайте два отдельных поля, сделав одно из них полем "настоящего" пароля (type="password"), а другое - полем "поддельного" пароля (type="text"), установив для текста в поддельном поле светло-серый цвет и задав начальное значение 'Password'. Затем добавьте несколько строк Javascript с помощью jQuery, как показано ниже:

    <script type="text/javascript">

        function pwdFocus() {
            $('#fakepassword').hide();
            $('#password').show();
            $('#password').focus();
        }

        function pwdBlur() {
            if ($('#password').attr('value') == '') {
                $('#password').hide();
                $('#fakepassword').show();
            }
        }
    </script>

    <input style="color: #ccc" type="text" name="fakepassword" id="fakepassword" value="Password" onfocus="pwdFocus()" />
    <input style="display: none" type="password" name="password" id="password" value="" onblur="pwdBlur()" />

Таким образом, когда пользователь вводит в поле "фальшивый" пароль, оно будет скрыто, настоящее поле будет показано, и фокус переместится на настоящее поле. Пользователь не сможет ввести текст в поддельное поле.

Когда пользователь покинет настоящее поле пароля, скрипт проверит, пустое ли оно, и если да, то скроет настоящее поле и покажет поддельное.

Будьте осторожны, чтобы не оставить пробел между двумя элементами ввода, потому что IE будет позиционировать один немного позже другого (отображая пробел), и поле будет казаться движущимся, когда пользователь вводит/выводит его.

76
ответ дан 23 November 2019 в 05:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: