2009-11-04 4 views
1

Dans mon application php, j'ai plusieurs modèles qui se combinent pour former une seule page. donc dire votre sur le propos de nous page, le modèle ressemblerait à cecidocument.ready est appelé plusieurs fois

<?php 
    $this->render("header.php"); 
?> 

my about us page 

<?php 
    $this->render("footer.php"); 
?> 

qui est juste une façon élégante de faire un include(). Cependant, header.php a du javascript qui s'exécute sur document.ready via le framework jquery, tout comme la page qui nécessite l'en-tête. de sorte que vous avez quelque chose comme ça

<?php 
    $this->render("header.php"); // has its own $(document).ready 
?> 
<script type="text/javascript"> 
    $(document).ready(function(){ 
      console.log("test"); 
    }); 
</script> 
my about us page 

<?php 
    $this->render("footer.php"); 
?> 

Le bug que je fais l'expérience est que document.ready est s'appelé pour chaque document.ready sur la page. dans la console de cas ci-dessus montre

Test

Test

Si je commente le rendu de header.php, le document.ready est appelé juste une fois comme je veux. En plus d'utiliser un sémaphore, est-ce une meilleure façon d'éviter cela? J'ai essayé de mettre en mémoire tampon la sortie, mais cela ne semble pas fonctionner.

Edit: sortie finale ajoutée par demande

<script type="text/javascript"> 
    $(document).ready(function(){ 
      // do some javascript like highlighting 
      // form elements with specific classes 
    }); 
</script> 
    display header here 

<script type="text/javascript"> 
    $(document).ready(function(){ 
      console.log("test"); 
    }); 
</script> 
my about us page 

display footer 
+1

Quelle est la sortie HTML de cela? Le PHP est presque certainement hors de propos? –

+0

Je ne suis pas de votre question si vous voulez changer quelque chose dans le php ou dans le javascript. –

+1

Si vous le mettez dans le fichier d'en-tête et que le corps va être appelé deux fois n'est-ce pas? –

Répondre

1

J'ai juste essayé l'exécution de votre sortie finale localement et un seul message « test » apparaît dans la console, comme prévu.

Incluez-vous d'autres bibliothèques JS? Il se peut qu'il y ait du code dans le JS que vous avez édité qui cause cela.

+0

Dans l'un des plugins, l'auteur faisait un $ (orm) .wrapInner ('

'); qui envelopperait toute balise de script également dans la div. Ainsi, la page se chargerait et tout le document.ready-s fonctionnerait, ce qui à son tour lancerait ce plugin. Maintenant, ce plugin reconstruit de petites sections de la dom (en faisant le wrapInner), ce qui a déclenché la deuxième exécution du javascript dans cette section reconstruite. Après avoir réécrit comment ils ont fait le wrapInner, tout est réparé. – Scott

1

Je mets ensemble ce code de démonstration, mais wasn incapable de reproduire le problème ... espérons qu'il vous aide ...

<html> 
<head> 
    <title>test</title> 
</head> 
<body> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function(){ 
      // do some javascript like highlighting 
      // form elements with specific classes 
     $('.some-element').css('background', '#eec'); 
    }); 
</script> 

display header here 

<script type="text/javascript"> 
    $(document).ready(function() { 
      $('body').append("<p>test</p>"); 
    }); 
</script> 

<p class='some-element'> 
my about us page 
display footer 
</p> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
</body> 
</html> 
Questions connexes