Кроссдоменный асинхронный запрос

В одном из своих проектов столкнулся с необходимостью асинхронного кросс доменного запроса. Как известно, jQuery добровольно такие вещи не делает в целях безопасности. Гугл я прошерстил и нашел решение проблемы. Что нам надо:

1. YQL.
2. Небольшая функция на javascript.
3. Сама библиотека jQuery.

1,3 пункты — говорить про них что то не смысла. Надо брать и читать первоисточники. А вот пункт №2…. Какая должна быть функция? Все тот же гугл выдал несколько вариантов (ссылок сейчас привести не могу, так как не сохранились). У меня заработал такой вариант:

// Accepts a url and a callback function to run.
function requestCrossDomain( site, callback ) {

	// If no url was passed, exit.
	if ( !site ) {
		alert('No site was passed.');
		return false;
	}

	// Take the provided url, and add it to a YQL query. Make sure you encode it!
	var yql = 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent('select * from html where url="' + site + '"') + '&format=xml&callback=?';

	// Request that YSQL string, and run a callback function.
	// Pass a defined function to prevent cache-busting.
	$.getJSON( yql, cbFunc );

	function cbFunc(data) {
	// If we have something to work with...
	if ( data.results[0] ) {
		// Strip out all script tags, for security reasons.
		// BE VERY CAREFUL. This helps, but we should do more. 
		data = data.results[0].replace(/]*>[\s\S]*?<\/script>/gi, '');

		// If the user passed a callback, and it
		// is a function, call it, and send through the data var.
		if ( typeof callback === 'function') {
			callback(data);
		}
	}
	// Else, Maybe we requested a site that doesn't exist, and nothing returned.
	else alert('Nothing returned from getJSON.');
	}
}

Размещаем ее в отдельном файле, что бы не потерялась, и назовем как нибуть «кричаще» jquery.crossdomain.js, например.

Как ей воспользоваться?
В рабочем файле подключаем библиотеку jQuery и jquery.crossdomain.js. Дальше вот такой маленький фрагмент:

<p id="crossP"><a id="Link" href="javascript:;">Ссылко с асинхронным кросс доменным запросом</a></p>
	<script type="text/javascript">
	$('#Link').click(function() {
		requestCrossDomain('http://site.ru/file.php?a=1&b=2&c=3', function(results) {
			$('p#cross').html(results);
		});
		// Что бы не осуществлялся переход по ссылке
		return false;
	});
	</script>

Вот и все. Теперь такие запрсы будут работать без проблем.

, , ,

Оставить комментарий

Top ↑ | Main page | Back