2010-08-22 20 views
28

Provare a modificare l'attributo input da password a text.jQuery change input type

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

Perché questo non funziona?

+1

Fyi, è possibile utilizzare '.attr ('attrname', 'newvalue')' per impostare un singolo attributo. – ThiefMaster

+2

Duplicato di http://stackoverflow.com/questions/1544317/jquery-change-type-of-input-field – thisgeek

+3

@thisgeek Sono sinceramente colpito dal fatto che tu abbia postato un link duplicato per una domanda di più di due anni con un domanda di tre anni fa. – MiniRagnarok

risposta

47

Non si può fare questo con jQuery, it explicitly forbids it perché IE non lo supporta (controllare la console verrà visualizzato un errore.

È necessario rimuovere l'ingresso e crearne uno nuovo se è quello che che stai dopo, per esempio:

$('.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

per essere chiari, sulla restrizione, jQuery non consentirà la modifica type su un <button> o <input> così esimo Il comportamento è coerente con il browser (poiché IE non lo consente, ha deciso che non è consentito in tutto il mondo). Quando si cerca si otterrà questo errore nella console:

Error: type property can't be changed

+21

dannazione, adorabile IE – James

+0

bah, bastonatemi :-) –

+1

@Andy - Non ti confonda con il tuo corpo qui e la tua testa su meta? :) –

45

la mia soluzione:

$('#myinput').clone().attr('type','tel').insertAfter('#myinput').prev().remove(); 
+3

molto elegante e semplice :) –

+4

Bella soluzione, anche se secondo la risposta accettata, problematica se si hanno eventi collegati all'ingresso originale, che vengono rimossi anche ... – terraling

+0

Come funziona '.attr()' sull'elemento clonato ma non sull'elemento stesso? –

10

So di essere un po 'tardi per il gioco, ma ero solo in grado di fare questo in IE9 (sembra che Microsoft abbia deciso di permetterlo?). Tuttavia, ho dovuto farlo con JavaScript dritto. Questo è solo un esempio di un modulo con un elenco a discesa che cambia il tipo di campo in base a ciò che è selezionato nel menu a discesa.

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(); 
+0

Mi piace questa soluzione perché non distruggere gli input originali lascia intatti tutti gli eventi collegati ... – terraling

0

Qui sono due funzioni, che accetta un array di selettore (s) come parametro che compirà questo:

// 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(); 
     } 
     } 
    } 
    } 

È possibile quindi utilizzare questo tipo:

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

    inputNumber(numberArr); 
    inputEmail(emailArr); 
5

Questo dovrebbe funzionare facilmente

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

USO prop invece attr

$('.form').find('input:password').prop({type:"text"}); 
0
function passShowHide(){ 
    if($("#YourCheckBoxID").prop('checked')){ 
    document.getElementById("EnterPass").attributes["type"].value = "text"; 
    } 
    else{ 
    document.getElementById("EnterPass").attributes["type"].value="password";} 
+0

Questo in realtà non risponde alla domanda. La domanda è come cambiare il ** tipo **, e questo codice cambia il ** valore **, e lo fa anche male. Questa * potrebbe * essere una risposta adatta per una domanda completamente diversa, ma non per questa domanda. –

0

Questo è abbastanza facile tu. Funziona abbastanza bene.

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