Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
x-domain using YQL
// callback is optional, since jQuery has promises
function getFile(theURL, type, callback)
{
/*
* Original jQuery.ajax mid - CROSS DOMAIN AJAX
* @author James Padolsey (http://james.padolsey.com)
* @updated 12-JAN-10
* @info http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/
* source: https://raw.github.com/padolsey/jquery.fn/master/cross-domain-ajax/jquery.xdomainajax.js
*
* This version adds a fix for correctly handling format:xml
*/
jQuery.ajax = (function(_ajax)
{
var protocol = location.protocol,
hostname = location.hostname,
exRegex = RegExp(protocol + '//' + hostname),
YQL = 'http' + (/^https/.test(protocol)?'s':'') + '://query.yahooapis.com/v1/public/yql?callback=?',
query = 'select * from html where url="{URL}" and xpath="*"';
function isExternal(url)
{
return !exRegex.test(url) && /:\/\//.test(url);
}
return function(o)
{
var url = o.url;
if (o.dataType == 'xml') // @rickdog - fix for XML
query = 'select * from xml where url="{URL}"'; // XML
if ( /get/i.test(o.type) && !/json/i.test(o.dataType) && isExternal(url) )
{
// Manipulate options so that JSONP-x request is made to YQL
o.url = YQL;
o.dataType = 'json';
o.data = {
q: query.replace('{URL}', url + (o.data ? (/\?/.test(url) ? '&' : '?') + jQuery.param(o.data) : '')),
format: 'xml'
};
// Since it's a JSONP request
// complete === success
if (!o.success && o.complete) {
o.success = o.complete;
delete o.complete;
}
o.success = (function(_success)
{
return function(data)
{
if (_success) {
// Fake XHR callback.
_success.call(this, {
// YQL screws with <script>s, Get rid of them
responseText: (data.results[0] || '').replace(/<script[^>]+?\/>|<script(.|\s)*?\/script>/gi, '')
}, 'success');
}
};
})(o.success);
}
return _ajax.apply(this, arguments); // not special, use base Jquery ajax
};
})(jQuery.ajax);
return $.ajax({
url: theURL,
type: 'GET',
dataType: type,
success: function(res) {
// var text = res.responseText;
// .. then you can manipulate your text as you wish
callback ? callback(res) : undefined;
}
})
};
// for XML, results are in response.responseText
getFile("http://feeds.feedburner.com/leaverou", "xml",
function(response)
{
console.log(response.responseText);
}
)
// for HTML, results are in response
getFile("http://lea.verou.me/2016/09/autoprefixing-with-css-variables/", "html",
function(response)
{
console.log(response);
}
);
// using promises
getFile("http://feeds.feedburner.com/leaverou", "xml")
.success(function(response, statusText, xhrObj) {
console.log(response, statusText, xhrObj);
if (response.results.length == 1)
{
console.log(response.results[0]);
}
})
.error(function(xhrObj, textStatus, err) {
console.log("error", xhrObj, textStatus, err);
});
// test bad url
getFile("xhttp://xxxxx.xxxxxxx.com/xxxxx", "xml")
.success(function(response, statusText, xhrObj) {
console.log(response, statusText, xhrObj);
if (response.results.length == 1)
{
console.log(response.results[0]);
}
})
.error(function(xhrObj, textStatus, err) {
console.log("error", xhrObj, textStatus, err);
});
@bg17aw
Copy link

bg17aw commented Oct 16, 2016

Line 67, return $.ajax({

You used jQuery exclusively, except there. Should change $ to jQuery ?

@PrasadBapatla
Copy link

PrasadBapatla commented Feb 16, 2017

// using promises example comes back with getFile(...).sucess is not a function

@damooch
Copy link

damooch commented Apr 24, 2017

The promises should be .then() for .success() and .catch() for .error()

@blackflood
Copy link

blackflood commented Oct 14, 2017

The html type is not retrieving data...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment