thay đổi loại trường đầu vào với jQuery


205
$(document).ready(function() {
    // #login-box password field
    $('#password').attr('type', 'text');
    $('#password').val('Password');
});

Điều này được cho là để thay đổi trường #passwordđầu vào (với id="password") là type passwordtrường văn bản bình thường, sau đó điền vào văn bản Mật khẩu mật khẩu.

Nó không hoạt động, mặc dù. Tại sao?

Đây là mẫu:

<form enctype="application/x-www-form-urlencoded" method="post" action="/auth/sign-in">
  <ol>
    <li>
      <div class="element">
        <input type="text" name="username" id="username" value="Prihlasovacie meno" class="input-text" />
      </div>
    </li>
    <li>
      <div class="element">
        <input type="password" name="password" id="password" value="" class="input-text" />
      </div>
    </li>
    <li class="button">
      <div class="button">
        <input type="submit" name="sign_in" id="sign_in" value="Prihlásiť" class="input-submit" />
      </div>
    </li>
  </ol>
</form>

Tại sao bạn muốn thay đổi nó?
ChaosPandion

Tôi muốn có một văn bản 'Mật khẩu' của người dùng trong đầu vào để người dùng biết phải điền gì (vì không có nhãn).
Richard Knop

Câu trả lời:


258

Rất có khả năng hành động này bị ngăn chặn như là một phần của mô hình bảo mật của trình duyệt.

Chỉnh sửa: thực sự, thử nghiệm ngay bây giờ trong Safari, tôi gặp lỗi type property cannot be changed .

Chỉnh sửa 2: đó dường như là một lỗi ngay từ jQuery. Sử dụng mã DOM thẳng sau đây hoạt động tốt:

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

Chỉnh sửa 3: Trực tiếp từ nguồn jQuery, điều này dường như có liên quan đến IE (và có thể là một lỗi hoặc một phần của mô hình bảo mật của họ, nhưng jQuery không cụ thể):

// 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";

12
phải nói rằng, đây là phép đo bảo mật vô dụng nhất mà tôi từng thấy. Dường như không có nhiều sự khác biệt giữa việc thay đổi nhanh chóng loại trường và thay thế nó bằng một trường hoàn toàn mới. Rất lạ ... dù sao, làm việc cho tôi. Cảm ơn!

2
Đây không phải là công cụ mô hình bảo mật, tôi có thể xác nhận rằng nó không hoạt động trong IE7, IE8 có lỗi: Không thể lấy thuộc tính loại
Mã Novitiate

Tìm thấy câu trả lời này trên một tìm kiếm và nó là một trợ giúp tuyệt vời. Tuy nhiên, giải pháp của tôi là chỉ cần loại bỏ kiểm tra đó khỏi jquery. Làm việc tuyệt vời.
Michael

2
@Michael, tôi khuyên bạn không nên thay đổi trực tiếp jQuery. Bên cạnh đó, nó tạo ra một trách nhiệm xung đột trong tương lai, kiểm tra đó có thể được đưa ra vì một lý do. Nếu bạn không cần phải lo lắng về hỗ trợ IE, thay vào đó, bạn có thể triển khai một tiện ích mở rộng jQuery song song attrnhưng cho phép thay đổi typethuộc tính trên inputcác phần tử.
mí mắt

1
Chỉ cần thêm bản cập nhật 4 - hy vọng nó giúp giải thích mọi thứ và cách khắc phục chúng.
ClarkeyBoy

76

Thậm chí dễ dàng hơn ... không cần thiết cho tất cả việc tạo phần tử động. Chỉ cần tạo hai trường riêng biệt, tạo một trường mật khẩu 'thực' (loại = "mật khẩu") và một trường mật khẩu 'giả' (loại = "văn bản"), đặt văn bản trong trường giả thành màu xám nhạt và đặt giá trị ban đầu thành 'Mật khẩu'. Sau đó thêm một vài dòng Javascript với jQuery như dưới đây:

    <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()" />

