2009-12-09 12 views
3

Sur notre site www.foo.com nous voulons télécharger et utiliser http://feeds.foo.com/feed.xml avec Javascript. Nous allons évidemment utiliser Access-Control mais pour les navigateurs qui ne supportent pas que nous considérons ce qui suit comme une solution de repli:Chargement de XML inter-domaines avec Javascript en utilisant un concept hybride iframe-proxy/xsl/jsonp?

Sur www.foo.com, nous avons mis en document.domain, fournir une fonction de rappel et charger l'alimentation dans un (caché) 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); 

sur feeds.foo.com, ajoutez xsl à feed.xml et l'utiliser pour transformer l'alimentation dans un document html qui définit également document.domain et appelle la fonction de rappel dans son parent avec les données d'alimentation comme 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> 

Y at-il une meilleure façon de charger XML à partir feeds.foo.com et quelles sont les ramifications de cette astuce iframe-proxy/xslt/jsonp? (..et dans ce cas qu'elle ne satisfera pas?)


Remarques

  • Cela ne fonctionne pas dans Safari & Chrome, mais puisque les deux support Access-Control il est très bien.
  • Nous voulons peu ou pas de changement à feeds.foo.com
  • Nous sommes conscients (mais pas intéressé par) solutions proxy côté serveur
  • mise à jour:wrote about it

Répondre

1

Si vous avez le contrôle sur les deux domaines, vous pouvez essayer une bibliothèque de scripts inter-domaines comme EasyXDM, qui enveloppe bizarreries de navigateur croisé et fournit une API facile à utiliser pour communiquer dans le script de client entre différents domaines en utilisant le meilleur mécanisme disponible pour ce navigateur (par exemple postMessage si disponible, d'autres mécanismes sinon). Avertissement: vous devez avoir le contrôle sur les deux domaines afin de le faire fonctionner (où "contrôle" signifie que vous pouvez placer des fichiers statiques sur les deux). Mais vous n'avez besoin d'aucun changement de code côté serveur. Une autre mise en garde: il y a des implications de sécurité ici - assurez-vous de faire confiance au script de l'autre domaine!

+0

juste pour que vous sachiez, avec easyXDM il n'y a pas besoin de faire confiance à l'autre partie - les deux documents communiquent uniquement via des chaînes. –

2

Vous pouvez utiliser apis yahoo (YQL) .. Il suffit de spécifier l'URL, le format et le rappel

Il est une sorte de solution côté serveur, mais pas sur votre serveur :)

+0

J'ai déjà utilisé YQL auparavant et je l'ai aimé (en dehors de certains phénomènes de cache intéressants que vous ne pouvez pas contrôler).Malheureusement, nous ne voulons pas vraiment introduire cette dépendance pour plusieurs raisons. –