Comment pouvoir exécuter un code javascript au travers d'un createRequestObject

WRInaute impliqué
Bonjour,

j'ai un petit soucis avec un code ajax. En effet je souhaite afficher une page .php dans une balise <div>

Cette étape fonctionne parfaitement. La page php s'éxecute mais pas le code js qui est inclus dedans. J'ai beau chercher dans tout les sens, je ne comprends pas pourquoi les images, le texte s'affichent, mais pas le petit code js.

Voici ma page html :

Code:
<html>
<head>

<SCRIPT language="javascript">
var http;

function createRequestObject()
{
    var http;
    if (window.XMLHttpRequest)
    {
        http = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
        http = new ActiveXObject("Microsoft.XMLHTTP");
    }
    return http;
}

    http = createRequestObject();
    http.open('GET', 'templates/layouts/result.php', true);  // page incluse dans le div
    http.onreadystatechange = handleAJAXReturn;
    http.send(null);

function handleAJAXReturn()
{
    if (http.readyState == 4)
    {
        if (http.status == 200)
        {

            document.getElementById('resultat').innerHTML = http.responseText;
        }
    }
}
</SCRIPT>

</head>

<body>

<div id="resultat">
valeur avant l'appel Ajax
</div>

<body>

</html>

result.php le mot test s'affiche mais pas le code js. pourquoi?

Code:
<?php 

echo'
test : 
<SCRIPT language="javascript">
   
       alert(\'texte\')
   
</SCRIPT>';

?>

Je remercie d'avance celui qui pourra m'aider
 
WRInaute impliqué
Merci pour tes liens. J'ai du coup fais quelques modifs dans mon code, j'ai rajouté ces quelques lignes :

Code:
            var mesScripts = document.getElementById("resultat").getElementsByTagName("script");
			
			for (var i=0; i<mesScripts.length; i++) 
				{
					eval(mesScripts[0].text);
 
				}

Fonction complète :

Code:
function handleAJAXReturn()
{
    if (http.readyState == 4)
    {
        if (http.status == 200)
        {

            document.getElementById('resultat').innerHTML = http.responseText;
            var mesScripts = document.getElementById("resultat").getElementsByTagName("script");
			
			for (var i=0; i<mesScripts.length; i++) 
				{
					eval(mesScripts[0].text);
 
				}
        }
    }
}

Du coup j'ai bien le code javascript suivant qui fonctionne :

Code:
<SCRIPT language="javascript">
   
       alert(\'texte\')
   
</SCRIPT>';

Mais pas ceci :

Code:
<script type="text/javascript" src="monlien.js"></script>

Je trouve pas le réponse. J'ai essayé plusieurs solution, mais rien à faire !
 
WRInaute impliqué
Je viens de remplacer

Code:
    http = createRequestObject();
    http.open('GET', 'templates/layouts/result.php', true);  // page incluse dans le div
    http.onreadystatechange = handleAJAXReturn;
    http.send(null);


par

Code:
var http = XMLHttpRequest(),
    doc = document;
http.responseType = 'blob';
    http.open('GET', 'templates/layouts/result.php', true);
http.onload = function () {

    var script = doc.createElement('script'),
        src = URL.createObjectURL(http.response);

    script.src = src;
    doc.body.appendChild(script);
};
http.send();

mais c'est pas mieux, je sais vraiment pas quoi faire
 
WRInaute impliqué
ceci non plus ca ne fonctionne pas :

Code:
function handleAJAXReturn()
{
    if (http.readyState == 4)
    {
        if (http.status == 200)
        {

            document.getElementById('resultat').innerHTML = http.responseText;
            var mesScripts = document.getElementById("resultat").getElementsByTagName("script");
			

		var mesScripts = document.createElement('script');
mesScripts[0].appendChild(mesScripts);

eval();


        }
    }
}
 
WRInaute discret
Normal, il faut que tu donne quelque chose à évaluer à eval :
https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_ ... obaux/eval
Ceci dit eval c'est à fuir comme le diable, trop de risque de sécurité.

La question est pourquoi tu as besoin d'avoir du code javascript en retour ? Tu as besoin de fonctions spécifiques à chaque appel ? Des données ne seraient pas suffisant ?
Et si plutôt que d'attendre une fonction à ajouter dans des balises script, tu enregistrerait un fichier .js avec php et que tu le chargeait dynamiquement.
Avec un truc du genre :
Code:
var js = document.createElement("script");
js.type = "application/javascript";
js.src = file;
document.body.appendChild(js);
 
WRInaute impliqué
Oui en effet ta solution n'est pas mauvaise, le problème c'est que je souhaite charger un script js bien précisément dans une div du fichier result.php. Ton exemple charge dans le body tout simplement.

Result.php

Code:
<?php
<div id="div_js">
<script src... ici ></script>
</div>
?>

J'ai essayé ce bout de code :

Code:
var js = document.createElement("script");
js.type = "application/javascript";
js.src = 'test.js';
document.getElementById('div_js').appendChild(js);

Mais cela ne fonctionne toujours pas. Je n'ai rien qui s'execute dans la div_js
 
WRInaute discret
Je pense que ça ne fonctionne pas parce que c'est pas sa place. Il faudrait vérifier, mais je pense que les navigateurs ne doivent pas recharger des fichiers JS n'importe où.

EDIT : Finalement c'est faux. Tu peux attacher un script n'importe où, ça fonctionne je viens de tester.

Code:
<!DOCTYPE html>
<html lang="MARSIEN">
<head>
	<title>Blop</title>
	<meta charset="utf-8" />
</head>
<body>
<input type="button" value="Alerte BLOP" onclick="jsFileLoad('blop.js');"> 
<input type="button" value="Alerte BURP" onclick="jsFileLoad('burp.js');">
<div id="tictac"></div>
<script type="text/javascript">
function jsFileLoad(aPath){
	var js = document.createElement("script");
	js.type = "application/javascript";
	js.src = aPath;
	document.getElementById('tictac').appendChild(js);
}
</script>
</body>
</html>

blop.js
Code:
alert('blop');

blup.js
Code:
alert('burp');

Bon c'est pour le test, à ne pas reproduire en prod, c'est dégeulasse :mrgreen:
 
WRInaute impliqué
Oui j'avais essayé cela, mais ca ne fonctionne à priori que avec des alert(). Si par exemple ton fichier JS contient "document.write (''un texte ici);", la div tictac n'affiche rien du tout.
 
WRInaute impliqué
On peut pas inclure un fichier js qui contient par exemple document.write('le texte ici');

et l'afficher dans tictac ?

Ca devrait etre possible non ?

Les alert fonctionnent mais pas un simple document.write ...
 
WRInaute impliqué
En faisant ca :

Code:
var scr = document.createElement('script');
scr.src = 'fichier.js'; //contient document.write('le texte ici');
scr.type = 'application/javascript';

document.getElementById('tictac').innerHTML = scr;


Ca m'affiche [object HTMLScriptElement] dans titctac
 
WRInaute discret
C'est normal. Utilise document.getElementById('tictac').innerHTML = 'un texte ici';
Ça fonctionne. Tu connais le bloc ou tu veux écrire au moins ?
 
WRInaute impliqué
Oui ca fonctionne mais je veux absolument inclure un fichier js qui contient des document.write et d'autres fonctions (il s'agit d'un formulaire en réalité)

Est ce que cela te parrait possible ? Je ne souhaite pas inclure simplement du texte.
 
WRInaute discret
Qu'est-ce que document.write fait que innerHTML, ne fait pas :?:

Tu inclus ce que tu veux avec innerHTML.
Code:
document.getElementById('tictac').innerHTML = '<h3>un titre</h3><p>du texte</p><img src="monImage.jpg" /><a href="#">un lien</a>';

Tu peux préparer ton code html dans une variable et l'inclure :
Code:
var h = '<h3>un titre</h3>';
h += '<p>du texte</p>';
h += '<img src="monImage.jpg" />';
h += '<a href="#">un lien</a>';
document.getElementById('tictac').innerHTML = h;
 
WRInaute impliqué
On ne s'est pas compris je pense. Je ne veux pas inclure du texte ou quoi que ce soit, je veux inclure un fichier js dans une div

Ton exemple avec les alert était parfait, sauf que si il ne s'agit pas d'alert() ca ne fonctionne pas. Je veux faire la même chose mais avec un page js comprenant un formulaire, du jquery, des styles... et pas seulement des alert()

Le fichier js est un formulaire fourni par un fournisseur de marque blanche

Il me fourni un code <script src="la page du formulaire.js"></script>

et j'aimerai donc afficher src="la page du formulaire.js" dans la div tictac par exemple.


Si je suis ton exemple, j'aurais très bien pu faire ceci :

document.getElementById('tictac').innerHTML = '<script src="la page du formulaire.js"></script>'; mais cela ne fonctionne pas, du moins cela m'affiche : '; } } }
 
