Foros del Web » Programando para Internet » Javascript »

Donde encuentro un tutorial para esto:

Estas en el tema de Donde encuentro un tutorial para esto: en el foro de Javascript en Foros del Web. Hola, Tengo que crear un script que permita editar textos "inplace" con javascript. El texto que se se debe editar esta entre p-tags. La funcionalidad ...
  #1 (permalink)  
Antiguo 17/11/2010, 07:46
 
Fecha de Ingreso: noviembre-2002
Ubicación: Suecia
Mensajes: 253
Antigüedad: 22 años
Puntos: 2
Donde encuentro un tutorial para esto:

Hola,

Tengo que crear un script que permita editar textos "inplace" con javascript.

El texto que se se debe editar esta entre p-tags. La funcionalidad es que el usuario haga click sobre el texto, al hacer click el texto desparece y en su lugar aparece un textarea con el texto que contenia el p-tag y que se puede editar, tambien debe haber un boton para ejecutar los cambios y otro para canelar. Al presionar el boton ejecutar el textarea desaparece y en su lugar vuelve el p-tag con el texto actualizado y si se clickea en cancelar aparece el p-tag con el texto original.

Me gustaria saber si conocen algun tuorial en donde muestren como se hace esto utilizando solamente DOM y sin innerHTML.

El html es asi:

Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
>

<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<
head>
    <
meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

    <
title>index</title>
    
</
head>

<
body>
<
div id="content">
    <
h1>Los siguientes parrafos se pueden editar</h1>
    <
class="editable">Texto editable</p>
    <
class="editable">Texto editable</p>
    
    <
h2>Los siguientes parrafos no se pueden editar</h2>
    <
class="not_editable">Texto no editable</p>
</
div>
</
body>
</
html
Gracias por la ayuda!!!
  #2 (permalink)  
Antiguo 17/11/2010, 08:20
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Donde encuentro un tutorial para esto:

para crear un elemento has de usar el metédo createElement, junto con los atributos que correspondan, y appendChild. para eliminar ese elemento usa removeChild.
supongo que tu pretensión es guardar ese nuevo texto en la bd. si este es el caso, puedes usar ajax junto con lo mencionado anteriormente
  #3 (permalink)  
Antiguo 17/11/2010, 08:33
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 5 meses
Puntos: 310
Respuesta: Donde encuentro un tutorial para esto:

Yo creo que es demasiado complicado si es que se puede llegar a hacer, porque aparte de modificar el texto también podrían modificar los atributos del p, ¿no? Entonces tendrías que ir buscando qué atributos le han puesto, y si dentro del p se pueden poner otros elementos como span o a, etc.
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #4 (permalink)  
Antiguo 17/11/2010, 09:13
 
Fecha de Ingreso: noviembre-2002
Ubicación: Suecia
Mensajes: 253
Antigüedad: 22 años
Puntos: 2
Respuesta: Donde encuentro un tutorial para esto:

Los atributos del p-tag no se necesitan cambiar, de hecho no tiene ninguno.
Y no hay serverside implementacion, es un html plano.
Lo que he logrado hasta ahora es guardar el texto en una variable y crear el nuevo elemento con el texto original. El problema es que el nuevo elemento ('textarea') se crea debajo del p-tag y si hago click en el texto del textarea se crea un nuevo textarea debajo del anterior. Lo ideal es que el p-tag sea reemplazado por el textarea mientras se edita el texto y luego vuelva a la normalidad cuando se haya terminado de editar, es decir que vuelva a ser p-tag.

Esta es la funcion que he excrito hasta ahora.

Código Javascript:
Ver original
  1. window.onload = function  () {
  2.     var pElements = document.getElementsByTagName('*');
  3.     for (var i=0; i < pElements.length; i++) {
  4.         if(pElements[i].className == 'editable')
  5.             inPlaceEditor(pElements[i]);
  6.     };
  7. };
  8.  
  9. function inPlaceEditor (editableElement) {
  10.         editableElement.onclick = function() {
  11.             var text = editableElement.firstChild.nodeValue;
  12.             var textarea = document.createElement('textarea');
  13.             var nyText = document.createTextNode(text);
  14.             textarea.appendChild(nyText);
  15.             var nyElement = editableElement.appendChild(textarea);
  16.             return false;
  17.         };
  18.     };
  #5 (permalink)  