Vì vậy, khi người dùng nhập vào trường mật khẩu 'giả', nó sẽ bị ẩn, trường thực sẽ được hiển thị và tiêu điểm sẽ chuyển sang trường thực. Họ sẽ không bao giờ có thể nhập văn bản trong trường giả mạo.

Khi người dùng rời khỏi trường mật khẩu thực, tập lệnh sẽ xem nó có trống không và nếu có thì sẽ ẩn trường thật và hiển thị trường giả.

Cẩn thận không chừa một khoảng trống giữa hai thành phần đầu vào vì IE sẽ định vị một chút sau phần tử kia (hiển thị khoảng trắng) và trường sẽ xuất hiện để di chuyển khi người dùng vào / thoát nó.


2
Bạn cũng có thể xâu chuỗi các chức năng sau: $('#password').show(); $('#password').focus();như$('#password').show().focus();
Anriëtte Myburgh

Tôi có cả hai trường như thế này: <input type = "text" /> <input type = "password" /> và tôi vẫn nhận được sự thay đổi theo chiều dọc trong IE (9) khi chúng trao đổi. Xâu chuỗi các phương thức ($ ('# password'). Show (). Focus ();) không giúp ích gì cho điều đó, nhưng đó là một động thái tối ưu hóa thú vị. Nhìn chung đây là giải pháp tốt nhất.
Chương trình AV

nếu người dùng di chuyển tiêu điểm sang một điều khiển khác và onblur bị bắn, tiêu điểm sẽ quay trở lại trường mật khẩu giả
Allan Chua

