Soy un novato en Ajax, estoy tratando de obtener datos usando la funcionalidad de dominio Ajax Cross. La función Ajax se llama desde test.php que llama a stats.php para solicitar datos
Estadísticas.php
<?php $data = array(); $data[0]=1; $data[1]=1; echo json_encode($data); ?>Prueba.php
<html> <head> <script src="./lib/jquery.min.js"></script> <script> var var0=0; $(document).ready(setInterval(function() { $.ajax({ cache: false, type: "GET", url: "http://10.0.0.2/dashBoard/stats.php", data: "", dataType: "jsonp", crossDomain: true, jsonpCallback: 'callback', contentType: "application/json; charset=utf-8", success: function(data){ console.log(window.var0 = data[0]); } }); }, 1000)); $(document).ready(setInterval(function() { document.getElementById("p1").innerHTML = window.var0; },1000)); </script> </head> <body> <p id="p1"></p> </body> </html>test.php está en 10.0.0.1 stats.php está en 10.0.0.2
Ajax puede llamar a stats.php y puedo ver la respuesta json pero no puedo usar estos datos de respuesta en test.php. No puedo asignar el valor data[0] , que es 1 según stats.php a window.var0 en test.php, que es una variable global. Sin embargo, esto funciona perfectamente bien cuando stats.php está en 10.0.0.1 junto con test.php, pero mi requisito es cargar datos de stats.php en 10.0.0.2.
Por favor ayuda.
Gracias por adelantado.
Su problema es que desacopla la función que trae los datos del servidor y la función que toma esos datos y cambia el DOM en función de la respuesta del servidor. Además, está ejecutando ambas funciones al mismo tiempo. Esto significa que la función que cambia el DOM se activará antes de que regrese la respuesta del servidor.
El objetivo principal de usar un $ajax es saber cuándo ha regresado la respuesta, por lo que podría usar esos datos. Al colocar $.ajax en una función y lo que hace con la respuesta en otra, rompe este comportamiento de "esperar a que lleguen los datos". El propósito completo de la función de success es que se ejecuta cuando la respuesta ha regresado con éxito. En success ya tienes los datos. Así que úsalo para cambiar DOM directamente:
Usa esto en su lugar:
$(document).ready(setInterval(function() { $.ajax({ cache: false, type: "GET", url: "http://10.0.0.2/dashBoard/stats.php", data: "", dataType: "jsonp", crossDomain: true, jsonpCallback: 'callback', contentType: "application/json; charset=utf-8", success: function(data){ document.getElementById("p1").innerHTML = data[0]; } }); }, 1000));No puedo estar seguro, ya que no conozco el contexto, pero lo más probable es que ahora pueda eliminar de forma segura el contenedor de tiempo de espera. No tiene sentido retrasar la llamada de datos, ¿verdad?
var var0; function updateP1(){ document.getElementById("p1").innerHTML = var0; } $(document).ready(function() { $.ajax({ cache: false, type: "GET", url: "http://10.0.0.2/dashBoard/stats.php", data: "", dataType: "jsonp", crossDomain: true, jsonpCallback: 'callback', contentType: "application/json; charset=utf-8", success: function (data) { var0 = data[0]; updateP1(); } }); });