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

1voto

Ejecución de Scripts en Dispositivos Móviles

Hola buenas tardes, (De nuevo yo por aquí, espero no resultar bastante "pregunton") conforme eh ido avanzando en mi aplicación me eh encontrado con diferentes problemas (En parte lo agradezco ya que es acumular aprendizaje de forma necesaria) la problematica es eh estado desarrollando la creacion de un formulario dinamico para la creacion de encuestas, el cual trae preguntas y respuestas desde una base de datos en la parte web (o navegador) me ah quedado funcionando perfectamente como ilustrare a continuacion:
(Siento el tamaño, no se si se puede ajustar aqui directamente)
enter image description here

Pero al momento de montar el codigo en la parte movil, al parecer no realiza la peticion al servicio que genere, como se puede mirar ya hago referencia directamente a la direccion "ip" y en el documento php ya añadi los permisos de CROS la pregunta es ¿Tengo entendido que al realizarse una aplicacion en Apache Cordova es como si fuera un "pequeño navegador" esta es una de las limitantes de dicho navegador? o ¿Estoy obviando algo que no deberia hacer?
Muestra de mi app:

enter image description here

y al momento de entrar a la web solo me aparece vacio, espero no ser una molestia de ante mano gracias.

0voto

juansolo comentado

Un par de cuestiones:

  • ¿la llamada asincrona se realiza con éxito en el servidor, donde generas una
    respuesta añadiendo las cabeceras necesarias?

  • ¿que respuesta obtienes tras la llamada de la función asíncrona(si
    usas chrome, que es lo que te muestra en la pestaña "Network") ?

  • Las preguntas y respuestas, ¿las cargas en el html a través de
    javascript?

A priori puede ser por las cabeceras "Access-Control-Allow-Origin", "Access-Control-Allow-Headers' ... pero veo que ya lo habías preguntado antes.

Se me olvidaba: ¿has revisado el fichero config.xml?

0voto

AdanCervera comentado

¿la llamada asincrona se realiza con éxito en el servidor, donde generas una
respuesta añadiendo las cabeceras necesarias?
R: Asi es juansolo debugueando desde un navegador me permite realizar la llamada y me devuelve valores de js y lo recorro perfectamente

¿que respuesta obtienes tras la llamada de la función asíncrona(si
usas chrome, que es lo que te muestra en la pestaña "Network") ?
R: Uso en realidad Firefox y en la pestaña de red solo me aparece tamaño y velocidad de respuesta.

Las preguntas y respuestas, ¿las cargas en el html a través de
javascript?
R: Asi es, tolo lo estoy cargando desde JavaScript como mostrare a continuacion

for (var i = 0; i < cadena.registro.length; i++) {
document.write("<div class=\"panel panel-default\"><div class=\"panel-heading\">" +
cadena.registro[i].Pregunta + "</div> <div class=\"panel-body\">");
///alert(datos.registro[i].Pregunta);
for (var j = 0; j < cadena.registro[i].Respuestas.length; j++) {
document.write(" <div class=\"radio\">  <input type=\"radio\" name=\"optradio\"> " + cadena.registro[i].Respuestas[j] + "</div>");
/// alert(datos.registro[i].Respuestas[j]);
}
document.write("</div></div></div>");
}

0voto

juansolo comentado

Si desde el lado del cliente has podido obtener y recorrer los datos, no es problema de permisos. No tengo experiencia con Cordova, sólo hice un pequeño ejemplo hace tiempo pero recuerdo que en el fichero config.xml tuve que poner lo siguiente para poder usar AJAX:

 <access origin="*" />

¿que marcado HTML tienes?

0voto

AdanCervera comentado

Buenas juansolo, ya verifique el archivo config.xml y si tengo la etiqueta

 <access origin="*" />

1 Respuesta

0voto

white Puntos75880

La pagina tiene como finalidad ayudar al usuario con cualquier problema que tenga, asi que creo que no tienes que preocuparte por tus preguntas, sino mas bien sentir confianza en esta comunidad.

creo que el error podria venir desde javascript, algun error de sintaxis http://phonegap.com/2011/05/18/debugging-phonegap-javascript/ en el tag script tienes un codigo, pero podria ser que falte algo como:

$(document).ready(function() {

});

