Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Problema al cargar codigo AJAX

Estas en el tema de Problema al cargar codigo AJAX en el foro de Frameworks JS en Foros del Web. Estoy intentando ejecutar un script AJAX en el lado del cliente que llama a otra pagina en mi server, y lee la respuesta del navegador. ...
  #1 (permalink)  
Antiguo 17/10/2006, 02:44
 
Fecha de Ingreso: diciembre-2003
Mensajes: 222
Antigüedad: 20 años, 11 meses
Puntos: 2
Problema al cargar codigo AJAX

Estoy intentando ejecutar un script AJAX en el lado del cliente que llama a otra pagina en mi server, y lee la respuesta del navegador. Pero siempre que se carga la pagina sale una advertencia de seguridad que me gustaria eliminar... que no aparezca dado que no la suelen aceptar...

el mensaje de error es el siguiente: "Esta pagina esta intentando el acceso a informacion fuera de su control. Esto presenta un riesgo de seguridad.¿Desea Continuar?"

Xfavor si alguien sabe como evitar este mensaje le estare eternamente agradecido.

El codigo AJAX es el siguiente:

Código:
<script language="javascript" type="text/javascript">
function clientSideInclude(id, url) {
  var req = false;
  if (window.XMLHttpRequest) {
    try {
      req = new XMLHttpRequest();
    } catch (e) {
      req = false;
    }
  } else if (window.ActiveXObject) {
    // For Internet Explorer on Windows
    try {
      req = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        req = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        req = false;
      }
    }
  }
 var element = document.getElementById(id);
 if (!element) {
  alert("Bad id " + id + 
   "passed to clientSideInclude." +
   "You need a div or span element " +
   "with this id in your page.");
  return;
 }
  if (req) {
    req.open('GET', url, false);
    req.send(null);
    element.innerHTML = req.responseText;
  } else {
    element.innerHTML =
   "Sorry, your browser does not support " +
      "XMLHTTPRequest objects. This page requires " +
      "Internet Explorer 5 or better for Windows, " +
      "or Firefox for any system, or Safari. Other " +
      "compatible browsers may also exist.";
  }
}
</script>
y lo llamo con un sencillo:

Código:
onLoad="clientSideInclude('includeone', 'http://url.com);
Xfavor algo de ayuda que estoy desesperado.
  #2 (permalink)  
Antiguo 17/10/2006, 05:09
Avatar de ikhuerta  
Fecha de Ingreso: octubre-2006
Mensajes: 104
Antigüedad: 18 años, 1 mes
Puntos: 0
Creo que lo que no le gusta es que le crees un obejto:

Msxml2.XMLHTTP

Prueba con solo

el active obj -> Microsoft.XMLHTTP

y si no va que pruebe

new XMLHttpRequest()
  #3 (permalink)  
Antiguo 18/10/2006, 02:18
 
Fecha de Ingreso: diciembre-2003
Mensajes: 222
Antigüedad: 20 años, 11 meses
Puntos: 2
He intentado las dos cosas que me comentas, pero sigue fallando... O a lo mejor no lo he hecho bien... Es que no tengo mucha idea de AJAX... Alguna otra idea???
  #4 (permalink)  
Antiguo 18/10/2006, 09:28
 
Fecha de Ingreso: diciembre-2003
Mensajes: 222
Antigüedad: 20 años, 11 meses
Puntos: 2
Aparte de esta advertencia de seguridad, que me gustaria quitar... tengo problemas, al poner el codigo en el server de algun cliente, porque se pega con los otros javascripts, y da el siguiente error:

“Error: uncaught exception: Permiso denegado para llamar el método XMLHttpRequest.open”

Y esta la razón que parece genera el error:

“ese error ocurre porque con un XMLHttpRequest no puedes pedir datos de otro dominio, solo trabajar con el dominio local, es por razones de seguridad.”

Estoy desesperado... en mi maquina funciona de pm, haciendo las pruebas como cliente desde otro dominio... pero en algunos servers me da este error... y siempre el de seguridad...

A alguien s ele ocurre una solucion... O manera de que lo cambie...
  #5 (permalink)  
Antiguo 18/10/2006, 09:51
Avatar de ikhuerta  
Fecha de Ingreso: octubre-2006
Mensajes: 104
Antigüedad: 18 años, 1 mes
Puntos: 0
Si no sabes mucho de javascript busca otro codigo por ahi que genere el objeto xmlHttpRequest... el que tienes no parece el adecuado. Mira de que en vez de incluir los 2 objetos que tu tienes incluya los 2 que yo te digo. Y simplemente cambia la funcion que genera el objeto por la nueva...


En cuanto a lo segundo esta muy claro. Por cuestiones de seguridad ajax nunca carga contenido externo al dominio en el que se encuentra... ignoro porque en casa te funciona ya que ajax no debería funcionar si no estas usando el protocolo http. Es decir desde file:///C:/tu_carpeta no debería funcionar.

Para hacer funcionar a ajax de esta forma lo suyo es que uses algo de programacion de lado del servidor como php o asp. Con ellos puedes conseguir que una pagina tuya simplemente muestre exactamente lo que muestra otra pagina de internet. Así puedes digamos "engañar" a ajax (no le engañas, pero bueno , parecerá que si).

Espero qu ete sirva.

Iñaki.
  #6 (permalink)  
Antiguo 24/10/2006, 13:31
Avatar de ikhuerta  
Fecha de Ingreso: octubre-2006
Mensajes: 104
Antigüedad: 18 años, 1 mes
Puntos: 0
Buenas paranoid como te he dicho aqui tienes el codigo arreglado:
(cuidado con los saltos de linea que se hayan podido ocurrir por no caber...)

Código:
<script type="text/javascript">
req=new Array;
function cXHR(){ var oXHR=false; if (window.ActiveXObject){oXHR=new ActiveXObject("Microsoft.XMLHTTP");}else if(window.XMLHttpRequest){oXHR=new XMLHttpRequest();}if(oXHR)return oXHR;else alert("Error: AJAX no funciona en su navegador actualicelo.");}
function $$(id){ if (document.getElementById(id)) return document.getElementById(id); else  alert("Id Incorrecta: " + id + ". La id pasada a clientSideInclude() no era valida. Necesitas crear un div o Span con esa id en tu pagina web" );}

function clientSideInclude(id, url) {
n=req.length;
req[n]=cXHR();
  
req[n].open("GET", url, true);
req[n].onreadystatechange=function(){if (req[n].readyState==4){	
						if (XHR[n].status==200){ $$(id).innerHTML=req[n].responseText;  }
						else if(XHR[n].status==404){alert("Error: La url llamada con AJAX no existe");}
						else {alert("Error "+XHR[n].status+": "+XHR[n].statusText);}}}
req[n].send();
}
</script>
La llamada luego ser haría simplemente con al funcion clientSideInclude(id, url)

Espero que ahora si que te salga.

Iñaki.
  #7 (permalink)  
Antiguo 25/10/2006, 06:19
 
Fecha de Ingreso: diciembre-2003
Mensajes: 222
Antigüedad: 20 años, 11 meses
Puntos: 2
Hola Iñaki,

lo he intentado con el codigo que tu me pasate, pero sigue sin funcionar... Se queja el navegador porque no tiene permisos... Al principio me decia que no existia la variable XHR y la cambie por req[n] que quedaria asin:

Código:
req[n].onreadystatechange=function(){if (req[n].readyState==4){  
            if (req[n].status==200){ $$(id).innerHTML=req[n].responseText;  }
            else if(req[n].status==404){alert("Error: La url llamada con AJAX no existe");}
            else {alert("Error "+req[n].status+": "+req[n].statusText);}}}
req[n].send();
Y cuando hice este cambio en local me funcionaba, pero entre servidores, no...

En Local seguia dando la advertencia de seguridad, y cnd la aceptabas ya te mostraba el contenido. Al meterlo en un server no me muestra la advertencia de seguridad , pero da un fallo de javascript que puedes ver en esta url:

http://www.startupdot.com/pruebas_ca...r2_carlos.html

Y el error reza asi: Permiso denegado :(

Cuando intenta hacer el
Código:
req[n].open("GET", url, true);
No se que puede ser... y estoy desesperado... Esto es una cosa que le encarge a un freelance porque yo entiendo de php, pero nunca me he puesto con AJAX y javascript... El tio me lo dio como que funcionaba, y ha desaparecido... llevo un mes dandole largas al cliente, intentando que esto funcione... pero ya no se que hacer...

Muchas gracias por intentar ayudarme Iñaky,

Carlos
  #8 (permalink)  
Antiguo 25/10/2006, 10:22
Avatar de ikhuerta  
Fecha de Ingreso: octubre-2006
Mensajes: 104
Antigüedad: 18 años, 1 mes
Puntos: 0
Buenas Paranoid.

Bien visto lo del cambio de variable... estoy demasiado acostumbrado a usar XHR y a veces me cuelo ;)

Te dire que tu codigo si que funciona pero como ya he comentado ajax no puede cargar contenidos de un servidor distinto al que te encuentras... Es una de las grandes carencias del objeto xmlhttprequest.

Como conseguirlo entonces?

Dices que de php si que controlas asi que la solucion va a ir por ahi. Lo que tienes que hacer es que ajax cargue una pagina de tu propio servidor hecha en php. Ese php lo unico que tiene que hacer es coger una URL y devolverte exactamente el HTML que encuentre en ella.

Para ello creo que mejor que pidas ayuda en el foro de php o te mires tu mismo la referencia de PHP ya que veo que yo siempre he usado:

file_get_contents

y claro, no creo que eso valga para ir a un servidor externo.

Suerte y ya que estas comentame que funcion de php te ha ido bien para hacerlo.

Iñaki
  #9 (permalink)  
Antiguo 25/10/2006, 14:35
 
Fecha de Ingreso: octubre-2006
Ubicación: Guadalajara, Mexico
Mensajes: 177
Antigüedad: 18 años, 1 mes
Puntos: 0
Problema al accesar otro URL

Mira este problema es de seguridad y siempre te dara si queires accesar a otro URL distinto. Te aconsejo veas algo de seguridad de Java script y veras que lo solucionas. Yo vi ese problema hace dos dias. Tomate un libro y te explicara a detalla ese problema

saludos
  #10 (permalink)  
Antiguo 27/10/2006, 15:07
 
Fecha de Ingreso: octubre-2003
Ubicación: Cerca de una wifi o 3G
Mensajes: 328
Antigüedad: 21 años, 1 mes
Puntos: 4
yo me he dado cuenta de lo mismo, tambien note mañas con algunos exploradores

ajax a veces falla si es que hay dos id repetidos tanto en la solicitud como en la pagina origen.

tambien falla cuando el html no esta escrito de cierta forma logica

ejemplo

Código PHP:
<table>
    <
tr>
        <
td>
            <
table id="tab2">
                <
div id="ajax">
                </
div>
            </
table>
        </
td>
    </
tr>
</
table

ajax a cargar
Código PHP:
<tr>
    <
td>
        
contenidos html etc
    
</td>
</
tr

FORMA CORRECTA
Código PHP:
<table>
    <
tr>
        <
td>
            <
div id="ajax">
            </
div>
        </
td>
    </
tr>
</
table
AJAX A CARGAR
Código PHP:
<table>
    <
tr>
        <
td>
            
contenidos html etc
        
</td>
    </
tr>
</
table
Esto pasa en IE cuando se ocupa la forma incorrecta da un error unknow en la llamada del getelementbyid.innerHTML

he encontrado varios de estos errores.
  #11 (permalink)  
Antiguo 29/10/2006, 08:16
 
Fecha de Ingreso: diciembre-2003
Mensajes: 222
Antigüedad: 20 años, 11 meses
Puntos: 2
Aun no he solucionado este problema del todo, pero va en camino. Os dejo lo que he encontrado por ahora...

En un principio el fallo radica en que no se pueden hacer peticiones entre servidores de distinto dominio por cuestinoes de seguridad. Esto tiene dos soluciones la mala dado que requiere una interactuacion por parte del usuario final:

solo tendría que ir al apartado Opciones de Internet -> Seguridad -> Nivel Personalizado y activar la casilla Tener acceso a origen de datos entre dominios.

Y la buena que seria montar un proxy en nuestro servidor, para que la consulta no salga de aqui.

Teneis toda la info sobre esto en:

yahoo.com/javascript/howto-proxy.html

  #12 (permalink)  
Antiguo 29/10/2006, 13:22
 
Fecha de Ingreso: diciembre-2003
Mensajes: 222
Antigüedad: 20 años, 11 meses
Puntos: 2
Ups no pegue bien la url...

http://developer.yahoo.com/javascript/howto-proxy.html

;)
  #13 (permalink)  
Antiguo 30/10/2006, 05:50
 
Fecha de Ingreso: diciembre-2003
Mensajes: 222
Antigüedad: 20 años, 11 meses
Puntos: 2
Ya probe con esta solucion, pero nohay manera, dado que en el servidor web del cliente es necesario que se pueda ejecutar php... y la mayoria de los clientes no pueden hacerlo... He encontrado otra posible solucion , pero no se como implementarla...

Encontre otro articulo en http://Developers.yahoo

http://www.theurer.cc/blog/2005/12/1...mp-your-proxy/

En el cual habla de hacerlo con Jason y javascript... lo cual haria como de proxy...

Pero no e entero de como adaptarlo y que funcione correctamente... Porque no aprenderia Javascript hace años...
  #14 (permalink)  
Antiguo 31/10/2006, 11:18
Avatar de ikhuerta  
Fecha de Ingreso: octubre-2006
Mensajes: 104
Antigüedad: 18 años, 1 mes
Puntos: 0
Buenas paranoid...

No estoy teniendo demasiado tiempo libre estos dias y no he podido contestarte...

veo que os resistis a simplemente cargar con php la pagina que toca.

Bueno en ese caso quizas la solucion pase por no usar ajax sino DHTML con iframes (vamos asincronia a la antigua)

Creo que un codigo parecido a este debería valerte:

Código:
function LoadExterno(url,id)
{
	var F=document.createElement("iframe");
	F.src=url;
	F.onload=function {document.getElementById(id).innerHTML=this.innerHTML;	}
}
Lo he escrito sin probarlo asi que puede que no vaya bien a la primera... intentare en casa probarlo yo mismo pero no aseguro nada.
  #15 (permalink)  
Antiguo 31/10/2006, 14:08
Avatar de ikhuerta  
Fecha de Ingreso: octubre-2006
Mensajes: 104
Antigüedad: 18 años, 1 mes
Puntos: 0
Ok,

olvida mi ultimo post...

con iframes tampoco te da permisos si el dominio es distinto al de la pagina padre...

Nada, pero la verdad es que no entiendo porque no haceis una pagina en PHP que se dedique a cargar el HTML de otra externa...

Habeis probado un PHP que por ejemplo se llame cargar_web.php

Código PHP:
<?
$a
=$_REQUEST["URL"];
echo 
file_get_contents($a);
?>
Y luego llamar por ajax a esa web como

cargar_web.php?URL=www.dominioexterno.com

Si no es file_get_contents sera otra funcion pero vamos que la cosa es sencilla...
  #16 (permalink)  
Antiguo 31/10/2006, 20:44
 
Fecha de Ingreso: agosto-2006
Mensajes: 110
Antigüedad: 18 años, 3 meses
Puntos: 1
Eliminado

He eliminado este mensaje

Última edición por vengava; 01/11/2006 a las 07:23 Razón: Fuera de tema
  #17 (permalink)  
Antiguo 01/11/2006, 03:26
Avatar de ikhuerta  
Fecha de Ingreso: octubre-2006
Mensajes: 104
Antigüedad: 18 años, 1 mes
Puntos: 0
Hola vengava...

Solo tengo que decirte que lo normal en un foro es dar soluciones a la gente no intentar que te hagan encargos...
  #18 (permalink)  
Antiguo 01/11/2006, 06:31
 
Fecha de Ingreso: agosto-2006
Mensajes: 110
Antigüedad: 18 años, 3 meses
Puntos: 1
Tienes razón

Tienes razón ikHuerta, lo acabo de eliminar. No había leido todo el post pero ahora al leerlo entiendo que suena fatal después de que la gente aportara lo que pudo y me voy a unir a este post.

