Modern browsers don’t allow content to be fetched using HTTP on a page delivered over HTTPS.
You get errors like:
IE: SEC7111: HTTPS security is compromised by http://xxx Safari/Chrome: The page at https://xxx ran insecure content from http://xxx Firefox: Blocked loading mixed active content "http://xxx"
In some cases the source of the data you want to load over JSON-P isn’t available over HTTPS. YUI has a module that’s advertised for cross-domain loading (http://yuilibrary.com/yui/docs/io/#cross-domain-transactions), but it can also be used to work around the SSL problem.
This example uses a customized YUI from http://yuilibrary.com/yui/configurator/ with only the io-xdr module. The io.swf should be obtained from the main YUI download.
<!DOCTYPE html> <html> <body> <script type="text/javascript" src="yui-io-xdr.min.js"></script> <script type="text/javascript"> YUI().use("io-xdr", function(Y) { // Register for the Flash transport Y.io.transport({ src: 'io.swf', id: 'flash' }); // xdrReady is fired when the Flash object is ready, I couldn't find a callback for when it fails to load (eg, on mobile devices). Probably best to include some SWFObject-style Flash detection first. Y.on('io:xdrReady', function(){ // When ready, the JSON-P endpoint is requested Y.io("http://www.example.com/service/jsonp?callback=cb", { xdr: { use: 'flash' }, timeout: 1000, arguments: { }, // There are other callbacks, but these are the most useful on: { // This is a JSON-P response, it should be evaluated. success: function(id, o, args) { eval(o.responseText); }, failure: function(id, o, args) { console.log('failed to load content'); } } }); }, Y); // This is the callback function name requested from the endpoint. function cb(d) { console.log(d); } }); </script> </body> </html>