Antiguo 17/11/2010, 09:15
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 5 meses
Puntos: 310
Respuesta: Donde encuentro un tutorial para esto:

Porque no estás quitando el p del documento, accede al padre del p y bórralo desde ahí, luego en el onblur del textarea pones que se convierta otra vez en p.
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #6 (permalink)  
Antiguo 17/11/2010, 10:00
 
Fecha de Ingreso: noviembre-2002
Ubicación: Suecia
Mensajes: 253
Antigüedad: 22 años
Puntos: 2
Respuesta: Donde encuentro un tutorial para esto:

Mmmm....

He hecho un cambio:

Código Javascript:
Ver original
  1. function inPlaceEditor (editableElement) {
  2.         editableElement.onclick = function() {
  3.             var text = editableElement.firstChild.nodeValue;
  4.             var textarea = document.createElement('textarea');
  5.             var nyText = document.createTextNode(text);
  6.             editableElement.parentNode.removeChild(editableElement);
  7.            
  8.             var parent = document.getElementById("content");
  9.            
  10.             parent.appendChild(textarea);
  11.            
  12.             return false;
  13.         };
  14.     };

Lo que ahora sucede es que el p-tag desaparece y se crea el textarea, el problema es que el textarea se crea al final de la pagina en vez del mismo lugar donde estaba el p-tag y ademas no obtengo el texto que estaba en el p-tag.
  #7 (permalink)  
Antiguo 17/11/2010, 10:13
 
Fecha de Ingreso: noviembre-2002
Ubicación: Suecia
Mensajes: 253
Antigüedad: 22 años
Puntos: 2
Respuesta: Donde encuentro un tutorial para esto:

Ahora funciona casi como quiero:

Código Javascript:
Ver original
  1. function inPlaceEditor (editableElement) {
  2.         editableElement.onclick = function() {
  3.             var text = editableElement.firstChild.nodeValue;
  4.             var textarea = document.createElement('textarea');
  5.             var nyText = document.createTextNode(text);
  6.             textarea.appendChild(nyText);
  7.             editableElement.parentNode.replaceChild(textarea, editableElement);
  8.            
  9.             return false;
  10.         };
  11.     };

El p-tag es reemplazado por el textarea y con el texto. Ahora es como agregar los botones editar y cancelar.
  #8 (permalink)  
Antiguo 17/11/2010, 11:43
 
Fecha de Ingreso: septiembre-2004
Ubicación: La Plata Argentina
Mensajes: 128
Antigüedad: 20 años, 2 meses
Puntos: 9
Respuesta: Donde encuentro un tutorial para esto:

No te convendria hacerlo en una DIV flotante tipo tooltip?

Saludos
  #9 (permalink)  
Antiguo 17/11/2010, 15:07
 
Fecha de Ingreso: noviembre-2002
Ubicación: Suecia
Mensajes: 253
Antigüedad: 22 años
Puntos: 2
Respuesta: Donde encuentro un tutorial para esto:

Bueno he agregado los botones y he creado una funcion para cancelar los cambios, pero...
al hacer click en el boton cancelar obtengo este error:

textarea.parentNode no esta definido

Que esta mal?:

Código Javascript:
Ver original
  1. function inPlaceEditor (editableElement) {
  2.         editableElement.onclick = function() {
  3.             //Getting the text from the p-element
  4.             var text = editableElement.firstChild.nodeValue;
  5.            
  6.             // create and style the textarea element
  7.             var textarea = document.createElement('textarea');
  8.                 textarea.setAttribute('cols', config.cols);
  9.                 textarea.setAttribute('rows', config.rows);
  10.                 textarea.style.width = "100%";
  11.            
  12.             // Create the text for the textarea (the same text saved from p-elemnt)
  13.             var nyText = document.createTextNode(text);
  14.            
  15.             // Put all together
  16.             textarea.appendChild(nyText);
  17.            
  18.             //Replace the p-element with the newly created textarea
  19.             editableElement.parentNode.replaceChild(textarea, editableElement);
  20.            
  21.             //Creating and styling the buttons
  22.             var editbutton = document.createElement('input');
  23.                 editbutton.setAttribute('type', 'button');
  24.                 editbutton.setAttribute('value', config.okButtonText);
  25.                 editbutton.setAttribute('onclick', 'edit();');
  26.            
  27.             var cancelbutton = document.createElement('input');
  28.                 cancelbutton.setAttribute('type', 'button');
  29.                 cancelbutton.setAttribute('value', config.cancelButtonText);
  30.                 cancelbutton.setAttribute('onClick', 'cancel();');
  31.            
  32.             //Setting the buttons on the page
  33.             textarea.parentNode.insertBefore(cancelbutton, textarea.nextSibling);
  34.             textarea.parentNode.insertBefore(editbutton, textarea.nextSibling);
  35.            
  36.         };
  37.     };
  38.    
  39.     function cancel(){
  40.         var textarea = document.getElementsByTagName('textarea');
  41.         var text = textarea.value;
  42.         var pElement = document.createElement('p');
  43.             pElement.setAttribute('class', 'editable');
  44.         var original = document.createTextNode(text);
  45.         pElement.appendChild(original);
  46.        
  47.         textarea.parentNode.replaceChild(pElement, textarea);
  48.     };
  #10 (permalink)  
