2009-12-09 3 views
3

На нашем сайте www.foo.com мы хотим скачать и использовать http://feeds.foo.com/feed.xml с Javascript. Мы, очевидно, использовать Access-Control но для браузеров, которые не поддерживают его, мы рассматриваем следующие как запасной вариант:Загрузка кросс-домена XML с помощью Javascript с использованием гибридной концепции iframe-proxy/xsl/jsonp?

На www.foo.com мы устанавливаем document.domain, обеспечивают функцию обратного вызова и загрузить канал в (скрытый) iframe:

document.domain = 'foo.com'; 
function receive_data(data) { 
// process data 
}; 

var proxy = document.createElement('iframe'); 
proxy.src = 'http://feeds.foo.com/feed.xml'; 
document.body.appendChild(proxy); 

на feeds.foo.com добавьте XSL в feed.xml и использовать его для преобразования исходного материала в HTML-документ, который также устанавливает document.domain и вызывает функцию обратного вызова в его родителя с данными подачи, как JSON:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:template match="ROOT"> 
    <html><body> 
    <script type="text/javascript"> 
    document.domain = 'foo.com'; 
    parent.receive_data([<xsl:apply-templates/>]); 
    </script> 
    </body></html> 
</xsl:template> 
<!-- templates that transform data into json objects go here --> 
</xsl:stylesheet> 

Есть ли лучший способ загрузки XML из feeds.foo.com и каковы последствия этого IFrame-прокси/XSLT/JSONP трюк? (..и в каких случаях это не получится?)


Замечания

  • Это не работает в Safari & Chrome, но так как поддержка Access-Control это нормально.
  • Мы хотим, чтобы мало или нет изменений в feeds.foo.com
  • Мы отдаем себе отчет (но не заинтересован в) на стороне сервера прокси-решения
  • обновление:wrote about it

ответ

1

Если у вас есть контроль над обоего доменами, вы можете попробовать междоменные сценарии библиотеку как EasyXDM, который оборачивает кросс-браузерные причуды и предоставляет простой в использовании API для связи в сценарии клиента между разными доменами, используя наилучший доступный механизм для этого браузера (например, postMessage, если имеется, другие механизмы, если нет).

Предостережение: вам необходимо иметь контроль над обоими доменами, чтобы заставить его работать (где «управление» означает, что вы можете разместить статические файлы на обоих из них). Но вам не нужны изменения кода на стороне сервера.

Еще одна оговорка: здесь есть последствия для безопасности - убедитесь, что вы доверяете скрипту другого домена!

+0

, так что вы знаете, с easyXDM нет необходимости доверять другой стороне - эти два документа обмениваются только потоками. –

2

Вы можете использовать Yahoo Apis (YQL) .. Просто указать URL-адрес, формат и обратный вызов

Это своего рода серверного решения, но не на сервере :)

+0

Я уже использовал YQL раньше и понравился (за исключением некоторых интересных явлений кеширования, которые вы не можете контролировать).К сожалению, мы действительно не хотим вводить эту зависимость по нескольким причинам. –