Question

Voici ce que j'essaie d'accomplir. J'ai un formulaire qui utilise jQuery pour effectuer un appel AJAX vers un fichier PHP. Le fichier PHP interagit avec une base de données, puis crée le contenu de la page à renvoyer en tant que réponse AJAX. c'est-à-dire que le contenu de cette page est écrit dans une nouvelle fenêtre dans la fonction de réussite de l'appel $. ajax . Dans le cadre du contenu de la page renvoyé par le fichier PHP, j'ai une balise de script HTML simple qui contient un fichier JavaScript. Plus précisément:

<script type="text/javascript" src="pageControl.js"></script>

Ceci n’est pas répercuté dans le php (bien que j’ai essayé de le faire), c’est juste du html. Le pageControl.js se trouve dans le même répertoire que mon fichier php qui génère le contenu.

Quoi que j'essaye, je n'arrive pas à obtenir le fichier pageControl.js inclus ou fonctionnant dans la nouvelle fenêtre résultante créée en réponse au succès de l'appel AJAX. Je me retrouve avec des erreurs telles que " Objet attendu " ou variable non définie, ce qui me porte à croire que le fichier n'est pas inclus. Si je copie le code JavaScript directement dans le fichier PHP, au lieu d’utiliser la balise script avec src, je peux le faire fonctionner.

Y at-il quelque chose qui me manque ici à propos de la résolution de la portée entre le fichier, php et jQuery AJAX? Je vais vouloir inclure les fichiers javascript de cette manière à l’avenir et je voudrais comprendre ce que je fais de mal.

Bonjour à nouveau:

J'ai travaillé sur cette question et toujours pas de chance. Je vais essayer de clarifier ce que je fais, et peut-être que cela me fera penser à quelque chose. J'inclus le code demandé pour clarifier un peu les choses.

Voici la séquence:

  1. L'utilisateur sélectionne certaines options et clique sur le bouton d'envoi du formulaire.
  2. Le clic du bouton de formulaire est géré par un code jQuery qui ressemble à ceci:

    $(document).ready(function() {
      $("#runReport").click(function() {
    
        var report = $("#report").val();
        var program = $("#program").val();
        var session = $("#session").val();
        var students = $("#students").val();
    
        var dataString = 'report=' +report+ 
                         '&program=' +program+
                         '&session=' +session+
                         '&students=' +students;
    
        $.ajax({
            type: "POST",
            url: "process_report_request.php",
            cache: false,
            data: dataString,
            success: function(pageContent) {
                if (pageContent) {
                    $("#result_msg").addClass("successMsg")
                        .text("Report created.");
    
                    var windowFeatures = "width=800,menubar=yes,scrollbars=1,resizable=1,status=yes";
    
                    // open a new report window
                    var reportWindow = window.open("", "newReportWindow", windowFeatures);
    
                    // add the report data itself returned from the AJAX call
                    reportWindow.document.write(pageContent);
                    reportWindow.document.close();
                }
                else {
                    $("#result_msg").addClass("failedMsg")
                        .text("Report creation failed.");
                }
            }
        }); // end ajax call
        // return false from click function to prevent normal submit handling
        return false;
      }); // end click call    
    }); // end ready call
    

Ce code effectue un appel AJAX vers un fichier PHP ( process_report_request.php ) qui crée le contenu de la page pour la nouvelle fenêtre. Ce contenu provient d'une base de données et HTML. Dans le fichier PHP, je souhaite inclure un autre fichier javascript dans la tête, javascript étant utilisé dans la nouvelle fenêtre. J'essaie de l'inclure comme suit

<script src="/folder1/folder2/folder3/pageControl.js" type="text/javascript"></script>

Modification du nom des dossiers de chemin pour protéger les innocents :)

Le fichier pageControl.js est en fait dans le même dossier que le fichier de code jQuery et le fichier php, mais j'essaie le chemin complet pour être sûr. Je peux également accéder au fichier js à l'aide de l'URL du navigateur et l'inclure avec succès dans une page de test html statique à l'aide de la balise script src.

Après que le fichier javascript soit inclus dans le fichier php, j'appelle l'une de ses fonctions comme suit (echo from php):

 echo '<script type="text/javascript" language="javascript">writePageControls();</script>';

Ainsi, une fois que le fichier php a renvoyé tout le contenu de la page à l'appel AJAX, la nouvelle fenêtre est ouverte et le contenu renvoyé est écrit dans le code jQuery ci-dessus.

La ligne writePageControls est l'endroit où j'obtiens l'erreur "Erreur: objet attendu". Quand j’exécute la page. Cependant, puisque le JavaScript fonctionne correctement dans la page HTML statique et lorsqu’il est inclus, "inline". dans le fichier PHP, cela m’amène à penser que c’est un problème de chemin.

Encore une fois, peu importe ce que j'essaie, mes appels aux fonctions du fichier pageControls.js ne fonctionnent pas. Si je mets le contenu du fichier pageControl.js dans le fichier php entre les balises de script et que rien ne change, cela fonctionne comme prévu.

Sur la base de ce que certains d'entre vous ont déjà dit, je me demande si la résolution du chemin d'accès à la fenêtre nouvellement ouverte n'est pas correcte. Mais je ne comprends pas pourquoi parce que j'utilise le chemin complet. De plus, pour que les choses soient plus compliquées, ma feuille de style liée fonctionne très bien à partir du fichier PHP.

Mes excuses pour la longueur de cette visite, mais si quelqu'un a le temps de la regarder de plus près, je l'apprécierais grandement. Je suis perplexe. Je suis novice dans ce domaine , alors s'il y a juste

