¿Cómo realizar una solicitud JSONP desde Javascript sin JQuery?

Resuelto Dave asked hace 13 años • 0 respuestas

¿Puedo realizar una solicitud JSONP entre dominios en JavaScript sin usar jQuery u otra biblioteca externa? Me gustaría usar JavaScript y luego analizar los datos y convertirlos en un objeto para poder usarlos. ¿Tengo que usar una biblioteca externa? Si no, ¿cómo puedo hacerlo?

Dave avatar May 26 '11 08:05 Dave
Aceptado
function foo(data)
{
    // do stuff with JSON
}

var script = document.createElement('script');
script.src = '//example.com/path/to/jsonp?callback=foo'

document.getElementsByTagName('head')[0].appendChild(script);
// or document.head.appendChild(script) in modern browsers
Matt Ball avatar May 26 '2011 01:05 Matt Ball

Ejemplo ligero (con soporte para onSuccess y onTimeout). Debe pasar el nombre de la devolución de llamada dentro de la URL si lo necesita.

var $jsonp = (function(){
  var that = {};

  that.send = function(src, options) {
    var callback_name = options.callbackName || 'callback',
      on_success = options.onSuccess || function(){},
      on_timeout = options.onTimeout || function(){},
      timeout = options.timeout || 10; // sec

    var timeout_trigger = window.setTimeout(function(){
      window[callback_name] = function(){};
      on_timeout();
    }, timeout * 1000);

    window[callback_name] = function(data){
      window.clearTimeout(timeout_trigger);
      on_success(data);
    }

    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.async = true;
    script.src = src;

    document.getElementsByTagName('head')[0].appendChild(script);
  }

  return that;
})();

Uso de muestra:

$jsonp.send('some_url?callback=handleStuff', {
    callbackName: 'handleStuff',
    onSuccess: function(json){
        console.log('success!', json);
    },
    onTimeout: function(){
        console.log('timeout!');
    },
    timeout: 5
});

En GitHub: https://github.com/sobstel/jsonp.js/blob/master/jsonp.js

sobstel avatar Oct 24 '2012 08:10 sobstel