Bạn nên sử dụng: if ($ ('# password'). Val () == '') {thay vì: if ($ ('# password'). Attr ('value') == '') {Nếu không thì giá trị mật khẩu sẽ luôn hiển thị onblur 'password'.
Stephen Paul

75

Giải pháp một bước

$('#password').get(0).type = 'text';

5
document.getElementByIdnên là đủ và bạn không cần jQuery cho nó! ;-)
Gandaro

2
Trên thực tế, theo câu hỏi, đó là giải pháp jQuery.
Sanket Sahu

17
hoặc thậm chí ngắn hơn, $ ('# password') [0] .type = 'text';
Sanket Sahu

2
điều này có thể gây ra vấn đề với IE9, loại không xác định. Tuyệt vời cho các trình duyệt khác mặc dù.
kravits88

1
IE 8 sẽ thực sự gây ra lỗi nếu bạn cố gắng thay đổi loại từ "mật khẩu" thành "văn bản" theo cách này. Lỗi nói "Không thể có được thuộc tính loại. Lệnh này không được hỗ trợ."
allieferr

41

Ngày nay, bạn chỉ có thể sử dụng

$("#password").prop("type", "text");

Nhưng tất nhiên, bạn thực sự nên làm điều này

<input type="password" placeholder="Password" />

trong tất cả trừ IE. Có những miếng giữ chỗ ngoài kia để bắt chước chức năng đó trong IE.



1
IE 8 đã chết. Các giải pháp HTML gốc sống lâu. Ném chỗ giữ của bạn shims đi và ăn mừng.
Andrew

14

Một giải pháp đa trình duyệt khác, tôi hy vọng ý chính của việc này sẽ giúp được ai đó ngoài kia.

Giải pháp này cố gắng đặt typethuộc tính và nếu thất bại, nó chỉ đơn giản tạo một thuộc tính mới<input> phần tử , bảo toàn các thuộc tính phần tử và xử lý sự kiện.

changeTypeAttr.js( GitHub Gist ):

/* x is the <input/> element
   type is the type you want to change it to.
   jQuery is required and assumed to be the "$" variable */
function changeType(x, type) {
    x = $(x);
    if(x.prop('type') == type)
        return x; //That was easy.
    try {
        return x.prop('type', type); //Stupid IE security will not allow this
    } catch(e) {
        //Try re-creating the element (yep... this sucks)
        //jQuery has no html() method for the element, so we have to put into a div first
        var html = $("<div>").append(x.clone()).html();
        var regex = /type=(\")?([^\"\s]+)(\")?/; //matches type=text or type="text"
        //If no match, we add the type attribute to the end; otherwise, we replace
        var tmp = $(html.match(regex) == null ?
            html.replace(">", ' type="' + type + '">') :
            html.replace(regex, 'type="' + type + '"') );
        //Copy data from old element
        tmp.data('type', x.data('type') );
        var events = x.data('events');
        var cb = function(events) {
            return function() {
                //Bind all prior events
                for(i in events)
                {
                    var y = events[i];
                    for(j in y)
                        tmp.bind(i, y[j].handler);
                }
            }
        }(events);
        x.replaceWith(tmp);
        setTimeout(cb, 10); //Wait a bit to call function
        return tmp;
    }
}

Điều đó thật tệ, nếu mọi người nói F ... nó, thì không có gì hoạt động, nó có nên hoạt động trên nhiều trình duyệt hay không.
Val

Nói về ý chính ... bạn nên tạo một mã cho mã này. gist.github.com
Christopher Parker

8

Điều này làm việc cho tôi.

$('#password').replaceWith($('#password').clone().attr('type', 'text'));

Cảm ơn! Điều này giải quyết các vấn đề tôi gặp phải với các câu trả lời khác không hoạt động trong IE. Chỉ cần nhớ đây là một đối tượng mới, do đó bạn sẽ phải lấy lại từ DOM nếu bạn đã lưu trữ $ ('# password') trong một biến.
kravits88

1
Điều này không hoạt động trong IE8. Bạn vẫn nhận được lỗi "loại tài sản không thể thay đổi".
jcoffland

6

Một cách cuối cùng để sử dụng jQuery:


Để trường nhập ban đầu ẩn khỏi màn hình.

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

Tạo trường đầu vào mới một cách nhanh chóng bằng JavaScript.

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

Di chuyển ID và giá trị từ trường đầu vào ẩn sang trường đầu vào mới.

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

Để khắc phục lỗi trên IE như type property cannot be changed , bạn có thể thấy điều này hữu ích như tin tưởng:

Đính kèm sự kiện nhấp / tập trung / thay đổi vào thành phần đầu vào mới, để kích hoạt cùng một sự kiện trên đầu vào ẩn.

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

Phần tử đầu vào ẩn cũ vẫn nằm trong DOM nên sẽ phản ứng với sự kiện được kích hoạt bởi phần tử đầu vào mới. Khi ID được hoán đổi, phần tử đầu vào mới sẽ hoạt động giống như phần tử cũ và trả lời bất kỳ lệnh gọi chức năng nào đối với ID của đầu vào bị ẩn cũ, nhưng trông khác nhau.

Một chút khó khăn nhưng CÔNG VIỆC !!! ;-)



4

Tôi chưa thử nghiệm trên IE (vì tôi cần điều này cho một trang web iPad) - một hình thức tôi không thể thay đổi HTML nhưng tôi có thể thêm JS:

document.getElementById('phonenumber').type = 'tel';

(JS trường học cũ là xấu xí bên cạnh tất cả các jQuery!)

Nhưng, http://bugs.jquery.com/ticket/1957 liên kết với MSDN: "Kể từ Microsoft Internet Explorer 5, thuộc tính loại được đọc / ghi một lần, nhưng chỉ khi một phần tử đầu vào được tạo bằng phương thức createEuity và trước khi nó được thêm vào tài liệu. " Vì vậy, có lẽ bạn có thể nhân đôi thành phần, thay đổi loại, thêm vào DOM và xóa cái cũ?


3

Chỉ cần tạo một trường mới để bỏ qua điều bảo mật này:

var $oldPassword = $("#password");
var $newPassword = $("<input type='text' />")
                          .val($oldPassword.val())
                          .appendTo($oldPassword.parent());
$oldPassword.remove();
$newPassword.attr('id','password');

3

Tôi đã nhận được thông báo lỗi tương tự trong khi thử làm điều này trong Firefox 5.

Tôi đã giải quyết nó bằng cách sử dụng mã dưới đây:

<script type="text/javascript" language="JavaScript">

$(document).ready(function()
{
    var passfield = document.getElementById('password_field_id');
    passfield.type = 'text';
});

function focusCheckDefaultValue(field, type, defaultValue)
{
    if (field.value == defaultValue)
    {
        field.value = '';
    }
    if (type == 'pass')
    {
        field.type = 'password';
    }
}
function blurCheckDefaultValue(field, type, defaultValue)
{
    if (field.value == '')
    {
        field.value = defaultValue;
    }
    if (type == 'pass' && field.value == defaultValue)
    {
        field.type = 'text';
    }
    else if (type == 'pass' && field.value != defaultValue)
    {
        field.type = 'password';
    }
}

</script>

Và để sử dụng nó, chỉ cần đặt các thuộc tính onF Focus và onBlur của các trường của bạn thành một cái gì đó như sau:

<input type="text" value="Username" name="username" id="username" 
    onFocus="javascript:focusCheckDefaultValue(this, '', 'Username -OR- Email Address');"
    onBlur="javascript:blurCheckDefaultValue(this, '', 'Username -OR- Email Address');">

<input type="password" value="Password" name="pass" id="pass"
    onFocus="javascript:focusCheckDefaultValue(this, 'pass', 'Password');"
    onBlur="javascript:blurCheckDefaultValue(this, 'pass', 'Password');">

Tôi cũng sử dụng nó cho một trường tên người dùng, vì vậy nó sẽ thay đổi giá trị mặc định. Chỉ cần đặt tham số thứ hai của hàm thành '' khi bạn gọi nó.

Ngoài ra, có thể đáng lưu ý rằng loại mặc định của trường mật khẩu của tôi thực sự là mật khẩu, chỉ trong trường hợp người dùng không bật javascript hoặc nếu có lỗi, cách đó mật khẩu của họ vẫn được bảo vệ.

Hàm $ (document). Yet là jQuery và tải khi tài liệu tải xong. Điều này sau đó thay đổi trường mật khẩu thành một trường văn bản. Rõ ràng bạn sẽ phải thay đổi 'password_field_id' thành id trường mật khẩu của bạn.

Hãy sử dụng và sửa đổi mã!

Hy vọng điều này sẽ giúp tất cả những người có cùng một vấn đề tôi đã làm :)