intenta dentro de eso agregar un evento (http://docs.phonegap.com/en/2.2.0/cordova_events_events.md.html#deviceready) :

document.addEventListener("__init", onDeviceReady, false);

entonces..

$(document).ready(function() {
     document.addEventListener("__init", onDeviceReady, false);
});

function __init(){
  // codigo para obtener json y demas....
}

eso si, ese evento funciona con moviles, intenta agregar una condicional para ver si el navegador viene desde un movil.

0voto

AdanCervera comentado

Buenas white, estoy probando agregarle eso solo me manda error en "onDevideReady" lo estare probando bastante acertado el comentario ya que si me faltaba agregarle el "ready" (Detalles verdad jaja) probare e investigare acerca de los eventos y funciones que son necesarias para ejecutar correctamente JS en un dispositivo movil ¿Conoces algún sitio (si se puede en español) donde pueda ver esas cuestiones? Soy nuevo en esto del Apache Cordova como complemento de VS2013 y necesito empaparme mas en esto. De antemano Gracias.

0voto

white comentado

intentaste llamar la funcion __init dentro de $(document).ready() sin el evento? puedes detallar mas sobre el error que te arroja?

el problema es que gran cantidad de tutoriales y documentacion de la red estan en ingles, en programacion el ingles va de la mano

EDIT: acabo de darme cuenta del error que cometí, ingrese mal el evento y el orden, intenta con document.addEventListener("deviceready", __init, false);
en la api de phoneGap el evento a usar es "deviceready"

0voto

AdanCervera comentado

Buenas white, eh probado y no me ah resultado estoy realmente atascado pondre mi codigo para saber si se me esta pasando algo espero sirva de algo

 $(document).ready(function () {
     document.addEventListener("deviceready", __init, false);
    });
function __init() {
  var cadena;
        $.ajax({
            method: "GET",
            url: "http://192.168.0.11:8081/JSON/data.php",
            success: function (h) {
                cadena = JSON.parse(h);
            }
        });
        var msj = "Cargando Preguntas";
        alert(msj);
        alert(cadena);
     for (var i = 0; i < cadena.registro.length; i++) {
            document.write("<div class=\"panel panel-default\"><div class=\"panel-heading\">" +
               cadena.registro[i].Pregunta + "</div> <div class=\"panel-body\">");
          for (var j = 0; j < cadena.registro[i].Respuestas.length; j++) {
                document.write(" <div class=\"radio\">&nbsp;&nbsp;<input type=\"radio\" name=\"optradio\">  " + cadena.registro[i].Respuestas[j] + "</div>");
            }
            document.write("</div></div></div>");
        }
     }

¿En Cordova se puede hacer AJAX sin ninguna configuración extra?

0voto

AdanCervera comentado

White, acabo de realizar una prueba mas acabo de entrar directamente desde mi dispositivo a donde eh estado realizando las pruebas ejemplo: "http://192.168.0.11:8081/JSON/service.prueba.html" desde el navegador del dispositivo no funciona, pero desde el navegador de mi equipo si; lo que me pone a pensar es que no me esta permitiendo la carga asíncrona

0voto

AdanCervera comentado

White, acabo de realizar una prueba mas acabo de entrar directamente desde mi dispositivo a donde eh estado realizando las pruebas ejemplo: "http://192.168.0.11:8081/JSON/service.prueba.html" desde el navegador del dispositivo no funciona, pero desde el navegador de mi equipo si; lo que me pone a pensar es que no me esta permitiendo la carga asíncrona

EDITADO:
Ya instale el Firefox en mi dispositivo movil y funciono perfectamente al entrar a la direccion anterior, ¿es cuestion de permisos de CORS entonces?

0voto

white comentado

Es cuestion de compatibilidad, aca tenes una tabla de compatibilidad:

http://enable-cors.org/client.html
http://caniuse.com/#feat=cors
http://mobilehtml5.org/

gran cantidad de navegadores dan soporte, asi que podrias usarlo sin problema, talvez avisando al usuario el uso de un navegador moderno.

EDIT: de ultima, haz intentado un javascript dinamico? quiero decir imprimir javascript desde php para obtener datos que creo que es lo que quieres realizar al final, es solo otra opcion mas por si cors te complica las cosas.

data.php

<?php
    header('Content-type: text/javascript');

    // $json contiene informacion para usarlo en javascript
    $data = json_encode($json)
    echo "$global_data = JSON.parse(" . $data . ");";

index.html

<script src="data.php" type="text/javascript"></script>
<script type="text/javascript">
    console.log($global_data);
</script>

0voto

AdanCervera comentado

Buen dia White;

Considere hacer lo del script dinámico y lo sentí un poco menos practico para las cosas que deseo hacer en un futuro; estoy tratando de dar con la configuracion (me imagino es de los header de mi php) para un funcionamiento genérico en navegadores (espero no sea una lucha en vano) estaré posteando la solución cuando la encuentre.

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