39

Trying to change input type attribute from password to text.

$('.form').find('input:password').attr({type:"text"});

Why this doesn't work?

4
  • 1
    Fyi, you can use .attr('attrname', 'newvalue') to set a single attribute. Commented Jun 8, 2012 at 14:12
  • 2
    Duplicate of stackoverflow.com/questions/1544317/… Commented Nov 9, 2012 at 19:49
  • 3
    @thisgeek I'm genuinely impressed that you posted a duplicate link for a question more than two years old with a question from three years ago. Commented Mar 15, 2013 at 13:50
  • It does work now. Commented Apr 15, 2017 at 0:36

10 Answers 10

58

my solution:

    $('#myinput').clone().attr('type','tel').insertAfter('#myinput').prev().remove();
Sign up to request clarification or add additional context in comments.

5 Comments

very elegant and simple :)
Nice solution, although as per the accepted answer, problematic if you have events attached to the original input, which are removed too...
How does .attr() work on the cloned element but not on the element itself?
Because the cloned element is not injected to the DOM yet, while the element itself is already in the DOM.
I think this should be the chosen answer!
54

You can't do this with jQuery, it explicitly forbids it because IE doesn't support it (check your console you'll see an error.

You have to remove the input and create a new one if that's what you're after, for example:

$('.form').find('input:password').each(function() {
   $("<input type='text' />").attr({ name: this.name, value: this.value }).insertBefore(this);
}).remove();

You can give it a try here

To be clear on the restriction, jQuery will not allow changing type on a <button> or <input> so the behavior is cross-browser consistent (since IE doens't allow it, they decided it's disallowed everywhere). When trying you'll get this error in the console:

Error: type property can't be changed

9 Comments

@Andy - Doesn't it get confusing with your body here and your head on meta? :)
@Nick, I'm too scared to edit your code, but I'm thinking you've got a typo: .inserBefore(this)
@ricebowl - You can edit away whenever you see an error, or post a more correct answer :) I appreciate the comment, fixed!
It's 2016 and jQuery allows to change attributes now.
$(element).attr('type', 'text');
|
22

USE prop instead attr

$('.form').find('input:password').prop({type:"text"});

Comments

10

I know I'm a little late to the game, but I was just able to do this in IE9 (it appears that Microsoft decided to allow it?). However, I had to do it with straight JavaScript. This is just a sample of a form with a dropdownlist that changes the field type depending on what is selected in the dropdown.

function switchSearchFieldType(toPassword) {
    $('#SearchFieldText').val('');
    if (toPassword === true) {
        $('#SearchFieldText').get(0).setAttribute('type', 'password');
    } else {
        $('#SearchFieldText').get(0).setAttribute('type', 'text');
    }
}

$('#SelectedDropDownValue').change(function () {
    if ($("select option:selected").val() === 'password') {
        switchSearchFieldType(true);
    }
    else {
        switchSearchFieldType(false);
    }
}).change();

1 Comment

I like this solution because not destroying the original inputs leaves any attached events intact...
9

It's 2018 and jQuery does support this feature now. The following will work:

$('.form').find('input:password').attr("type","text");

Comments

7

This should work easily.

$("selector").attr('type', 'hidden'); 
//Changing it to hidden

Comments

0
    //Get current input object
    var oldInput = $('foo');
    //Clone a new input object from it
    var newInput = oldInput.clone();
    //Set the new object's type property
    newInput.prop('type','text');
    //Replace the old input object with the new one.
    oldInput.replaceWith(newInput);

Comments

-1

Here are two functions, accepting an array of selector(s) as a parameter that will accomplish this:

  // Turn input into Number keyboard
  function inputNumber(numArr) {
    if (numArr instanceof Array) {
      for (var i = 0; i < numArr.length; i++) {
        if ($(numArr[i]).length > 0) {
          var copy = $(numArr[i]);
          var numEle = copy.clone();
          numEle.attr("type", "number");
          numEle.insertBefore(copy);
          copy.remove();
        }
      }
    }
  }
  // Turn input into Email keyboard 
  function inputEmail(emailArr) {
    if (emailArr instanceof Array) {
      for (var i = 0; i < emailArr.length; i++) {
        if ($(emailArr[i]).length > 0) {            
          var copy = $(emailArr[i]);
          var numEle = copy.clone();
          numEle.attr("type", "number");
          numEle.insertBefore(copy);
          copy.remove();
        }
      }
    }
  }

You can then use this like:

  var numberArr = ["#some-input-id", "#another-input-id"];
  var emailArr = ["#some-input-id", "#another-input-id"];

  inputNumber(numberArr);
  inputEmail(emailArr);

Comments

-1
function passShowHide(){
  if( $("#YourCheckBoxID").prop('checked') ){
    document.getElementById("EnterPass").attributes["type"].value = "text";
  }
  else{
    document.getElementById("EnterPass").attributes["type"].value="password";}

1 Comment

This doesn't actually answer the question. The question is how to change the type, and this code changes the value, and it even does that poorly. This might be a suitable answer for an entirely different question, but not for this question.
-1

This is pretty easy thou. This works pretty fine.

 $('#btn_showHide').on('click', function() {
    if($(this).text() == 'Show')
    {
      $(this).text('Hide');
      $('#code').attr('type', 'text');
    }
    else
    {
      $(this).text('Show');
      $('#code').attr('type', 'password');
    }
  });

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.