Antiguo 17/11/2010, 15:26
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 5 meses
Puntos: 310
Respuesta: Donde encuentro un tutorial para esto:

La función que usas para coger el textarea es getElementsByTagName(), por tanto la función no sabe a cuál de los textarea acceder, aunque sea sólo uno. Solución, añadir un indice.
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #11 (permalink)  
Antiguo 17/11/2010, 17:01
 
Fecha de Ingreso: noviembre-2002
Ubicación: Suecia
Mensajes: 253
Antigüedad: 22 años
Puntos: 2
Respuesta: Donde encuentro un tutorial para esto:

ok, gracias
he agregado el indice y funciona ahora.
Una cosa que no me habia fijado es que cuando el html carga en el navegador y hago click en el primer parrafo puedo editar el texto y mostrarlo luego entre las p-tag pero si hago click nuevamente en el mismo parrafo no sucede absolutamente nada. El segundo parrafo en cambio se puede editar.
Segun lo que veo al parecer cuando se ha editado o cancelado la edicion de un parrafo la funcion termina y el parrafo ya no se puede volver a editar.

Como se puede volver a activar la funcion cuando se ha editado un parrafo?

Pdta: la ultima funcion se llama edit()

Si hago un simple esquema el javascript se veria asi:

Código PHP:
Ver original
  1. windows.onload function {
  2. .
  3. .
  4. .
  5. };
  6.  
  7. function inPlaceEditor (editableElement) {
  8.   editableElement.onclick = function() {
  9.    .
  10.    .
  11.    .
  12.   };
  13. };
  14.  
  15. function edit(){
  16. .
  17. .
  18. .
  19. }
  #12 (permalink)  
Antiguo 17/11/2010, 17:20
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 5 meses
Puntos: 310
Respuesta: Donde encuentro un tutorial para esto:

Simple, cuando vuelvas a crear el p, asígnale la función edit() en el onclick.
Saludos :D
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #13 (permalink)  
Antiguo 18/11/2010, 05:13
 
Fecha de Ingreso: noviembre-2002
Ubicación: Suecia
Mensajes: 253
Antigüedad: 22 años
Puntos: 2
Respuesta: Donde encuentro un tutorial para esto:

mmm.... como hago eso?
no se me aclara la mente...
  #14 (permalink)  
Antiguo 18/11/2010, 08:24
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 14 años, 5 meses
Puntos: 310
Respuesta: Donde encuentro un tutorial para esto:

Por ejemplo
Código Javascript:
Ver original
  1. var p = document.createElement('p');
  2. // ...
  3. p.onclick=edit;
