¿Cómo obtener datos de un request post desde JqueryMobile?
Publicado: mayo 26, 2012 Archivado en: iphone, Jquery, Web 2.0 | Tags: Celular, jquerymobile, Mobile Deja un comentario »
Seguro que a más de uno le ha pasado el problema de enviar datos tipo POST a una página esperando que retorne la data ya ejecutada después del post. A mí me pasó y no encontraba una solución posible y sencilla, así que me leí casi la documentación completa de JqueryMobile y encontrarme con algo como esto (Resumo un poco): http://jquerymobile.com/demos/1.1.0/docs/pages/page-dynamic.html Internally, when the user clicks on one of these links, the application intercepts the internal$.mobile.changePage() call that is invoked by the frameworks’ default link hijacking behavior. It then analyzes the URL for the page about to be loaded, and then decides whether or not it should handle the loading itself, or to let the normal changePage() code handle things. The application was able to insert itself into the changePage() flow by binding to the pagebeforechange event at the document level:
// Listen for any attempts to call changePage().
$(document).bind( "pagebeforechange", function( e, data ) {
// We only want to handle changePage() calls where the caller is
// asking us to load a page by URL.
if ( typeof data.toPage === "string" ) {
// We are being asked to load a page by URL, but we only
// want to handle URLs that request the data for a specific
// category.
var u = $.mobile.path.parseUrl( data.toPage ),
re = /^#category-item/;
if ( u.hash.search(re) !== -1 ) {
// We're being asked to display the items for a specific category.
// Call our internal method that builds the content for the category
// on the fly based on our in-memory category data structure.
showCategory( u, data.options );
// Make sure to tell changePage() we've handled this call so it doesn't
// have to do anything.
e.preventDefault();
}
}
});
Pues vayamos a lo que nos concierne y nos ayudará, gracias a eso claro.
Este será el código javascript:
// Listen for any attempts to call changePage().
$(document).bind("pagebeforechange", function(e, data) {
// We only want to handle changePage() calls where the caller is asking to load a page by URL.
if (typeof data.toPage === "string") {
// We only want to handle #partypoint url.
var u = $.mobile.path.parseUrl(data.toPage);
var partypoint = /^#partypoint/;
if (u.hash.search(partypoint) !== -1) {
// Display PAGE for the selected URL.
showPage(u, data.options);
e.preventDefault();
}
}
});
// Generate markup for the page, and then make that page the current active page.
function showPage(urlObj, options) {
// Get the url parameter
var qrUrl = decodeURIComponent(urlObj.hash.replace(/.*url=/, ""));
// The div(role-page) we use to display section is already in the DOM.
// The id of the page we are going to write the content into is specified in the hash before the '?'.
var pageSelector = urlObj.hash.replace(/\?.*$/, "");
if (qrUrl) {
// Get the page we are going to write content into.
var $page = $(pageSelector);
// Get the header for the page.
var $header = $page.children(":jqmData(role=header)");
var markup = '';
//Select the data send to the post page (if you have it)
var Datasend=$("#formulario").serialize();
$.ajax({
url : qrUrl,
data : Datasend,
type : 'POST',
dataType : 'json',
success : function (data) {
// Find the h1 element in the header and inject the hostname from the url.
$header.find("h1").html(data.Title);
// Get the content area element for the page.
var $content = $page.children(":jqmData(role=content)");
markup = data.Data;
// Inject the data markup into the content element.
$content.html(markup);
// Make sure(if you want) the url displayed in the the browser's location field includes parameters
options.dataUrl = urlObj.href;
// Now call changePage() and tell it to switch to the page we just modified.
$.mobile.changePage($page, options);
},
error : function (jqXHR, textStatus, errorThrown) {
/*Make your error message*/
}
}); //Close Ajax
} // Close qrUrl
}//Close Function
Creamos la pantalla principal(index.html, por ejemplo):
Vamos a poner, como principal, un formulario, más abajo se explica, además tendremos que poner la sección donde se cargará el resultado:
<div data-role="page" class=".ui-page">
<div data-role="header" data-theme="b" data-position="fixed">
<h1>Party Point</h1>
</div>
<div data-role="content" class="wrapper">
<div class="ui-corner-top ui-header ui-bar-b">
<h1 class="ui-title" role="heading" aria-level="1">Login</h1>
</div>
<div class="ui-corner-bottom ui-content ui-body-c">
<fieldset class="container_12">
<form action="#partypoint?url=inc%2Flogin.php" method="post" id="formulario" name="formulario">
<input type="hidden" id="Accion" name="Accion" value="Login">
<div data-role="fieldcontain">
<label for="Username">Usuario:</label>
<input type="text" name="Username" id="Username" value="" data-mini="true" />
</div>
<div data-role="fieldcontain">
<label for="ClaveUser">Clave:</label>
<input type="password" name="ClaveUser" id="ClaveUser" value="" data-mini="true" />
</div>
<div class="ui-block-a">
<button type="submit" data-theme="b" data-mini="true" class="ui-btn-hidden" aria-disabled="false">Enviar</button>
</div>
<div class="ui-block-b">
<a href="#partypoint?url=inc%2Fregistrar.inc" data-role="button" data-rel="dialog" data-transition="pop" data-theme="b" data-mini="true">Registrarse</a>
</div>
</form>
</fieldset>
</div>
</div>
</div>
Aquí vemos que el formulario enviará el dato a esta url:
#partypoint?url=inc%2Flogin.php Tenemos varios datos que tomar en cuenta:
- #partypoint -> El Id de la sección donde irá la data que enviamos por ajax
- url= -> Indica lo que vamos a cargar
- inc%2FLogin.php -> Este es el archivo a cargar (inc/Login.php), se pone %2F para que lo interprete el script de arriba.
<div data-role="page" id="partypoint">
<div data-role="header" data-theme="b" data-position="fixed">
<a href="#home" data-icon="home" data-iconpos="notext" data-theme="f">Home</a>
<h1>Home</h1>
<a href="#home" data-icon="arrow-l" data-rel="back">Back</a>
</div>
<div data-role="content">
</div>
<div data-role="footer" class="ui-bar" data-theme="a" data-position="fixed" data-id="footer">
<a href="#about" data-icon="info">About</a>
</div>
</div>
Aquí vemos lo siguiente:
- id=”partypoint” -> El Id de la sección a editar a través del ajax.
- <h1>= -> Donde cargaremos el Título del ajax obtenido
- data-role=”content”-> Aquí cargaremos el contenido obtenido.
Veamos lo que hace ahora la ejecución del formulario, presionamos Submit(Enviar):
- El Script verificará si la data enviada tiene a #partypoint en su URL.
- #partypoint?url=inc%2Flogin.php
- Como lo contiene pues pasará por la función showPage().
- La función buscará el url.
- inc%2Flogin.php
- Buscamos el ID de la sección (data-role=”page” id=”¿?”)
- pageSelector=partypoint
- Convertimos a objeto el pageSelector y obtenemos el objeto header
- var $page = $(pageSelector);
- var $header = $page.children(“:jqmData(role=header)”);
- Serializamos la data del formulario
- var Datasend=$(“#formulario”).serialize();
- Envíamos la data y recibimos el json
- Modificamos el título
- $header.find(“h1″).html(data.Title);
- Buscamos la sección content y agregamos la data recibida
- var $content = $page.children(“:jqmData(role=content)”);
- $content.html(markup);
- Hacemos el cambio de página, como si hicieramos click pero lo hacemos por javascript:
- $.mobile.changePage($page, options);
Yo recomendaría agregar esta línea de código justo después del cambio de página:
$page.page(“destroy”).page();
Esto destruirá todo el diseño de la sección y lo volverá a crear. Esto lo hacemos porqué a veces si le das para atrás y ejecutas nuevamente una llamada ajax para rellenar la data pues esa “page” ya estará creada y no se recargará y la data que venga dentro no estará formateada visualmente, si destruyes la página y la vuelves a crear todo el diseño se recreará.
Se puede usar también $page.trigger(‘create’) ; Pero he visto que a veces no me funciona, o quizás lo esté haciendo mal, pero mejor ir a la lo seguro y que funciona perfectamente.
Aquí está el ejemplo, pero no está la página de Login.php, por si acaso:
http://jsfiddle.net/juanmboehme/bcvrc/
Crear una versión móvil de tu website solo usando Media Queries (CSS)
Publicado: marzo 14, 2012 Archivado en: css, diseño, media, Stylesheet, Web 2.0 Deja un comentario »Lo primero de todo es conocer un poco el uso de Media Queries en general, aquí hay una buena información que debería ser leída por todos los que son Desarrolladores ó Diseñadores WEB.
Para que nos funcione simplemente usaremos la etiqueta(tag) Link y la propiedad media con el Query en cuestión.
1- Ejemplo:
<link rel=”stylesheet” type=”text/css” href=”screen480.css” media=”screen and (min-width: 480px)” />
El Ejemplo 1 será útil para cualquier pantalla que tenga la resolución de un tamaño mayor a 480px.
2- Ejemplo:
<link rel=”stylesheet” type=”text/css” href=”screen.css” media=”screen and (min-width: 480px) and (max-width: 768px)“/>
El Ejemplo 2 aplicará como el Ejemplo 1 pero en este caso se restringue a resoluciones no mayores de 768px.
3- Ejemplo:
<link rel=”stylesheet” type=”text/css” href=”moviles.css” media=”handheld” />
En este 3er ejemplo no estamos usando un tamaño definido de pantalla sino más bien un tipo de dispositivo, en este caso tenemos el handheld, pero existen varios tipos entre ellos tenemos:
- all Used for all media type devices
- aural Used for speech and sound synthesizers
- braille Used for braille tactile feedback devices
- embossed Used for paged braille printers
- handheld Used for small or handheld devices
- print Used for printers
- projection Used for projected presentations, like slides
- screen Used for computer screens
- tty Used for media using a fixed-pitch character grid, like teletypes and terminals
- tv Used for television-type devices
Existe un problema con algunos dispositivos, sobre todo con Iphone.
Cuando creas tu css para utilizar en el iphone, en este caso 320px(viewport)-480px(landscape) verás que realmente el tamaño de la pantalla es 980px, aunque hayas definido el css anterior no lo tomaría en cuenta por 2 razones:
- La pantalla por defecto en el Safari es 980px
- Si está en viewport la pantalla es 320px y nosotros hemos definido “mayor de 480px“
Tenemos que hacer 2 cosas:
- Introducir este meta en nuestra página:
<meta name=”viewport” content=”width=device-width, initial-scale=1, maximum-scale=1″> - Modificar o crear un nuevo CSS indicando el tamaño que sea para un width menor de 481px.
El meta tag hará que el dispositivo tome el tamaño más grande con referencia a la pantalla(screen), con lo que veremos que al estar en landscape veremos el tamaño a 480px y cuando estemos en viewport estará en 320px.
Viaje a las estrellas con Google Sky
Publicado: agosto 27, 2007 Archivado en: Web 2.0 Deja un comentario »Para no ir más lejos[Valga la indirecta] ahora google no se conforma con ver la tierra, aunque ya sabíamos que google podía ver más allá, ahora nos lo asegura poniendo a dispocisón de todos este proyercto del google Earth, pero no para ver la tierra, sino para ver más allá, ahora mismo las estrellas y algunas constelaciones.
Microsoft Surface “Increíble”
Publicado: mayo 31, 2007 Archivado en: Web 2.0 2 Comentarios »Para mi es realmente algo muy interesante e innovador, aunque ya se quería esto desde hace mucho, ahora es que va a salir…
Observen y opinen
Crear cuentas Gmail rapidamente
Publicado: abril 25, 2007 Archivado en: Javascript 57 Comentarios »Aquí tengo un manual “TRUCO” para crear cuentas de Gmail, en español, más rápidamente, sin tener que estar llenando todo, solamente deberíamos llenar la palabra en imagen que aparece casi al final del formulario y claramente darle a aceptar, aunque si quieren también le quitamos el aceptar.
Esto sirve para los que tienen que crear cuentas en secuencia, jb1, jb2, jb3, etc...
Bueno lo primero es abrir la página para crear cuentas ::Crear Cuenta:: Una vez que la pantalla cargue copiamos el siguiente código que aparece más abajo. Código(Sin enters, ni espacios, ni nada, tal y como está) Desde javascript hasta(‘listo’); inclusive:
Link
Ahora con esto vamos a la página y sustituimos el url por esto.
Una vez colocado presionamos la tecla enter.
–![]()
Un popup nos preguntará por un número o letra y colocamos el número ó letra que queramos para crear la cuenta.
Ahora solo faltan 2 cosas: Verificar que esa cuenta no exista y llenar la palabra en letras que aparece al final del formulario. Si todo está correcto simplemente presionamos Aceptar y ya tendremos la cuenta creada, sin tener que llenar todos los datos que aparecen en pantalla tantas veces.
Ahora a explicar el código que aparece arriba:
Primero que todo hay que tomar en cuenta que las cuentas creadas de esta manera tendrán las siguientes propiedades:
Nombre:el que quieras
Apellido: El que quieras
Nombre de Registro= Nombre + Apellido + el número que el popup te pregunta;
Clave:Nombre + Apellido + el número que el popup te pregunta;
ReClave:Nombre + Apellido + el número que el popup te pregunta;
Pregunta Personal:Qs?
Respuesta Personal:Nada;
Pongamos un ejemplo, el que aparece en el código más arriba(poniendo 2 en el popup que te pregunta);
Nombre:JM
Apellido: BOEHME
Nombre de Registro= JMBOEHME2@gmail.com
Clave:JMBOEHME2
ReClave:JMBOEHME2
Pregunta Personal:Qs?
Respuesta Personal:Nada;
Listo.
Ahora veamos las variables o como cambiarlas:
Primero tenemos que decir que lo que ves en rojo son las variables y en verde los valores, podrás cambiar los valores pero toma en cuenta:
N= Es el nombre que aparece en tu cuenta, podrás cambiarlo por lo que sea(el ejemplo dice:JM).
A= Es el apellido que aparece en tu cuenta, podrás cambiarlo por lo que sea(el ejemplo dice:BOEHME).
NN= Es un número(#) ó letra que le pondrá a tu correo y a tu password(te saldrá un popup preguntando).
objeto.Email.value= Es el correo que tendrá (N+’.'+A+NN, donde N es nombre, un punto . , A apellido y NN el número o letra del popup)
objeto.Passwd.value y objeto.PasswdAgain.value= Como su nombre indica contendrán el password de la cuenta que se va a crear de la siguiente manera(N+A+NN= Nombre apellido y número o letra de l popup)
Yo recomiendo solamente cambiar la clave agregando algo extra ó algo fijo por ejemplo:
objeto.Passwd.value=N+A+NN+’pp2′
objeto.PasswdAgain.value=N+A+NN+’pp2′
La clave nueva sería:
JMBOEHME2pp2
ó también podemos cambiar el orden:
objeto.Passwd.value=’pp2′+N+A+NN
objeto.PasswdAgain.value=’pp2′+N+A+NN
La clave nueva sería:
pp2JMBOEHME2
ó podemos poner algo entre las palabras:
objeto.Passwd.value=N+’new’+A+NN
objeto.PasswdAgain.value=N+’new’+A+NN
La clave nueva sería:
JMnewBOEHME2pp2
NOTA: Yo nunca pongo una cuenta de correo alternativa, porqué cuando la pones ellos verifican cuantas cuentas tienen y al final no te permiten crear muchas cuentas de correo, te recomiendo que la crees y después con el tiempo si quieres le agregas la cuenta de correo alternativa.
NOTA2: Cuando pueda pondré un flash explicándolo mejor, lo que pasa es que ahora estoy en el trabajo y no me da tiempo…
Espero que a más de uno le funcione, a mi me funciona perfectamente, me ahorro por lo menos 1 minuto en cada cuenta, claramente las variables hay que modificarlas bien porqué sino no te va a funcionar como quieres.. Suerte..
NOTA3: Estoy en proceso de mejorar este sistema, pero como dije estoy en el trabajo… Suerte…