- Kent Kent

EDIT: Giải pháp tốt nhưng không tuyệt đối. Hoạt động trên FF8 và IE8 NHƯNG không hoàn toàn trên Chrome (16.0.912,75 ver). Chrome không hiển thị văn bản Mật khẩu khi tải trang. Ngoài ra - FF sẽ hiển thị mật khẩu của bạn khi bật tự động điền.


3

Giải pháp đơn giản cho tất cả những ai muốn chức năng trong tất cả các trình duyệt:

HTML

<input type="password" id="password">
<input type="text" id="passwordHide" style="display:none;">
<input type="checkbox" id="passwordSwitch" checked="checked">Hide password

jQuery

$("#passwordSwitch").change(function(){
    var p = $('#password');
    var h = $('#passwordHide');
    h.val(p.val());
    if($(this).attr('checked')=='checked'){
        h.hide();
        p.show();
    }else{
        p.hide();
        h.show();
    }
});

2

Loại thuộc tính không thể thay đổi, bạn cần thay thế hoặc phủ lớp đầu vào bằng kiểu nhập văn bản và gửi giá trị đến mật khẩu đầu vào khi gửi.


2

Tôi đoán bạn có thể sử dụng hình nền có chứa từ "mật khẩu" và thay đổi lại thành hình nền trống trên .focus() .

.blur() ----> hình ảnh với "mật khẩu"

