2010-06-29 13 views
7

Estoy tratando de reemplazar las entradas con tramos que contienen los valores de entrada de tal manera que pueda volver a hacerlas al hacer clic en un botón. Me imagino que esto se haría más fácilmente en dos etapas: agregar <span>[input value]</span> en frente de las entradas, y luego ocultar las entradas. El único problema es que estoy teniendo problemas con la primera parte. Estoy intentando cosas comojquery: reemplace las entradas con tramos

$('#container').find('input') 
    .parent() 
    .prepend('<span></span>') // this effectively creates: <span></span><input value=____> 

Sin embargo, dentro de la instrucción anteponer $ (this) parece que no está definido, por lo que no puedo hacer

.prepend('<span>'+$(this).children('input').val()+'</span>') 

Puesto que hay varias entradas, no puedo Simplemente ponga el valor de entrada en una variable. ¿Cómo haría esto?

+0

El $ (esto) no está dentro del antepuesto - está en el mismo alcance que $ ('# contenedor') es. Se evalúa antes de enviarse a prepend() – partkyle

Respuesta

24

Para la pregunta actualización:

Puede hacer algo como esto (basando esto en los comentarios, una edición por fila):

$('input', context).each(function() { 
    $("<span />", { text: this.value, "class":"view" }).insertAfter(this); 
    $(this).hide(); 
}); 

You can view a more detailed demo here, with per-row edit toggling.


Para la pregunta original:

usted querrá utilizar para este .replaceWith():

$('#container').find('input').each(function() { 
    $(this).replaceWith("<span>" + this.value + "</span>"); 
}); 

El .each() crea un cierre en el que this se refiere al elemento de entrada, por lo que puede use this.value por ejemplo.

Para asegurarse de que la codificación es atendido, ampliar un poco para utilizar .text(), así:

$('#container').find('input').each(function() { 
    $(this).replaceWith($("<span />").text(this.value)); 
});​ 

You can try a demo here

+0

Gracias, funcionó muy bien. Sin embargo, en realidad -remplazó- las entradas. Me gustaría poder recuperarlos con solo presionar un botón, de ahí mi idea de esconderlos. Perdón por la confusión, mi pregunta se actualiza – Mala

+1

@Nick: +1: Esas demostraciones son siempre útiles, se ponen muchos esfuerzos, simplemente gran hombre :) – Sarfraz

+0

Excelente esfuerzo, pero no aborda las preocupaciones del OP. 'replaceWith' literalmente elimina elementos del DOM, y el OP necesita alternar. –

1

me parece la solución más fácil sería cambiar las entradas de solo lectura y quite el borde (y posiblemente cambie el color de fondo, dependiendo de su UI), lo que esencialmente hace que aparezcan como una etiqueta normal <span>.

function spanify() { 
    $('#container input') 
    .attr("readonly", "readonly") 
    .css("borderWidth", "0"); 
} 

function despanify() { 
    $('#container input') 
    .removeAttr("readonly") 
    .css("borderWidth", "auto"); 
} 

¿Es eso posible?

+0

+1 buena idea, pero no, para mi propósito particular esto no es suficiente. – Mala

+0

@Mala Sí, era una posibilidad remota. Esto ciertamente no es lo suficientemente bueno si tiene algo más que los cuadros de texto regulares. –

Cuestiones relacionadas