Acerca de tu último post antes del mio:

Cita:
Nada, pero la verdad es que no entiendo porque no haceis una pagina en PHP que se dedique a cargar el HTML de otra externa...
Te explico, no lo hace así porque el código AJAX puede estar en un servidor jsp, asp, php o en una página html, con lo cual, podría hacer un file_get_contents o no.
Te cuento como lo hice (no me permiten poner url's) por eso a donde pone servidor2.com hay que añadirle antes hachetetepe_dospuntos_barra_barra:

En servidor1.com/peticion.php estaría este código:

Código HTML:
<html>
   <head>
      <title></title>
  </head>
   <body>
      <div id="resultado"></div>
	<script type="text/javascript" src="servidor2.com/respuesta.php?datoEnviado=estedato"></script>
   </body>
</html> 
En servidor2.com/repuesta.php se genera una salida text/javascript que se ejecuta en el navegador como si estuviera escrita con <script></script>
Define una función y luego la llama con el parámetro recibido.

PHP en servidor2.com/respuesta.php

Código PHP:
<?
    header
("Content-type: text/javascript");
    echo 
"
    var recibirDatos = function (datos){
        document.getElementById('resultado').innerHTML = datos;
    }

    recibirDatos(\""
$_GET['datoEnviado'] ."\");
    "
;
?>
No es AJAX (como dijisteis, AJAX no lo permite) pero para lo que él quería funciona.
Espero que le sirva a alguien.
Un saludo

Última edición por vengava; 01/11/2006 a las 10:44
  #19 (permalink)  
Antiguo 15/11/2006, 07:53
Avatar de ikhuerta  
Fecha de Ingreso: octubre-2006
Mensajes: 104
Antigüedad: 18 años, 1 mes
Puntos: 0
Un solucion inteligente si señor.

Aportar que puede incluso usarse de la misma forma que se usa ajax.

En este mismo foro me dieron la forma.

Se trata de hacer una funcion que lo que haga es crear en la cabecera del documento la etiqueta script que cargue todo lo que nos interesa.

De hecho podemos hacer una pagina en json y cargarla por este metodo de forma que se ejecute como si fuese ajax.

te dejo unas pistas por si no lo conocias.

Código:
function aji(url){
var lib=document.createElement('script'); 
lib.src=url; 
lib.type="text/javascript"; 
document.getElementsByTagName("HTML")[0].getElementsByTagName("HEAD")[0].appendChild(lib); 
}
  #20 (permalink)  
Antiguo 15/11/2006, 10:43
 
Fecha de Ingreso: agosto-2006
Mensajes: 110
Antigüedad: 18 años, 3 meses
Puntos: 1
Ahora que lo pienso, lo podía haber hecho más sencillo:

test.php

Código HTML:
<div id="resultado">cargando...</div>
<script type="text/javascript" src="test2.php?id=1"></script> 
test2.php

Código PHP:
<?
    header
("Content-type: text/javascript");
    echo 
"document.getElementById('resultado').innerHTML = \"$_GET[id]\";";
?>
  #21 (permalink)  
Antiguo 18/01/2007, 15:05
 
Fecha de Ingreso: enero-2003
Ubicación: La Florida, Stgo
Mensajes: 40
Antigüedad: 21 años, 10 meses
Puntos: 0
Re: Problema al cargar codigo AJAX

Tenía un problema similar, pero leyendo el post recordé algo que ví en el código del home de Gmail, y es que ahí, cuando escribes tu nombre de usuario, se carga de una "imagen invisible" que lleva unos parámetros. Eso me dió la sgte idea, por ejemplo con un prompt
Código:
var text = prompt('Nombre','');
img = document.getElementById('imgInvisible');
img.src = "http://www.otrositio.cl/foo.php?nombre?"+text;
Así, no dependes del objeto HttpRequest, y puedes mandar lo que necesites al servidor


Salu2
__________________
:neurotico:neurotico:neurotico:neurotico:neurotico :neurotico:neurotico:neurotico:neurotico:neurotico :neurotico:neurotico:neurotico:neurotico:neurotico
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 03:05.