.focus() -----> hình ảnh không có "mật khẩu"

Bạn cũng có thể làm điều đó với một số CSS và jQuery. Có một trường văn bản hiển thị chính xác ở trên cùng của trường mật khẩu, ẩn () là tiêu điểm () và tập trung vào trường mật khẩu ...


2

Hãy thử bản
Demo này tại đây

$(document).delegate('input[type="text"]','click', function() {
    $(this).replaceWith('<input type="password" value="'+this.value+'" id="'+this.id+'">');
}); 
$(document).delegate('input[type="password"]','click', function() {
    $(this).replaceWith('<input type="text" value="'+this.value+'" id="'+this.id+'">');
}); 

2

Nó hoạt động dễ dàng hơn nhiều với điều đó:

document.querySelector('input[type=password]').setAttribute('type', 'text');

và để quay lại trường mật khẩu một lần nữa, ( giả sử trường mật khẩu là thẻ đầu vào thứ 2 với loại văn bản ):

document.querySelectorAll('input[type=text]')[1].setAttribute('type', 'password')

2

Điều này làm việc cho tôi.

$('#newpassword_field').attr("type", 'text');

1

sử dụng cái này nó rất dễ

<input id="pw" onclick="document.getElementById('pw').type='password';
  document.getElementById('pw').value='';"
  name="password" type="text" value="Password" />

1
$('#pass').focus(function() { 
$('#pass').replaceWith("<input id='password' size='70' type='password' value='' name='password'>");
$('#password').focus();
});

<input id='pass' size='70' type='text' value='password' name='password'>

1
jQuery.fn.outerHTML = function() {
    return $(this).clone().wrap('<div>').parent().html();
};
$('input#password').replaceWith($('input.password').outerHTML().replace(/text/g,'password'));

1

Điều này sẽ làm các mẹo. Mặc dù nó có thể được cải thiện để bỏ qua các thuộc tính hiện không liên quan.

Cắm vào:

(function($){
  $.fn.changeType = function(type) {  
    return this.each(function(i, elm) {
        var newElm = $("<input type=\""+type+"\" />");
        for(var iAttr = 0; iAttr < elm.attributes.length; iAttr++) {
            var attribute = elm.attributes[iAttr].name;
            if(attribute === "type") {
                continue;
            }
            newElm.attr(attribute, elm.attributes[iAttr].value);
        }
        $(elm).replaceWith(newElm);
    });
  };
})(jQuery);

Sử dụng:

$(":submit").changeType("checkbox");

Vĩ cầm:

http://jsfiddle.net/joshcomley/yX23U/


1

Đơn giản thế này:

this.type = 'password';

nhu la

$("#password").click(function(){
    this.type = 'password';
});

Điều này giả sử rằng trường nhập của bạn đã được đặt thành "văn bản" trước khi sử dụng.


1

Đây là một đoạn nhỏ cho phép bạn thay đổi các typeyếu tố trong tài liệu.

jquery.type.js( GitHub Gist ):

var rtype = /^(?:button|input)$/i;

jQuery.attrHooks.type.set = function(elem, value) {
    // We can't allow the type property to be changed (since it causes problems in IE)
    if (rtype.test(elem.nodeName) && elem.parentNode) {
        // jQuery.error( "type property can't be changed" );

        // JB: Or ... can it!?
        var $el = $(elem);
        var insertionFn = 'after';
        var $insertionPoint = $el.prev();
        if (!$insertionPoint.length) {
            insertionFn = 'prepend';
            $insertionPoint = $el.parent();
        }

        $el.detach().attr('type', value);
        $insertionPoint[insertionFn]($el);
        return value;

    } else if (!jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input")) {
        // Setting the type on a radio button after the value resets the value in IE6-9
        // Reset value to it's default in case type is set after value
        // This is for element creation
        var val = elem.value;
        elem.setAttribute("type", value);
        if (val) {
            elem.value = val;
        }
        return value;
    }
}