Était-ce utile?

La solution

J'ai également eu des problèmes avec un problème similaire à celui-ci, et c'était un vrai mal de tête. L’approche suivante n’est peut-être pas élégante, mais elle a fonctionné pour moi.

  1. Assurez-vous que votre fichier php ne contient que ce que vous voulez dans votre corps
  2. Ajouter jquery à la tête de fenêtre de manière dynamique
  3. Ajoutez des fichiers de script externes à l'en-tête de fenêtre de manière dynamique
  4. utilisez jQuery html dans le document de la fenêtre pour appeler html () avec le contenu chargé dans le corps afin que les scripts soient évalués.

Par exemple, dans votre succès ajax:

success: function(pageContent) {
        var windowFeatures = "width=800,menubar=yes,scrollbars=1,resizable=1,status=yes";
        var reportWindow = window.open("", "newReportWindow", windowFeatures);

        // boilerplate
        var boilerplate = "<html><head></head><body></body></html>";

        reportWindow.document.write(boilerplate);

        var head = reportWindow.document.getElementsByTagName("head")[0];

        var jquery = reportWindow.document.createElement("script");
        jquery.type = "text/javascript";
        jquery.src = "http://code.jquery.com/jquery-1.7.min.js";
        head.appendChild(jquery);

        var js = reportWindow.document.createElement("script");
        js.type = "text/javascript";
        js.src = "/folder1/folder2/folder3/pageControl.js";
        js.onload= function() {
            reportWindow.$("body").html(pageContent);
        };
        head.appendChild(js);


        reportWindow.document.close();

    }

Bonne chance!

Autres conseils

Il ne cherche probablement pas où vous pensez chercher votre fichier javascript.

Essayez un format relatif au serveur comme celui-ci:

<script src="/some/path/to/pageControl.js"></script>

Si cela ne fonctionne toujours pas, vérifiez que vous pouvez taper l'URL de votre fichier script dans votre navigateur et le télécharger.

Assurez-vous que cela figure dans < tête > ou < corps > de la page HTML. En outre, je vérifierais le chemin du fichier .js. Vous pouvez le faire en collant " pageControl.js " à la racine de votre adresse Web.

Choses à rechercher:

  • Utilisez Firebug (onglet NET) pour vérifier si le fichier js est chargé avec le statut 200 . Vérifiez également dans l’onglet Console les erreurs javascript possibles.
  • Utilisez-vous HTML5 hors connexion . Si vous le faites, il sert peut-être une version en cache qui n'inclut pas votre balise < script > .
  • Affichez le source de la page et assurez-vous qu'il comprend la balise script .
  • Modifiez l'attribut source en chemin absolu: < script src = & http; //www.example.com/js/pageControl.js" type = & text; text / javascript " > < / script >
  • Accédez au site http://www.example.com/js/pageControl.js et assurez-vous qu'il s'affiche correctement.
  • Essayez de placer le < script > juste après le < tête > afin qu'il soit chargé en premier.

C’est tout ce à quoi je pouvais penser.

Vous pouvez charger le script de manière dynamique en créant l'élément, puis en l'ajoutant à l'en-tête ou à un autre élément:

reportWindow.document.write(pageContent);                      
var script = document.createElement('script');
script.src = 'pageControl.js';
script.type = 'text/javascript';
reportWindow.document.getElementsByTagName('head')[0].appendChild(script);
reportWindow.document.close();

Avez-vous essayé d'utiliser le jquery $ ("# target_div"). load (...) Cela exécute également JS dans la sortie ...

Lisez cette documentation pour savoir comment l'utiliser:

http://api.jquery.com/load/

Pour moi, il semble que vous attendiez un script non chargé pour qu'il fonctionne.

Essayez de regarder ici: http://ensure.codeplex.com/ SourceControl / changeset / view / 9070 # 201379

C’est un peu de javascript qui garantit que le script est chargé correctement avant la tentative d’accès. Vous pouvez l’utiliser soit comme chargement paresseux (chargement de fichiers javascript uniquement lorsque cela est nécessaire), soit, si j’interprète votre problème, comme chargement d’un script basé sur le résultat des appels ajax.

Ce qui se passe probablement, c’est que vous faites écho à une chaîne via un rappel ajax, sans insérer d’élément. Les scripts externes nécessitent un deuxième appel GET pour charger leur contenu, ce qui n’est pas le cas. Seul le premier appel a eu lieu. Ainsi, lorsque le premier appel inclut le code en ligne, le DOM n'a pas besoin de faire une requête GET supplémentaire pour extraire le contenu. Si le DOM ne voit pas le script, il ne l'exécutera pas, ce qui signifie qu'il ne s'agit que d'une balise aléatoire.

Il existe un moyen très rapide de le savoir. Dans Chrome (ou Firefox avec le plug-in Firebug installé), vérifiez la console > liste déroulante des scripts pour voir tous les scripts chargés. S'il n'est pas répertorié, il n'est pas chargé et la balise de script que vous voyez dans le balisage est par ailleurs inerte.

Puisqu'il s'agit probablement d'une simple chaîne pour autant que PHP s'en soucie, vous pouvez le créer en tant qu'objet DOM DOM et l'insérer correctement (bien que cela puisse être laborieux). Au lieu de cela, placez-le peut-être à la fin de la page, juste avant les balises de fermeture du corps. (Ceci est la position préférée pour js de toute façon - dernière en bout, après le chargement de tous les autres éléments de la page. et sont disponibles pour le DOM.)

HTH:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top