2009-10-24 7 views
3

actuellement je compte sur un script proxy pour gérer ce problème de politique d'origine unique. il est lent et crée des frais généraux. Sans oublier que javascript n'est pas rendu.alternative au javascript inter-domaines?

Y at-il une alternative de travail là-bas?

Répondre

1

Oh mon cher, je pense que la solution que vous cherchez est avec IFRAMEs. Cependant, l'approche iframe est à la fois une entreprise mentale et technique. Je vous suggère de commencer avec ce guide:

Cross-Domain Communication with IFrames

L'approche alternative est d'obtenir des données d'une autre balises de script serveur en utilisant de manière asynchrone et JSON:

<script src="http://remotesite.com/path/to/script/blah.js"></script> 

Vous pouvez créer un nouvel élément de balise SCRIPT pour passer et charger des données et ajouter à DOM ou insérer le balisage dans un élément innerHTML.

Je suis sûr que vous pouvez trouver quelques exemples détaillés et les moyens de mettre en œuvre, mais une chose que vous devriez garder une trace de la nouvelle méthode SCRIPT est d'en ajouter autant qu'il DOM. Cela pourrait aider et fournir un point de départ pour vous:

function require (url, callback) { 
    if (!isScriptLoaded(url)) { 
     document.write('<script src="' + url + '" type="text/javascript" charset="utf-8"><\/script>'); 

     if (callback) { 
      callback(); 
     } 
    } 
} 

function isScriptLoaded(src) { 
    var scriptsLoaded = {}; 
    var scriptTags = document.getElementsByTagName("script"); 

    for (var i = 0, script; script = scriptTags[i]; i++) { 
     if (script.src) { 
      scriptsLoaded[script.src] = 1; 
     } 
    }; 

    if (scriptsLoaded[src]) { 
     return true; 
    } 

    return false; 
} 

De toute façon - plus de chance (non testé, mais devrait travail!).

+0

oui. iframe charge une page externe, et certains javascript doivent être exécutés dessus. Toutefois, en raison de la politique originale unique, cela n'est pas autorisé. Par conséquent, en s'appuyant sur proxy qui n'est pas optimal ou efficace. – dooli

+0

Malheureusement sans précision, je ne peux pas répondre correctement à cela.Dans mon esprit, ce n'est pas un problème mais ma solution de travail dépend de votre configuration de backend, etc. Pour suivre votre commentaire: - iframe charge la page externe - l'URL iframe peut inclure des paramètres pour indiquer le rappel JS et les arguments - local iframe JS interprète cela et continue Évidemment, cela ne fonctionnera pas si vous parlez de JS dynamique ou de beaucoup de valeurs étant passées ... J'ai l'impression que cela ne vous aide pas car vous avez plus profond besoins mais cela pourrait aider les autres. – donohoe

5

Si vous pouvez fournir un nom de rappel en tant que paramètre au service fournissant le code JavaScript en question, vous pouvez ajouter une balise de script à votre document, avec un attribut src pointant vers l'appel de service. Sinon, vous n'avez pas de chance.

+0

Ceci est communément appelé JSONP - ou JSON avec remplissage - encore plus: Notation d'objet JavaScript avec remplissage. :) –

+0

Notez que dans Internet Explorer, les scripts volumineux peuvent provoquer des fuites de mémoire, une utilisation de la mémoire importante qui ne libère pas après avoir supprimé la balise de script. Ce n'est pas un problème majeur si vous faites seulement 1 ou 2 appels sur chaque page, mais si vous attendez une page pour rester ouverte et faire des appels sur de longues périodes, attendez-vous à des plaintes d'utilisateurs avec des ordinateurs extrêmement ralentis :) –

1

JSON-P est plutôt idéal pour ce genre de choses. Si vous utilisez jQuery, ou les bibliothèques JavaScript similaires, votre travail est encore plus facile:

http://docs.jquery.com/Ajax/jQuery.getJSON#urldatacallback

Bien sûr, cela dépendra de ce que vous essayez de faire qui déterminera si l'utilisation JSON- P, iframes cachés, postMessage, proxys Flash, ou toute autre solution exotique.

2

Utilisez un iframe et essayer window.postMessage(message, origin) (il serait parent.postMessage de l'iframe et iframeElement.contentWindow.postMessage de la première page) pour tous les derniers principaux navigateurs (Firefox, IE, Safari, Chrome, etc.) et le changement/sondage window.name pour vieux navigateurs.

1

Si vous contrôlez les deux domaines et que vous vous intéressez uniquement à Firefox 3.5+, vous pouvez utiliser l'objet XMLHttpRequest et définir des autorisations avec Access Control.