Nó khắc phục vấn đề bằng cách xóa inputtài liệu khỏi tài liệu, thay đổi typevà sau đó đưa nó trở lại vị trí ban đầu.

Lưu ý rằng đoạn mã này chỉ được thử nghiệm cho trình duyệt WebKit - không đảm bảo cho bất kỳ điều gì khác!


Trên thực tế, hãy quên điều đó - chỉ cần sử dụng delete jQuery.attrHooks.typeđể loại bỏ các kiểu nhập đặc biệt của jQuery.
jb.

1

Đây là một phương pháp sử dụng một hình ảnh bên cạnh trường mật khẩu để chuyển đổi giữa việc xem mật khẩu (nhập văn bản) và không nhìn thấy nó (nhập mật khẩu). Tôi sử dụng hình ảnh "mắt mở" và "mắt nhắm", nhưng bạn có thể sử dụng bất cứ thứ gì phù hợp với mình. Cách thức hoạt động của nó là có hai đầu vào / hình ảnh và khi nhấp vào hình ảnh, giá trị được sao chép từ đầu vào hiển thị sang đầu vào ẩn, và sau đó tầm nhìn của chúng bị tráo đổi. Không giống như nhiều câu trả lời khác sử dụng tên mã hóa cứng, câu trả lời này đủ chung để sử dụng nó nhiều lần trên một trang. Nó cũng xuống cấp một cách duyên dáng nếu JavaScript không có sẵn.

Đây là những gì hai trong số này trông giống như trên một trang. Trong ví dụ này, Mật khẩu-A đã được tiết lộ bằng cách nhấp vào mắt của nó.

Trông nó thế nào

