2010-12-02 14 views
0

Je veux charger les fichiers .php via ajax qui exécutent le script ExtJS lors de leur chargement, ce qui à son tour modifie les objets ExtJS existants déjà présents dans le DOM.Pourquoi javascript ne s'exécute-t-il pas dans un fichier .php chargé avec Ext.Ajax.Request?

Cependant, je ne peux même pas exécuter Javascript à partir d'une page en cours de chargement via Ext.Ajax.request. Et aucune erreur n'apparaît dans le panneau Firebug Net. Le code PHP est exécuté, mais pas le Javascript. Lorsque j'appelle la page en cours de chargement dans le navigateur, elle exécute l'amende Javascript.

Comment puis-je exécuter Javascript dans les pages chargées avec Ext.Ajax.request?

Ext.onReady(function(){ 

    var menuItemStart = new Ext.Panel({ 
     id: 'panelStart', 
     title: 'Start', 
     html: 'This is the start menu item.', 
     cls:'menuItem' 
    }); 

    var menuItemApplication = new Ext.Panel({ 
     id: 'panelApplication', 
     title: 'Application', 
     html: 'this is the application page', 
     cls:'menuItem' 
    }); 

    var regionMenu = new Ext.Panel({ 
     region:'west', 
     split:true, 
     width: 210, 
     layout:'accordion', 
     layoutConfig:{ 
      animate:true 
     }, 
     items: [ menuItemStart, menuItemApplication ] 
    }); 

    var regionContent = new Ext.Panel({ 
     id: 'contentArea', 
     region: 'center', 
     padding:'10', 
     autoScroll: true, 
     html: 'this is the content' 
    }); 

    new Ext.Viewport({ 
     layout: 'border', 
     items: [ regionMenu, regionContent ] 
    }); 

    menuItemStart.header.on('click', function() { 
     Ext.Ajax.request({ 
      url: 'content/view_start.php', 
      success: function(objServerResponse) { 
       regionContent.update(objServerResponse.responseText); 
      } 
     }); 
    }); 

    menuItemApplication.header.on('click', function() { 
     Ext.Ajax.request({ 
      url: 'content/view_application.php', 
      success: function(objServerResponse) { 

       regionContent.update(objServerResponse.responseText); 
      } 
     }); 
    }); 
}); 

le fichier qui est en cours de chargement via Ajax:

<script type="text/javascript"> 
    window.onload=function() { 
     alert('from application view'); //is not executed 
    } 

    //Ext.onReady(function(){ 
    // alert('from application view extjs'); //is not executed 
    //} 
</script> 
<?php 
echo 'this is the application view at ' . date('Y-m-d h:i:s'); 
?> 

Répondre

2

Lorsque vous obtenez la réponse ajax l'événement onload sur la fenêtre a déjà été tiré de sorte que la fonction ne sera pas exécutée parce que la L'événement onload ne sera pas renvoyé. Essayez seulement avec l'alerte:

<script type="text/javascript"> 
    alert('from application view'); 
</script> 
<?php 
echo 'this is the application view at ' . date('Y-m-d h:i:s'); 
?> 

MISE À JOUR

n'exécutent pas Browsers scripts injectés de cette façon afin que vous puissiez essayer quelque chose comme:

var scripts, scriptsFinder=/<script[^>]*>([\s\S]+)<\/script>/gi; 
while(scripts=scriptsFinder.exec(responseText)) 
{ 
    eval(scripts[1]); 
} 
+0

c'est comme ça que je l'avais à l'origine mais ça ne s'exécute pas non plus, pas d'erreurs dans le panneau Firebug Net, c'est comme si javascript est simplement ignoré, dois-je utiliser autre chose que responseText? mais responseBody ne fait même pas apparaître le contenu généré depuis PHP –

+0

Essayez de consigner le responseText dans firebug avec console.log et vérifiez si la balise script est présente, car certaines bibliothèques suppriment simplement les balises de script pour des raisons de sécurité – mck89

+0

oui il affiche la balise de script complète , Je le vois aussi dans le panneau net pour l'appel ajax view_application.php dans l'en-tête de réponse, le plein ' ...' est-il –

2

Avez-vous essayé passer true pour le deuxième paramètre à Panel.load (qui se trouve être l'option loadScripts)?

regionContent.update(objServerResponse.responseText, true); 
0

Normalement, lorsque vous appelez la mise à jour avec poste vous faites juste mise à jour (string, true) et il exécutera les scripts contenus dans la chaîne. Cependant, le noyau ext semble manquer de cette fonctionnalité, mais il n'y a pas de documentation pour la méthode de mise à jour (j'ai dû chercher le code réel pour le confirmer.)

Si vous utilisez un EXT normal (comme ext-all) peut simplement ajouter

regionContent.update(objServerResponse.responseText,true); 

comme cela et il devrait évaluer les scripts. Pas de dés pour moi, cependant - ext-all est trop lent mais j'ai besoin d'une fonctionnalité eval. Je dois peut-être pirater EXT.