entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Parseo de parametros de una url

Hola a todos!

Vamos al grano:

Supongamos que tengo un link con la url:

http://www.ejemplo.com/?param1=value1¶m2=value2¶m3=value3

y cuando le hago click, se parsea y obtiene el siguiente objeto:

{
   param1: "value1",
   param2: "value2",
   param3: "value3"
}

y se lo pasa a una función que hace alguna acción cualquiera sea, por ejemplo, ruteo.

Para resolver el problema programé, utilizando JQuery y Underscore, lo siguiente:

$(document).on('click', 'a[href]', function() {
   var $this = $(this);
   if ($this.is('[data-on-before-request]')) {
      var queryParams = _.reduce(this.search.slice(1).split('&'), function(res, el) {
         var parts = el.split('=');
         res[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);
         return res;
      }, {});
      window[$this.attr('data-on-before-request')](queryParams);
   }
});

Mi duda es si el código tiene errores o le falta algo. Cabe aclarar que no me importa enviar arreglos a travez de la url, si quiero eso, uso un formulario. Lo que quiero es hacer consultas simples.

Si les interesa: El objetivo de esto es terminar de programar una biblioteca de ruteo y carga dinamica de plantillas html. Por ahora, es para uso no comercial hasta que le realice testing. La voy a subir a github.com
Ya existen bibliotecas de ese tipo, pero las más populares son incomodas de usar, ya que requieren escribir mucho código en JavaScript. Además, todavía tengo una idea sobre esto y quiero plasmarla antes que se me olvide. Esta biblioteca me sirve para crear aplicaciones web de una sola página.

Espero sus respuestas. Saludos!

2 Respuestas

1voto

pedrourday Puntos3330

Hola @magarzon

Esta bien eliminar dependencias pero creo que utilizar expresiones regulares es factible de error y es mejor evitarlas aunque su rendimiento sea muy bueno; pero no siempre es así. En vez de expresiones regulares puedo utilizar un ciclo nativo "for" de javascript que tambien es performante, pero no es bueno preocuparse por la performance primero. Con eso ya puedo sacar a underscore como dependencia; y tambien me fijé y saque algunas más, excepto JQuery y otra más.

No creo que no codificar el signo = sea un comportamiento que vaya con los estandares pues crea ambiguedad. Ademas, las url de los link no se escriben manualmente, sino que son generadas a partir de datos en una base de datos. Estuve averiguando y encontré que PHP tiene una función llamada http_build_query que hace lo inverso a lo que pido. Lo que necesitaba es lo inverso a http_build_query desde el cliente y con Javascript. Probé la función y también codifica el =. Así que no hay error y mi algoritmo está correcto. Ya lo codifique en javascript puro, así que problema resuelto.

Este foro no me permite cerrar preguntas sin responder, pero yo me respondí a mi mismo así que marco esta como mejor respuesta, si es que me deja eso.

Gracias por querer ayudar, no te ofendas pues lo que cuenta es la intención!

Saludos!

0voto

magarzon comentado

Como quieras, pero la función que te puse está sacada y adaptada de la librería más utilizada para parseo de urls en javascript, así que algo bueno debe de tener, digo yo.

3votos

magarzon Puntos30650

Hola, tu código no está mal, pero al menos tiene un error que haya podido apreciar: Si el valor de uno de los parámetros incluye un = (sin codificar), tu código no lo va a interpretar bien.

Este código sí que te interpreta el = en los valores y además he hecho una medición y tarda la mitad que el tuyo (y además te quitas la dependencia de underscore):

var queryParams = {};

var search = this.search.substring(1);
search.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function (str, p1, p2) {
   if (p1) queryParams[p1] = decodeURIComponent(p2);
});

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta