Foros del Web » Programando para Internet » Jquery »

Ocultar texto "leer mas...".

Estas en el tema de Ocultar texto "leer mas...". en el foro de Jquery en Foros del Web. Muy buenas a todos... Necesito que me echéis una mano por favor, haber si consigo explicarme... Estoy preparando una web con artículos de historia. La ...
  #1 (permalink)  
Antiguo 08/10/2014, 15:57
 
Fecha de Ingreso: septiembre-2014
Ubicación: Madrid - España
Mensajes: 15
Antigüedad: 9 años, 8 meses
Puntos: 0
Ocultar texto "leer mas...".

Muy buenas a todos...

Necesito que me echéis una mano por favor, haber si consigo explicarme...

Estoy preparando una web con artículos de historia.

La idea es que cada articulo, de inicio, no se visualice al completo.

Si el usuario quiere extender la lectura pinchara sobre el <h5 class="leermas">Leer mas..</h5> y se visualizara el articulo al completo.

Los párrafos que aparecerán ocultos al cargar la pagina llevaran la class="oculto" y en jquery con slideUp.

Y cuando los párrafos se visualicen, con slideDown, quiero que se oculte el texto Leer mas..., pero solo el del articulo seleccionado y no todos como me sucede ahora.

Espero haber explicado bien.
Aqui os dejo parte del código.

Muchas gracias de antemano.

Saludos

Jquery:

$('.oculto').slideUp();
$('.leermas').click(function(){
$(this).next('.oculto').slideDown('slow',function( ){
$('.leermas').hide(function(){
$(this).hide();
});
});
});

HTML:
<p>...</p>
<p>...</p>
<h5 class="leermas">Continua leyendo >></h5>
<p class="oculto">.....</p>

<p>...</p>
<h5 class="leermas">Continua leyendo >></h5>
<p class="oculto">.....</p>
  #2 (permalink)  
Antiguo 08/10/2014, 16:59
 
Fecha de Ingreso: octubre-2010
Mensajes: 88
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: Ocultar texto "leer mas...".

Hola, que tal!
Yo lo tengo implementado de la siguiente forma, igual te puede dar una idea:
Para cargar las noticias, articulos, etc en la pag, realizo una petición ajax
y en el success cargo todos los datos y posteriormente gestiono los datos
de la visibilidad llamando a la funcion gestionaNoticias.

$('#todasNot') es el DIV donde quiero que se pinten todas las noticias/articulos.
Código HTML:
<div id="todasNot">
             
             </div> 

