2011-09-13 4 views
3

Je crée dynamiquement un iframe à utiliser comme un endroit pour faire un appel d'API basé sur un formulaire.

$('<iframe>').attr({ 
    name : "secret_sending_iframe", 
    src : "#", 
    style : "visibility:hidden; width:0px; height:0px;" 
    }).appendTo("#recordingControl"); 

Cela a pour effet secondaire de provoquer le redémarrage de mon $ (document) .ready(). C'est compréhensible car cela me dit que mon iframe est prêt, mais maintenant je dois distinguer le document initial prêt de ce nouveau document prêt. Y a-t-il un moyen de dire que c'est l'iframe qui vient juste de se préparer autre que de tester l'existence négative de l'iframe pour dire que c'est le premier appel à .ready()? BTW - test de $ ("iframe") dans l'appel $ (document) .ready() renvoyé [] auquel je ne m'attendais pas. Donc la meilleure solution pour moi était d'utiliser le window.location.href, voir ci-dessous ...

+1

la création d'un iframe devrait dynamiquement PAS cause que $() soit appelé à nouveau. vous faites autre chose ici –

+0

Suite au commentaire de @ Scott, vous incluez probablement le fichier JS dans la source iframe. –

+0

Ainsi, la balise src iframe est "#", ce que j'ai fait pour éviter de devoir créer et ensuite créer un lien vers une page vide. Je pense que la balise src "#" doit à nouveau recharger la page qui l'entoure. – jottos

Répondre

3

Chaque cadre a son propre contexte javascript séparé et est propre séparé $(document).ready(). Donc, je ne pense pas que vous voyez le même $(document).ready() être appelé plus d'une fois, sauf si vous avez plusieurs appels à $(document).ready() dans le même document. Sinon, chaque fois qu'il serait appelé serait un document différent.

Si vous avez un code identique et que vous avez besoin de savoir lequel est appelé, vous pouvez toujours regarder l'objet window.location pour voir quelle page/cadre vous êtes. Pour comprendre votre situation, je suggère d'ajouter ceci à chacun:

console.log(window.location.href); 

Et, alors vous pouvez séparer ce qui est lequel.

+0

Cela fonctionne bien, comme la deuxième fois autour de l'href a le caractère "#" à la fin car c'est ce que j'ai mis la balise src. (Voir l'exemple en question) – jottos

+0

Cela l'explique. – jfriend00

0

La manière habituelle de traiter ce problème est de définir une variable globale dans votre JS avant $ (document) fonction .ready() et test dans un délai:

var run_doc_ready = 0; 

$(document).ready(function(){ 
    ... 
    if (!run_doc_ready) { 
     ... 
     run_doc_ready = 1; 
    } 
    ... 
}); 
+0

Je ne pense pas que vous ayez besoin de vous protéger si vous n'insérez pas plusieurs appels '.ready()' dans votre propre code. En regardant le code jQuery, il me semble qu'il protège déjà contre le déclenchement de n'importe quel gestionnaire ready() plus d'une fois par document. – jfriend00

+0

@ jfriend00 - l'appel de duplicata vient de l'iframe en chargeant la même page, j'utilise un tag src de "#", voir mon commentaire en haut. – jottos

Questions connexes