Foros del Web » Programando para Internet » Jquery »

Alguna alternativa para escribir prototypes con Objetos jQuery

Estas en el tema de Alguna alternativa para escribir prototypes con Objetos jQuery en el foro de Jquery en Foros del Web. Hola señores Luego de mucha prueba-error e investigar, encontré la forma cómo hacer que la altura (rows) de un textarea sea modificada según la cantidad ...
  #1 (permalink)  
Antiguo 24/09/2012, 14:53
Avatar de junihh  
Fecha de Ingreso: febrero-2004
Ubicación: República Dominicana
Mensajes: 997
Antigüedad: 20 años, 9 meses
Puntos: 7
Alguna alternativa para escribir prototypes con Objetos jQuery

Hola señores

Luego de mucha prueba-error e investigar, encontré la forma cómo hacer que la altura (rows) de un textarea sea modificada según la cantidad de líneas de texto, tal como pasa en los comentarios de Facebook.

El caso es que traté de guardar dicho efecto a modo de Prototype de la siguiente forma:

Código HTML:
Object.prototype.resizeTextarea = function()
{
	//
};
Con sólo esas líneas se rompió todo. Luego de investigar la razón, encontré que no se puede declarar prototypes de objetos. Antes ya había declarado para strings y numbers, pero ni modo.

Me gustaría guardar dicho efecto como una función para subsecuentes proyectos. ¿Existe alguna alternativa en jQuery para tal cosa?

Acá dejo la función aplicado directamente al objeto:

Código HTML:
$('textarea').bind('keyup',function()
{
	var scrollH = $(this).prop('scrollHeight');
	var paddingTB = parseFloat($(this).css('paddingTop')) + parseFloat($(this).css('paddingBottom'));
	var lineH = parseFloat($(this).css('lineHeight'));
			
	$(this).attr('rows',(scrollH - paddingTB) / lineH);
});
__________________
JuniHH
- Mi blog
- Mi portafolio

Última edición por junihh; 24/09/2012 a las 15:22
  #2 (permalink)  
Antiguo 24/09/2012, 15:40
Avatar de Naahuel  
Fecha de Ingreso: marzo-2011
Ubicación: localhost
Mensajes: 796
Antigüedad: 13 años, 8 meses
Puntos: 192
Respuesta: Alguna alternativa para escribir prototypes con Objetos jQuery

Podrías hacerlo en forma de plugin:

Código Javascript:
Ver original
  1. (function($){
  2.     $.fn.extend({
  3.         // nombre de tu plugin, y parámetros
  4.         resizeTextarea: function(parametros) {
  5.         var defaults = {
  6.             opcion: 'valor',
  7.             otraOpcion: 'otro valor'
  8.         }
  9.        
  10.         var parametros =  $.extend(defaults, parametros);
  11.          
  12.             return this.each(function() {
  13.                 //aqui hacés lo que querés con el elemento
  14.                 $elem = $(this)
  15.                 $elem.bind('keyup',function(){
  16.                     var scrollH = $(this).prop('scrollHeight');
  17.                     var paddingTB = parseFloat($(this).css('paddingTop')) + parseFloat($(this).css('paddingBottom'));
  18.                     var lineH = parseFloat($(this).css('lineHeight'));
  19.                            
  20.                     $(this).attr('rows',(scrollH - paddingTB) / lineH);
  21.                 });
  22.             });
  23.         }
  24.     });
  25. })(jQuery);

Eso lo guardás en un archivo aparte y lo incluís después de jQuery, antes que tus scripts. Después lo podés usar así, por ejemplo:

Código Javascript:
Ver original
  1. $('textarea').resizeTextarea();

Buscá cómo se hace un plugin para jQuery, porque hay muchas cosas a considerar para optimizar el código y que funcione bien. Además, fijate en el uso de opciones. Yo te puse unos parámetros de ejemplo. Esos sirven para configurar el plugin cuando lo llamas. Algo así:


Código Javascript:
Ver original
  1. $('textarea').resizeTextarea({
  2.     opcion: 'aqui doy mi valor'
  3. });

Por cierto, tu código no me funciona :P
__________________
nahueljose.com.ar
  #3 (permalink)  
Antiguo 24/09/2012, 15:43
Avatar de junihh  
Fecha de Ingreso: febrero-2004
Ubicación: República Dominicana
Mensajes: 997
Antigüedad: 20 años, 9 meses
Puntos: 7
Respuesta: Alguna alternativa para escribir prototypes con Objetos jQuery

