2009-02-12 13 views

risposta

58

Con jQuery 1.4 è possibile modificare il tipo di un input mentre è staccato.

marker = $('<span />').insertBefore('#myInput'); 
$('#myInput').detach().attr('type', 'text').insertAfter(marker); 
marker.remove(); 
+5

Questo funziona a meraviglia. Non sapevo di detach(), bello. – philoye

+1

Devi essere d'accordo con @MildFuzz qui: questa è una soluzione fantastica! –

+0

Qualcuno ha cura di modificare e spiegare cosa fa in realtà? (Ho iniziato qui http://api.jquery.com/detach) – matrixugly

12

Non sono sicuro che sia possibile, quindi suggerirei di usare un div nascosto per contenere l'elemento di input, che può essere mostrato secondo necessità. Il campo di inserimento del testo può ancora contenere dati anche se è nascosto.

+1

Questo è un buon punto per motivi di accessibilità. Non si dovrebbe utilizzare un input nascosto ad eccezione dei campi secondari che non sono destinati all'input dell'utente. –

+0

Ha senso trasformare un input di testo in un input nascosto quando il valore è noto in anticipo. Nel mio caso, dovrebbe essere un campo di testo quando voglio che il visitatore inserisca il proprio valore OpenID, ma voglio che il tipo cambi in un campo nascosto quando il visitatore seleziona un fornitore di autenticazione Google, Yahoo o Facebook, perché questi URL sono predeterminati e non dovrebbero essere modificati dal visitatore. Ci sono momenti in cui puoi volere un'etichetta nascosta o div per contenere i dati, ma non penso che questo sia uno di questi. – TARKUS

8

IE non consente di modificare il tipo di un elemento del modulo per motivi di sicurezza, quindi andrei con il suggerimento nascosto di Aram div.

+3

Mentre questo è per lo più vero, Ian Mackinnon ha pubblicato una soluzione sotto quella che ha funzionato per me. A partire da jQuery 1.4, è possibile modificare il tipo di input _if_ è staccato. – kingjeffrey

8

Ecco come farei questo:

$("input[type='hidden']").each(function(){ 
    var name = $(this).attr('name'); // grab name of original 
    var value = $(this).attr('value'); // grab value of original 
    /* create new visible input */ 
    var html = '<input type="text" name="'+name+'" value="'+value+'" />'; 
    $(this).after(html).remove(); // add new, then remove original input 
}); 

Se si desidera filtrare alcuni degli elementi chiamano filtro() prima di ogni(), in questo modo:

$("input[type='hidden']").filter("[name='whatever']").each(function... 
2

facile l'uomo .. .

$('input[type="hidden"]').each (function() { this.type = 'text'; });   

trigger su un evento

+1

Hai provato questo? –

+1

Sì, questo funziona come un fascino :) – Bunkerbuster

0
Overlay.toAnyType = function (c, type) { 

    var shadow = jQuery(document.createElement(c.context.nodeName)); 

    // Clone attributes to new object. 
    for (var i = 0; i < c[0].attributes.length; i++) { 
     var attr = c[0].attributes[i].name; 
     var val = c[0].attributes[i].value; 

     if (attr == "type") val = type; 
     shadow.attr(attr, val); 
    } 


    shadow.insertAfter(c); 
    c.remove(); 
}; 

Quando c è un oggetto jQuery; la funzione sopra cambia l'attributo type. Uso:

var inputElemt = jQuery("#input"); 
Overlay.toAnyType(inputElemt, "text"); 
0

thread vecchio, ma di recente ho bisogno di fare qualcosa di simile, ma con campi di file e la loro liquidazione ... Penso che la stessa soluzione potrebbe essere applicata, ma almeno si può afferrare il contenuto, in questo caso.

var temp = $('#hidden-field').val(); 
$("#container-for-field").html("<input id='not-hidden' type='text' value='"+temp+"'/>"); 

Questo dovrebbe anche risolvere il problema :).

Problemi correlati