39

Trying to change input type attribute from password to text.

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

Why this doesn't work?

Evan
  • 2,330
  • 1
  • 16
  • 33
James
  • 35,491
  • 52
  • 126
  • 159

10 Answers10

57

my solution:

    $('#myinput').clone().attr('type','tel').insertAfter('#myinput').prev().remove();
Alon
  • 849
  • 10
  • 15
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

Nick Craver
  • 594,859
  • 130
  • 1,270
  • 1,139
  • 1
    @Andy - Doesn't it get confusing with your body here and your head on meta? :) – Nick Craver Aug 22 '10 at 12:48
  • 3
    @Nick, I'm too scared to edit your code, but I'm thinking you've got a typo: `.inserBefore(this)` – David says reinstate Monica Aug 22 '10 at 12:48
  • 1
    @ricebowl - You can edit away whenever you see an error, or post a more correct answer :) I appreciate the comment, fixed! – Nick Craver Aug 22 '10 at 12:49
  • @Nick, yes :) it's especially difficult reading questions without a head. Fortunately, there's always the jQuery braille plugin ;) – Andy E Aug 22 '10 at 12:52
  • Oh, I wasn't scared of *you*, I was scared that you might know of an arcane, and mystical, jQuery function of which I was unaware and knew not the power of. I just didn't want to embarrass myself by wrongly stating that `inserBefore` didn't exist... =) – David says reinstate Monica Aug 22 '10 at 12:53
  • @WorkingHard - You're right the document fragment creation doesn't work there, seems it should...I'll file a bug with jQuery core later today, for now change it to use `.attr()` like the updated answer, I added a working demo here: http://jsfiddle.net/nick_craver/dHzzN/ – Nick Craver Aug 22 '10 at 13:17
  • A bit unfortunate that jQuery decided to block this ability for all browsers just because IE doesn't support it. – scunliffe Aug 22 '10 at 14:28
  • 14
    It's 2016 and jQuery allows to change attributes now. – Kevin Apr 18 '16 at 14:32
  • 1
    $(element).attr('type', 'text'); – Dhanuka777 Jun 07 '17 at 01:41
20

USE prop instead attr

$('.form').find('input:password').prop({type:"text"});
venkat7668
  • 2,309
  • 1
  • 19
  • 23
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();
JasCav
  • 33,714
  • 19
  • 103
  • 163
7

This should work easily.

$("selector").attr('type', 'hidden'); 
//Changing it to hidden
prog_24
  • 705
  • 1
  • 12
  • 22
7

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

$('.form').find('input:password').attr("type","text");
Roshana Pitigala
  • 7,058
  • 8
  • 38
  • 66
Callat
  • 2,420
  • 4
  • 23
  • 42
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);
-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);
Pat
  • 294
  • 2
  • 5
  • 11
-1
function passShowHide(){
  if( $("#YourCheckBoxID").prop('checked') ){
    document.getElementById("EnterPass").attributes["type"].value = "text";
  }
  else{
    document.getElementById("EnterPass").attributes["type"].value="password";}
Viktor
  • 1
  • 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. – Michael Gaskill Jun 26 '16 at 17:52
-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');
    }
  });
Haze Erasmo
  • 165
  • 7