uff, esperaba no tener que recibir precisamente esa respuesta: Hacer un plugin. Pues de no haber otra alternativa lo aplicaré entonces así. Muchas gracias por tu respuesta Naahuel.
__________________
JuniHH
- Mi blog
- Mi portafolio
  #4 (permalink)  
Antiguo 25/09/2012, 05:26
Avatar de junihh  
Fecha de Ingreso: febrero-2004
Ubicación: República Dominicana
Mensajes: 997
Antigüedad: 20 años, 9 meses
Puntos: 7
Respuesta: Alguna alternativa para escribir prototypes con Objetos jQuery

Hola Naahuel

Volví a leer tu respuesta para ver el ejemplo de plugin y no había notado tu comentario que no funcionó mi código. Traté de preparar un jsFiddle y ciertamente no funcionó, sin embargo, curiosamente funciona muy bien como lo tengo tengo aplicado.

Lo usé en este formulario de contacto. Si quieres ver el código, puedes ir acá y buscar fMessage.bind en el que lo verás aplicado.

Realmente se me hizo curioso que no funcionara en jsFiddle, como si algo le faltara cuando realmente no es así.
__________________
JuniHH
- Mi blog
- Mi portafolio
  #5 (permalink)  
Antiguo 25/09/2012, 06:16
Avatar de Naahuel  
Fecha de Ingreso: marzo-2011
Ubicación: localhost
Mensajes: 796
Antigüedad: 13 años, 8 meses
Puntos: 192
Respuesta: Alguna alternativa para escribir prototypes con Objetos jQuery

Respecto a tu primera respuesta: ¿Por qué no un plugin? Es lo mejor. Si lo hacés bien, lo podés hacer muy efectivo y sobre todo, reutilizable. Además podés aplicarlo con un solo selector, en muchos elementos de la página. No es complicado para nada :)

El problema con tu script (aparentemente) es que usás el método .css() para obtener las dimensiones y propiedades del textarea. El problema de esto es que estas propiedades pueden ser (al menos para line-height) normal, inherit, etc. Acá es donde falla, si no se ha definido una hoja de estilos con valores numéricos.

Lo hice de otra forma y creo que funciona igual que el tuyo:
Código Javascript:
Ver original
  1. (function($){
  2.     $.fn.extend({
  3.         // nombre de tu plugin, y parámetros
  4.         resizeTextarea: function(parametros) {
  5.         var defaults = {
  6.             animacion: 0,    //por defecto, no animamos
  7.             offset: 5        //sumar este offset a la altura para corregir
  8.         }
  9.        
  10.         var parametros =  $.extend(defaults, parametros);
  11.          
  12.             return this.each(function() {
  13.                 //aqui hacés lo que querés con el elemento
  14.                 $elem = $(this)
  15.                 $elem.css('overflow','hidden') //para que no moleste la barra
  16.                 $elem.bind('keyup',function(){
  17.                     var $_ta = $(this);
  18.                     var i_st = $_ta.scrollTop();
  19.                     if(i_st){
  20.                         $_ta.animate({
  21.                             height: '+=' + (i_st + parametros.offset)
  22.                         },parametros.animacion);
  23.                     }
  24.                 });
  25.             });
  26.         }
  27.     });
  28. })(jQuery);​

Fijate que le aplico overflow:hidden. Esto es para que la barra desplazadora no "flashee" y moleste. Queda más elegante. Además, el plugin hacepta un valor de animación por si querés hacer la transición con un efectito. Creo que este nuevo método es mejor porque no depende de los valores de CSS.

Ejemplo: http://jsfiddle.net/WZ6FY/1/
__________________
nahueljose.com.ar
  #6 (permalink)  
Antiguo 25/09/2012, 08:08
Avatar de junihh  
Fecha de Ingreso: febrero-2004
Ubicación: República Dominicana
Mensajes: 997
Antigüedad: 20 años, 9 meses
Puntos: 7
Respuesta: Alguna alternativa para escribir prototypes con Objetos jQuery

Pues vaya que está muy bien como funciona. Precisamente estaba pensando una alternativa para el molesto flasheo que mencionas de la barra. Nuevamente gracias por tu respuesta y ejemplos, me han sido de mucha ayuda.
__________________
JuniHH
- Mi blog
- Mi portafolio

Etiquetas: alguna, objetos
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 19:37.