$(document).ready(function() {
  $('img.eye').show();
  $('span.pnt').on('click', 'img', function() {
    var self = $(this);
    var myinp = self.prev();
    var myspan = self.parent();
    var mypnt = myspan.parent();
    var otspan = mypnt.children().not(myspan);
    var otinp = otspan.children().first();
    otinp.val(myinp.val());
    myspan.hide();
    otspan.show();
  });
});
img.eye {
  vertical-align: middle;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<form>
<b>Password-A:</b>
<span class="pnt">
<span>
<input type="password" name="passa">
<img src="eye-open.png" class="eye" alt="O" style="display:none">
</span>
<span style="display:none">
<input type="text">
<img src="eye-closed.png" class="eye" alt="*">
</span>
</span>
</form>

<form>
<b>Password-B:</b>
<span class="pnt">
<span>             
<input type="password" name="passb">
<img src="eye-open.png" class="eye" alt="O" style="display:none">
</span> 
<span style="display:none">            
<input type="text">
<img src="eye-closed.png" class="eye" alt="*">
</span> 
</span>
</form>


0

Tôi thích cách này, để thay đổi loại phần tử đầu vào: old_input.clone () .... Đây là một ví dụ. Có một hộp kiểm "id_select_multipl". Nếu điều này được thay đổi thành "được chọn", các yếu tố đầu vào có tên "foo" sẽ được thay đổi thành hộp kiểm. Nếu nó không được kiểm tra, chúng sẽ trở thành nút radio một lần nữa.

  $(function() {
    $("#id_select_multiple").change(function() {
     var new_type='';
     if ($(this).is(":checked")){ // .val() is always "on"
          new_type='checkbox';
     } else {
         new_type="radio";
     }
     $('input[name="foo"]').each(function(index){
         var new_input = $(this).clone();
         new_input.attr("type", new_type);
         new_input.insertBefore($(this));
         $(this).remove();
     });
    }
  )});

Điều này không hoạt động trong IE8. Bạn vẫn nhận được lỗi "loại tài sản không thể thay đổi".
jcoffland

0

đây là một giải pháp DOM

myInput=document.getElementById("myinput");
oldHtml=myInput.outerHTML;
text=myInput.value;
newHtml=oldHtml.replace("password","text");
myInput.outerHTML=newHtml;
myInput=document.getElementById("myinput");
myInput.value=text;

0

Tôi đã tạo một tiện ích mở rộng jQuery để chuyển đổi giữa văn bản và mật khẩu. Hoạt động trong IE8 (có thể là 6 & 7, nhưng chưa được thử nghiệm) và sẽ không mất giá trị hoặc thuộc tính của bạn:

$.fn.togglePassword = function (showPass) {
    return this.each(function () {
        var $this = $(this);
        if ($this.attr('type') == 'text' || $this.attr('type') == 'password') {
            var clone = null;
            if((showPass == null && ($this.attr('type') == 'text')) || (showPass != null && !showPass)) {
                clone = $('<input type="password" />');
            }else if((showPass == null && ($this.attr('type') == 'password')) || (showPass != null && showPass)){
                clone = $('<input type="text" />');
            }
            $.each($this.prop("attributes"), function() {
                if(this.name != 'type') {
                    clone.attr(this.name, this.value);
                }
            });
            clone.val($this.val());
            $this.replaceWith(clone);
        }
    });
};

Hoạt động như một lá bùa. Bạn chỉ có thể gọi $('#element').togglePassword();để chuyển đổi giữa hai hoặc đưa ra một tùy chọn để 'buộc' hành động dựa trên một thứ khác (như hộp kiểm):$('#element').togglePassword($checkbox.prop('checked'));


0

Chỉ là một tùy chọn khác cho tất cả những người yêu thích IE8 và nó hoạt động hoàn hảo trong các trình duyệt mới hơn. Bạn chỉ có thể tô màu văn bản cho phù hợp với nền của đầu vào. Nếu bạn có một trường duy nhất, điều này sẽ thay đổi màu thành màu đen khi bạn nhấp / tập trung vào trường. Tôi sẽ không sử dụng điều này trên một trang web công cộng vì nó sẽ 'gây nhầm lẫn' cho hầu hết mọi người, nhưng tôi đang sử dụng nó trong phần ADMIN nơi chỉ có một người có quyền truy cập vào mật khẩu của người dùng.

$('#MyPass').click(function() {
    $(this).css('color', '#000000');
});

-HOẶC LÀ-

$('#MyPass').focus(function() {
    $(this).css('color', '#000000');
});

Điều này, cũng cần thiết, sẽ thay đổi văn bản trở lại màu trắng khi bạn rời khỏi trường. Đơn giản, đơn giản, đơn giản.

$("#MyPass").blur(function() {
    $(this).css('color', '#ffffff');
});

[Tùy chọn khác] Bây giờ, nếu bạn có một số trường mà bạn đang kiểm tra, tất cả đều có cùng một ID, như tôi đang sử dụng, hãy thêm một lớp 'vượt qua' vào các trường bạn muốn ẩn văn bản. trường mật khẩu gõ vào 'văn bản'. Theo cách này, chỉ các trường có lớp 'vượt qua' sẽ được thay đổi.

<input type="text" class="pass" id="inp_2" value="snoogle"/>

$('[id^=inp_]').click(function() {
    if ($(this).hasClass("pass")) {
        $(this).css('color', '#000000');
    }
    // rest of code
});

Đây là phần thứ hai của điều này. Điều này thay đổi văn bản trở lại màu trắng sau khi bạn rời khỏi trường.

$("[id^=inp_]").blur(function() {
    if ($(this).hasClass("pass")) {
        $(this).css('color', '#ffffff');
    }
    // rest of code
});

0

Tôi chỉ làm như sau để thay đổi loại đầu vào:

$('#ID_of_element')[0].type = 'text';

Và nó hoạt động.

Tôi cần phải làm điều này bởi vì tôi đang sử dụng bộ tạo ngày của UI UI trong dự án ASP NET Core 3.1 và chúng không hoạt động chính xác trên các trình duyệt dựa trên Chromium (xem: https://stackoverflow.com/a/61296225/7420301 ).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.