WRInaute impliqué
Si je fais cela :

document.getElementById('tictac').innerHTML = '<iframe src="http://google.fr" name="idFrame" id="idFrame" width="200" height="150"></iframe>'; Ca ne fonctionne pas
 
WRInaute discret
Ah oui d'accord. La blague.
J'ai crée un fichier HTML sans contenu, j'ai juste mis le code dans des balises script et le fichier balance automatiquement des document.write n'importe où. Tu m'étonne que ça marche pas.

Reste plus que la solution eval(); au retour Ajax.

Code:
<!DOCTYPE html>
<html lang="FR">
<head>
	<title>Bof bof</title>
	<meta charset="utf-8" />

</head>
<body>
<div id="monDiv"></div>
<script type="text/javascript">
//<![CDATA[
document.getElementById('monDiv').innerHTML = '<script id="monScript" type="text/javascript">document.write("truc")<\/script>';
eval(document.getElementById('monScript').innerHTML);
//]]>
</script>
</body>
</html>
 
WRInaute impliqué
Remplacer ce code : <script id="monScript" type="text/javascript">document.write("truc")<\/script> par un lien vers une page js ce n'est pas possible ?

du genre :

Code:
<!DOCTYPE html>
<html lang="FR">
<head>
   <title>Bof bof</title>
   <meta charset="utf-8" />

</head>
<body>
<div id="monDiv"></div>
<script type="text/javascript">
//<![CDATA[
document.getElementById('monDiv').innerHTML = '<script id="monScript" type="text/javascript" src="lienversficherjs.js"><\/script>';
eval(document.getElementById('monScript').innerHTML);
//]]>
</script>
</body>
</html>
 
Discussions similaires
Haut