2010-11-16 30 views
0

J'ai une application en cours d'exécution dans une application HTA (MSFT HTML Application) qui utilise le même fichier de script encore et encore à travers les cadres; Comme cela frappe 9 dans des endroits et que l'application est installée dans divers serveurs avec la mise en cache mis à expiration immédiate, je suis en train de sculpter une sorte de performance dans cette boule de boue.Cross Frame Script Réutilisation

Y at-il une 'bonne' façon de charger le fichier principal de script dans le cadre supérieur Executing puis dans les cadres c.-à-

--- TOP WINDOW ----

var MainScript = function(){ return (function(){ all current functions etc here })(); }; 

- - SUB Cadres ----

var FrameScript = top.MainScript; 
FrameScript(); 

et comment cela serait-il affecté par la portée de la fenêtre (serait-il garder la portée de fenêtre supérieure ou être portée du cadre fenêtre)

Répondre

0

La méthode la plus simple semble être de donner un ID à la sous-trame, puis de la remplir dynamiquement avec le script chargé dans le cadre principal (en utilisant eval pour lancer le js);

-à-dire

|>Parent (alias Cadre supérieur)

<script>top.windows = [];</script> 
<script id="MyScript"> 
    var test = function(){ top.windows.push(window); } 
</script> 

| >> Les charges sous-châssis SubSubFrame dans un IFrame

| >>>SubSubFrame

<script id="SF1"> 
document.getElementById("SF1").innerHTML = eval(top.window.document.getElementById("MyScript").innerHTML); 
test(); 
</script> 

This Works jusqu'à et au-delà de 8 cadres en profondeur dans un domaine de confiance (dans un .hta vous définissez l'application = true sur les cadres pour cela)

je top.windows [] pour que je puisse vérifier la portée. (tapez-le dans console.log (top.windows) dans firebug)

Nausying et deep; Google fait quelque chose de similaire à retarder le chargement/l'exécution de JS.

+0

Cette approche supprime le allers-retours répétés sur le serveur, mais à plusieurs reprises 'eval's même javascript. Il serait plus efficace de charger la bibliothèque js dans la fenêtre de niveau supérieur et d'appeler ses fonctions directement (ou d'utiliser 'apply',' call', ou 'bind' si vous en avez besoin dans le contexte de la fenêtre frame objet). – Doin

+0

@Doin comme il y a 3 ans; et comme toute personne mettant en œuvre un système cela mérite mal de faire faillite. Je suis enclin à ne pas m'en soucier: D Par souci de clarté, chaque sous-trame était personnalisable (au niveau xml) pour différents flux de travail, etc. et les scripts devaient s'exécuter dans le contexte de la sous-trame. Il est possible de le faire en appelant la lib parente et en passant la fenêtre comme référence, mais la quantité de shit JS dans ce site a rendu la solution/implémentation plus simple (sans réécrire 50K + lignes de mauvais JS) –