Cita: El error de seguridad me lo da porque accedo desde local hacia un servidor externo...
eso es por la seguiridad que implementa javascript. la política del mismo origen prohibe hacer scripting a dominios que no sea el mismo origen.
Cita: me pierdo un poco en la explicación que das para arreglar el asunto.
veamos. digamos que tienes un archivo en el servidor que genera un jsonp, jsonp.php:
Código:
<?php
if(isset($_POST['callback'])){
$json = json_encode(array('var1' => 'val1', 'var2' => 'val2'));
echo "{$_POST['callback']}('$json');";
}
?>
luego tienes lo siguiente en un script javascript
:
- un callback (una función normal) que parsea el string devuelto por jsonp.php.
- una función que crea el elemento SCRIPT, le asigna como valor al atributo SRC la ruta de jsonp.php junto con el callback, y finalmente lo agrega al documento
Código:
// callback ;
function functionCallback(json){
var parsed = JSON.parse(json);
...
}
// json loader ;
function loadJSONP(url, callback){
var script = document.createElement("script");
script.setAttribute('src', url +"?callback="+ callback);
document.getElementsByTagName('head')[0].appendChild(script);
}
finalmente, para cargar el jsonp harías una invocación a loadJSONP indicando la URL y el nombre del callback, todos en forma de string:
loadJSONP('jsonp.php', 'functionCallback');. el resultado final de la invocación anterior es un elemento como el siguiente:
Código:
<script src="jsonp.php?callback=functionCallback">
functionCallback('{"var1": "val1", "var2": "val2"}');
</script>
éste méotdo funciona porque quien hace la petición de cargar el json es a través del elemento y no directamente javascript. no obstante, debes tener cuidado que el json generado no tenga saltos de líneas porque en javascript un string no puede tener literalmente un salto de línea.