Saludos (:
__________________
" Getting older’s not been on my plans
but it’s never late, it’s never late enough for me to stay. "
Cigarettes - Russian Red
  #15 (permalink)  
Antiguo 18/11/2010, 08:56
 
Fecha de Ingreso: noviembre-2002
Ubicación: Suecia
Mensajes: 253
Antigüedad: 22 años
Puntos: 2
Respuesta: Donde encuentro un tutorial para esto:

Gracias gracias.
Ahora funciona.

Lo ultimo que me queda es el boton cancelar que deberia reponer el texto original en el p-tag.

Voy a probar hacerlo, se supone que deberia ser mas facil.
  #16 (permalink)  
Antiguo 18/11/2010, 14:01
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Donde encuentro un tutorial para esto:

no suelo hacer esto. pero como veo que has trabajado, esta es mi propuesta para solventar todos los problemas que explicabas en post anteriores
Cita:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<title>index</title>


<script type="text/javascript">
window.onload = function() {
var pElements = document.getElementsByTagName('p');
for (var i=0; i < pElements.length; i++) {
if(pElements[i].className == 'editable')
pElements[i].onclick = function() {inPlaceEditor(this);};
};
};


function inPlaceEditor (editableElement) {

//Getting the text from the p-element
var text = editableElement.innerHTML;

var padre = document.createElement('p');

// create and style the textarea element
var textarea = document.createElement('textarea');
textarea.setAttribute('cols', '10');
textarea.setAttribute('rows', '5');
textarea.style.width = "100%";

// Create the text for the textarea (the same text saved from p-elemnt)
var nyText = document.createTextNode(text);

// Put all together
textarea.appendChild(nyText);

padre.appendChild(textarea);

editableElement.parentNode.replaceChild(padre, editableElement);

//Creating and styling the buttons
var editbutton = document.createElement('input');
editbutton.setAttribute('type', 'button');
editbutton.setAttribute('value', 'Editar');
editbutton.onclick = function() {edit(this.parentNode, this.parentNode.firstChild.value);};

var cancelbutton = document.createElement('input');
cancelbutton.setAttribute('type', 'button');
cancelbutton.setAttribute('value', 'Cancelar');
cancelbutton.onclick = function() {cancel(this.parentNode, text);};



//Setting the buttons on the page
textarea.parentNode.insertBefore(cancelbutton, textarea.nextSibling);
textarea.parentNode.insertBefore(editbutton, textarea.nextSibling);
};



function cancel(parrafo, texto){
var pElement = document.createElement('p');
pElement.setAttribute('class', 'editable');
pElement.onclick= function() {inPlaceEditor(this);};
var original = document.createTextNode(texto);
pElement.appendChild(original);

parrafo.parentNode.replaceChild(pElement, parrafo);
};




function edit(parrafo, texto){
var pElement = document.createElement('p');
pElement.setAttribute('class', 'editable');
pElement.onclick= function() {inPlaceEditor(this);};
var original = document.createTextNode(texto);
pElement.appendChild(original);

parrafo.parentNode.replaceChild(pElement, parrafo);
};
</script>


</head>

<body>
<div id="content">
<h1>Los siguientes parrafos se pueden editar</h1>
<p class="editable">Texto editable</p>
<p class="editable">Texto editable</p>

<h2>Los siguientes parrafos no se pueden editar</h2>
<p class="not_editable">Texto no editable</p>
</div>
</body>
</html>
como puedes ver hay algunas modificaciones. una de ellas es para no tener que usar indices. para ello lo que he hecho, ha sido insertar todo en un <p> de esa manera el textarea y los botones son hijos de ese <p> y tener acceso al cualquiera de ellos sin necesidad de indices
  #17 (permalink)  
Antiguo 19/11/2010, 15:08
 
Fecha de Ingreso: noviembre-2002
Ubicación: Suecia
Mensajes: 253
Antigüedad: 22 años
Puntos: 2
Respuesta: Donde encuentro un tutorial para esto:

Gracias IsaBelM y _cronos2, han sido de una ayuda increible.

Yo tenia el script casi listo, solamente tenia un problema que se producia cuando habian dos textareas abiertas al mismo tiempo. Si el usuario editaba la segunda y hacia click en guardar o cancelar era la primera textarea la que respondia al evento.

Yo he comenzado a estudiar javascript a distancia esta hace algunos dias y este era uno de los ejercicios que tengo que realizar. Me recomendaron un libro llamado "DOM scripting" de hecho es el libro que se utiliza en el curso, pero he encontrado mas informacion en el internet y con ustedes que en el libro y es por eso que les agradezco el tiempo que han dedicado a ayudarme.

Ahora leere detenidamente el codigo para entender de la mejor forma como utiliza el DOM para realizar el trabajo. Lo necesito entender ya que el proximo paso en el curso es Ajax con Json y sin bases claras de DOM no llegare muy lejos.

Un abrazo....

Si necesitan ayuda con xhtml, css me envian un mensaje:


Gracias!!!

Etiquetas: encuentro, tutoriales
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:16.