2009-06-05 8 views
2

j'ai:javascript d'exécution à partir d'un iframe

  1. Un serveur web (serveur 1)
  2. Un serveur d'application en cours d'exécution une bête d'une application web hérité (serveur 2)
  3. Un iframe sur le serveur 1 tirant dans l'application du serveur 2

Mon problème est:

l'application héritée utilise la validation JS sur ses formes. Lorsqu'un utilisateur tente de soumettre un formulaire incomplet, une alerte apparaît pour informer l'utilisateur qu'il s'agit d'un mannequin. Bien sûr, cela échoue lorsque l'application est exécutée à l'intérieur d'un iframe car le serveur 1 et le serveur 2 vivent sur des domaines différents.

J'ai essayé régler les directives suivantes sur le serveur proxy 1:

ProxyPass /legacy_app http://server2.url/legacy_app 
ProxyPassReverse /legacy_app http://server2.url/legacy_app 

Je suis maintenant en mesure de servir l'iframe de http://server1.url/legacy_app, mais je suis toujours incapable d'exécuter javascript à l'intérieur que iframe - je reçois les mêmes erreurs de sécurité/accès que lorsque l'application était exécutée sur un domaine différent.

Y at-il autre chose que je peux essayer?

+0

Quel serveur Web utilisez-vous? –

Répondre

0

Avez-vous essayé d'héberger le script à l'intérieur d'un fichier .js hébergé sur le serveur n ° 1 mais à court de l'iframe (référencé sur le serveur n ° 2)?

Je pense qu'un navigateur est correct pour référencer un site externe, mais ne l'aime pas lorsqu'il est référencé par un site externe.

Je ne l'ai pas essayé moi-même, mais je crois que c'est comme ça que j'ai entendu parler de ce genre de problème. Je sais que c'est la méthode que Google Analytics utilise - vous devez demander le fichier .js à partir des serveurs de Google, mais une fois qu'il est là, il a accès au navigateur.

1

Comment l'application héritée vérifie-t-elle si les cases sont remplies? Simple javascript? Ajax?

La boîte d'alerte elle-même devrait toujours fonctionner. Je pense que le code pour déterminer si l'alerte doit être émise pourrait être ce qui est cassé.

exécutant le code suivant sur mon serveur apache locale me donne encore la onLoad alerte même si la page est sur un hôte distant:

<html> 
    <body> 
    <div> 
     <iframe src="http://www.crowderassoc.com/javascript/alertbox.html" width="300" height="200"> 
    </div> 
    </body> 
</html> 

Essayez de copier le code ci-dessus à une page sur le serveur 1 et voir si vous obtenez la boîte d'alerte de ce site distant dans l'iframe.

0

Joe, je pense que vous avez raison. Un test rapide avec d'autres serveurs montre que je peux déclencher assez facilement des alertes à partir de scripts hébergés à distance.

Le serveur hérité est celui du client et nous n'y avons pas facilement accès, mais en jetant un coup d'œil à leur JS, il semble qu'ils effectuent une sorte de détection inter-sites/inter-sites.

0

J'ai eu cette situation dans le passé où j'essayais de créer une application autour d'une application préexistante fortement scriptée sur un serveur distant, et l'application fonctionnerait bien si elle était ouverte dans sa propre fenêtre, mais si j'essayais de le charger dans un cadre, il se casserait.Ce que j'ai fini par faire pour ce projet était d'ouvrir l'application locale dans une fenêtre pop-up d'une largeur de 495px, de charger l'application externe dans la fenêtre principale (déjà existante), de redimensionner la fenêtre principale de l'application externe à l'écran largeur moins 495px, et le positionnement des fenêtres côte à côte sur l'écran. Cela a donné à l'utilisateur final un effet similaire à ce que j'avais essayé de faire avec des cadres, mais ça a marché.

Dans le cas où il aide, voici le code je de mon fichier index.php:

// Manipulating the current window 
window.location.href = 'http://www.someExternalApp.com'; // setting the page location. 
window.name = 'legacyapp'; // setting the window name just the for heck of it. 
moveTo(0,0); // moving it to the top left. 

// Resizing the current window to what I want. 
mainWindowWidth = screen.width - 495; 
mainWindowHeight = screen.height; // Makes the window equal to the height of the users screen. 
resizeTo(mainWindowWidth,mainWindowHeight); 

// function for opening pop-up 
function openWin(){ 
    win2 = window.open(page,'',winoptions); 
    win2.focus(); 
} 

// internal app location (for use in pop-up) 
page = 'someLocalApp.php'; 

// internal app Window Options (for pop-up) 
winoptions = 'width=490,height='+mainWindowHeight+',top=0,left='+mainWindowWidth+'leftscrollbars=1,scrolling=1,scrollbars=1,resizable=1,toolbar=0,location=0,menubar=0,status=0,directories=0'; 

// Opens the local app pop-up 
openWin();