Código PHP:
success: function(data){
                        $(
'#todasNot').html(data);
                        
gestionaNoticias(data); 


Código PHP:
 function gestionaNoticias(data)
            {
                 var 
caracteresAMostrar 600;
                 var 
elementosObtenidos document.getElementsByClassName("noticia");                                  
                 for (var 
i=0i<elementosObtenidos.lengthi++) {
                    var 
idNoticiaelementosObtenidos[i].childNodes[0].value;
                    var 
contenido elementosObtenidos[i].innerHTML;
                     if (
contenido.length caracteresAMostrar) {
                           var 
resumen contenido.substr(0caracteresAMostrar);
                           var 
todo contenido.substr(caracteresAMostrarcontenido.length caracteresAMostrar);
                           var 
nuevocontenido resumen '<span class="completo">' todo 
                                 
'</span><a href="#" id="' idNoticia '"class="masTex" title= "Leer mas" onclick="cazaLeer(' idNoticia ')">Leer mas...</a>';
                           
                           
//nuevocontenido.replace('title="Eliminar noticia" style="margin-right:10px; display:none"', 'title="Eliminar noticia" style="margin-right:10px; display:inline"');
                           
elementosObtenidos[i].innerHTML nuevocontenido;
                           
               }}
                $(
'#todasNot').innerHTML elementosObtenidos;
            } 
La función cazaLeer es la que tiene que saber que instancia ha sido seleccionada y por tanto la que tiene que gestionar el despliegue o
contraer la info.

Código PHP:
         function cazaLeer(mId){ 
            
            
//Obtenemos el a href seleccionado
            
$idSelecdocument.getElementById(mId);
            
//Obtenemos el padre llamado noticia
            
$padreSelec$idSelec.parentNode;
            
//Buscamos el span llamado completo
            
$claseCompleto$padreSelec.getElementsByClassName("completo");
            
            
            switch (
$idSelec.attributes["title"].value)
            {
                case  
"Leer menos":
                    {
                        
$idSelec.setAttribute("title""Leer mas");                        
                        
$idSelec.innerHTML"Leer mas...";                        
                        
$claseCompleto[0].style.display"none";
                        break;
                    }
                 case  
"Leer mas":
                    {
                        
$idSelec.setAttribute("title""Leer menos");                        
                        
$idSelec.innerHTML"Leer menos...";                        
                        
$claseCompleto[0].style.display"block";                        
                        break;
                    }
                 default:
                    break;
            } 
         } 
Por cierto, no estarás haciendo un postgrado de desarrollo web?
  #3 (permalink)  
Antiguo 08/10/2014, 17:58
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Ocultar texto "leer mas...".

Te propongo hacerlo así:

Código HTML:
Ver original
  1. <div class = "contenido">
  2.     Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip.
  3. </div>
  4.    
  5. <div class = "contenido">
  6.     Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip.
  7. </div>

Código CSS:
Ver original
  1. .contenido{
  2.     width: 25%;
  3.     height: 45px;
  4.     overflow: hidden;
  5. }

Código Javascript:
Ver original
  1. var texto, padre;
  2. $(".contenido").each(function(){
  3.     texto = $(this).html();
  4.     this.setAttribute("data-texto", texto);
  5.     if ($(this).html().length > 75){
  6.         $(this)
  7.             .html(texto.substr(0, 75) + "...")
  8.             .append($("<label class = 'mas'>Ver más</label>"));
  9.     }
  10. });
  11.  
  12. $(".mas").on("click", function(){
  13.     padre = $(this).parent();
  14.     texto = padre.data("texto");
  15.     $(padre)
  16.         .html(texto)
  17.         .css({
  18.             width: "50%",
  19.             height: "5rem"
  20.         });
  21. });

El proceso es simple. Tengo dos <div> (puedes tener uno o más) con la clase 'contenido'. Cada uno de ellos tiene un ancho del 25% de la ventana y 45 píxeles de alto, además, he ocultado las barras de desplazamiento para evitar el desbordamiento del texto.

En el código JavaScript, declaro a las variables texto y padre, las cuales serán usadas más adelante. Enseguida, tomo al conjunto de elementos cuya clase sea 'contenido' e itero sobre dicho conjunto. En cada iteración, tomo el contenido del elemento actual y asigno al pseudo-atributo data-texto (puedes darle el nombre que quieras, como data-ejemplo, data-prueba), el valor que tomamos en la línea anterior, es decir, el texto original. Si la cantidad de caracteres que posee es mayor a 75 (por poner un ejemplo), lo recorto hasta precisamente 75 caracteres, le añado puntos suspensivos y una etiqueta <label> con la clase 'mas' y el texto 'Ver más' y asigno todo esto al elemento actual en la iteración, mas no modifico el valor originalmente tomado y asignado a texto.

Al darle clic a cualquier <label> con la clase 'mas', tomo al elemento padre (el que lo contiene) y lo asigno a la variable padre (una de las que declaré al inicio). De este elemento (el padre), tomo el valor de su pseudo-atributo data-texto y lo asigno a la variable texto (sí, la vuelvo a utilizar). A continuación, asigno como contenido al elemento padre, el texto que acabamos de obtener y modifico sus estilos para que sea más grande.

DEMO

Si deseas obtener el efecto contrario, es decir, reducir el tamaño del <div> y acortar el texto, simplemente realiza el proceso contrario, añadiendo un botón al final del texto (cuando agrandes el <div>) y, al darle clic, realizas el proceso de acortamiento del texto que hago al inicio en la condición.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #4 (permalink)  
Antiguo 09/10/2014, 07:29
 
Fecha de Ingreso: septiembre-2014
Ubicación: Madrid - España
Mensajes: 15
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Ocultar texto "leer mas...".

Muchas gracias por vuestras respuestas y dedicación.

velero no tengo conocimiento de Ajax ni de PHP. Pero de nuevo gracias.

Alexis88 bastante bien explicado, hay cosas que se me escapan pero lo pondre en practica...

Pero antes de cambiar el codigo creo que la solución que voy buscando tiene algo que ver con los selectores.

$('.oculto').slideUp(); // se mostraran oculto de inicio.

$('.leermas').click(function(){
$(this).next('.oculto').slideDown('slow',function( ){
$('.leermas').hide();
});

Al hacer click sobre el texto "leer mas..." que los <p> con la clase oculto se muestren con slideDown. slideDown tiene otra funcion callback para que se oculte el texto "leer mas..." con hide.

¿pero como selecciono ese <h5 class="leermas">Leer mas...</h5> para que se oculte? y no que se me ocultan todos de todos los articulos.

En los <p> a mostrar lo he hecho con next, pero en los texto de Leer mas...???

Gracias de nuevo.

Saludos
David
  #5 (permalink)  
Antiguo 09/10/2014, 13:33
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Ocultar texto "leer mas...".

El problema de hacerlo como lo tienes es que ocultas a todos los elementos con dicha clase. Debes de aislar al elemento al que le has dado el clic para luego afectarlo:

Código Javascript:
Ver original
  1. $('.leermas').click(function(){
  2.     var self = $(this); //Aíslo al elemento al que acabo de darle clic
  3.     $(this).next('.oculto').slideDown('slow',function( ){
  4.         self.hide(); //Ahora sí puedo ocultarlo sin afectar al resto
  5.     });
  6. });

Tienes que leer acerca de la palabra reservada this, te va a ayudar con lo que buscas hacer.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #6 (permalink)  
Antiguo 09/10/2014, 15:03
 
Fecha de Ingreso: septiembre-2014
Ubicación: Madrid - España
Mensajes: 15
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Ocultar texto "leer mas...". Solucionado

Muchísimas gracias Alexis88 es justamente lo que estaba buscando.

Lo desconocía por completo...entiendo que aislar el elemento es ni mas ni menos que meterlo dentro de una variable y así queda diferenciado del resto de elementos con el mismo nombre y mas adelante hacer uso de él.

Tienes razón debo leer más sobre la palabra reservada this y sobre mucho más en general, pero no es por falta de ganas...

De nuevo gracias.
Espero "vernos" por aquí mas a menudo.

David

Etiquetas: Ninguno
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 18:54.