2010-11-15 21 views
0

MISE À JOUR: Le service principal était alimenté par un proxy du service Web ASP.Net AJAX.Création d'un rappel JavaScript dans un iframe

1) La page principale a deux objets globaux, un pour les connexions dorsales (Svc) et un autre pour la gestion du DOM (Main). Il charge également dynamiquement les documents dans un iframe.

2) Ces iframes ont besoin d'accéder aux services fournis par Svc, et fournissent également une fonction de rappel.

3) Le problème - en passant une fonction créée dans l'iframe à l'image parent, elle est traitée comme un objet et non une fonction et ne peut pas être invoquée.

Quelqu'un peut-il fournir une meilleure solution que ce que j'ai actuellement dans le iframe:

var Main = parent.Main, 
    Svc = parent.Svc; 

Svc.method(data, Main.createCallback(
    function(response) {} 
)); 

et dans le cadre parent:

Main.createCallback = function(func) { 
    return function() { 
     func.apply(func, arguments); 
    } 
} 
+0

Je suis assez sûr que les fonctions sont des objets ... Je n'ai eu aucun problème avant d'utiliser 'parent' de l'iframe. –

+0

Ouais en utilisant le parent est bien, c'est juste essayer de passer une fonction comme un rappel à l'image parent ne fonctionne pas. –

+0

Je ne suis pas entièrement sûr de ce que le code est censé faire. Je pense aussi que le code dans le cadre parent ne fonctionne pas parce que func n'est pas dans la portée de la fonction retournée (en fait cela pourrait être la cause du problème). –

Répondre

-1

Le problème provient des proxys de service Web ASP.Net AJAX, qui ne semblent pas prendre en charge l'appel du service Web à partir d'un iframe avec une fonction de rappel en ligne.

0

J'utilise iframes modularisation mon application aussi.
Ils sont une sorte d'inclusion de tous les CSS, HTML et JS pour un module.

Mes premières tentatives ont été de retourner une fonction aussi, mais j'ai trouvé cela assez difficile pour partager des étendues. Maintenant, je fais directement une référence à l'objet parent principal dans l'iframe.

par exemple:

var Svc = parent.Svc, JSON = parent.JSON, $ = parent.$; 
Svc.module1 = { 
    method1:function(arg){ 
    ... 
    }, 
    ... 
} 

Les références JSON global var et jQuery sont ici pour les disposer à l'intérieur des méthodes.

1

Si vous remplacez la fonction de l'iFrame par le principal, la portée principale sera alors utilisée. Le problème inverse peut être vu here, dans votre cas, vous remplacez simplement la fonction du cadre lui-même à savoir:

document.getElementById('yourFrameID').contentWindow.targetFunctionInFrame = targetFunctionInMain;

Bonus: si vous pouvez modifier le code du iFrame, je suggère à:

Dans le cadre:

  • font fonction d'espace réservé callbackParent(){}
  • ajouter un appel à cette fonction dans votre code iframe, de sorte que vous avez juste à remplacer le callbackParent de votre principal.

Dans la principale:

  • font la fonction qui doit être invoquée function doStuff(){}
  • remplacer la fonction comme décrit ci-dessus document.getElementById('yourFrameID').contentWindow.callBackParent = doStuff();
0

Mon invité est que Svc.method fait quelques vérifie si le rappel a des critères avant de l'appeler. Ce critère peut être que la fonction de rappel doit être créée par le même framework (ici ASP.Net). Vous devez trouver ce que ce critère est. Si "Main.createCallback" fonctionne, c'est parce qu'il répond à ces critères.