POURQUOI MES SCRIPTS AJOUTÉS DYNAMIQUEMENT (AJAX, XSLT, ...) AVEC .INNERHTML NE

FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008 - 12 avril 2007 à 18:26
Socki Messages postés 14 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 12 mai 2009 - 12 mai 2009 à 11:58
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/42218-pourquoi-mes-scripts-ajoutes-dynamiquement-ajax-xslt-avec-innerhtml-ne-marchent-ils-pas

Socki Messages postés 14 Date d'inscription lundi 27 avril 2009 Statut Membre Dernière intervention 12 mai 2009
12 mai 2009 à 11:58
Bonjour,
J'ai une question, quelles sont les fonctions associées à innerHTML?
merci

Socki
HighSoul Messages postés 1 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 4 août 2008
4 août 2008 à 15:24
J'ai utilisé la solution de MAX3315 et ça marche nickel aussi sur Safari.

Merci pour cette solution lumineuse...
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
21 juil. 2008 à 10:34
@MAX : Pas mal comme solution. C'est toujours à retenir !
cs_MaX3315 Messages postés 170 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 11 mai 2009
21 juil. 2008 à 08:51
Si ca peut servire à d'autre qui sont confronter à ce type de problème il y a aussi une autre solution pour l'insertion et l'execution de javascript via ajax.

Il suffit d'ajouter à notre code html à insérer via innerHTML une image avec l'attribut onload=""

Exemple:

Par exemple.

Cela fonctionne sous IE6/7 et sous Firefox 2/3.

C'est peut-être une méthode un peu plus directe pour insérer du code HTML avec javascript à interpréter.
Steph115 Messages postés 163 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 3 février 2012
24 oct. 2007 à 00:29
Après d'autres tests
(je sais ce n'est pas bien il aurait fallu tester depusi le début, mais on ne vois pas tout :))

Voici le script qui marche sous IE et Firefox
Je rajoute Object.prototype uniquement si on est sous IE
ATTENTION je précise bien que pour mon cas j'inclus protoype.js dans toutes mes pages
donc je suis obligé de faire ce test car sinon firefox ne peut pas redeclarer une deuxieme dois les deux fonctions.

// setInnerHTML Sécurisé
function setInnerHTML(divContent, HTML) {
divContent.innerHTML=HTML;
try {
var All=divContent.getElementsByTagName("*");
for (var i=0; i)((\n|\r|.)*?)(?:<\/'+tag+'>)', 'img');
var matchOne = new RegExp('(?:<'+tag+'.*?>)((\n|\r|.)*?)(?:<\/'+tag+'>)', 'im');
return (this.match(matchAll) || []).map(function(scriptTag) {
return (scriptTag.match(matchOne) || ['', ''])[1];
});
}

//Detect IE5.5+
version=0;
if(navigator.appVersion.indexOf("MSIE")!=-1)
{
temp=navigator.appVersion.split("MSIE");
version=parseFloat(temp[1]);
}
// NON IE browser will return 0
if(version>=5.5)
{
Object.prototype.forEach=function(delegate, ownpropertiesonly) {
if (typeof(delegate)=="function") {
if (this instanceof Array && typeof(ownpropertiesonly)=="undefined") {
ownpropertiesonly=true;
}
for (key in this) {
var ok = (!ownpropertiesonly);
if (!ok) {
try {
ok=this.hasOwnProperty(key)
} catch (ex) {}
}
if (ok) {
try { delegate(this[key], key, this) } catch(e) {
// ...
}
}
}
}
return false;
}

Object.prototype.map=function(iterator) {
var results = [];
this.forEach(function(value, index) {
results.push(iterator(value, index));
});
return results;
}
}

Cordialement,
Stéphanos
Steph115 Messages postés 163 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 3 février 2012
24 oct. 2007 à 00:11
Hey Hey Hey

J'ai trouvé la solution :):):)

En fait il suffit tout simplement de commenter la ligne
All[i].className=All[i].getAttribute("class");

Moi ca marche sous IE7 et Firefox

ATTENTION
Pour ceux qui inclut déjà prototype (prototype lui meme ou dérivé exemple:scriptaculous)
vous devez enlever les deux dernieres fonctions Object.prototype

Voici mon code final :

// setInnerHTML Sécurisé
function setInnerHTML(divContent, HTML) {
divContent.innerHTML=HTML;
try {
var All=divContent.getElementsByTagName("*");
for (var i=0; i)((\n|\r|.)*?)(?:<\/'+tag+'>)', 'img');
var matchOne = new RegExp('(?:<'+tag+'.*?>)((\n|\r|.)*?)(?:<\/'+tag+'>)', 'im');
return (this.match(matchAll) || []).map(function(scriptTag) {
return (scriptTag.match(matchOne) || ['', ''])[1];
});
}


Cordialement,
Steph115 Messages postés 163 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 3 février 2012
23 oct. 2007 à 23:40
Bonjour,

Merci pour ce script effectivement les classes ne marches pas.

@f6xara
Comment utilise tu ton exemple ?
Marche t-il avec les css ?

Merci à vous tous,
cs_iocha Messages postés 22 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 11 septembre 2007
11 sept. 2007 à 21:22
Salut à tous
Pourquoi les class ne sont-elles pas interprétées ???
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
14 avril 2007 à 15:00
Si ca marche, tant mieux... Ca me semble même plus propre mais le problème est qu'avec AJAX on doit choisir... Eval de JavaScript ou InnerHTML... Or parfois on voudrais faire les deux, d'où mon script... mais en effet, si on veut juste ajouter un script au document, c'est lourd inutilement...
etiennexxx9 Messages postés 27 Date d'inscription mardi 9 mars 2004 Statut Membre Dernière intervention 3 décembre 2007
14 avril 2007 à 03:36
Salut,

Une autre façon d'inclure un script à une page, est de l'ajouter dynamiquement au tag head.
Voici une petite fonction qui montre comment faire:

function IncludeScript(Filename)
{
var script = document.createElement('script');
script.setAttribute('src', Filename);
script.setAttribute('type', 'text/javascript');
document.getElementsByTagName('head')[0].appendChild(script);
}

Pour inclure un script avec le code directement dans le tag, je ne l'ai jamais fait dynamiquement.

Etienne
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
12 avril 2007 à 18:49
Ben pas nécéssairement...
Regarde ma fonction setInnerHTML se débrouille sans...
cs_f6xara Messages postés 68 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 6 février 2008
12 avril 2007 à 18:38
Pour que le javascript soit éxecuter dans l ajax, il faut faire un eval sur les balises script.
Object.prototype.evalScripts = function(text){
var script, regexp = /<script[^>]*>([\s\S]*?)<\/script>/gi;
while ((script = regexp.exec(this.text))) eval(script[1]);
}
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
12 avril 2007 à 18:26
Deux contraintes :
- Les scripts avec SRC ne sont pas évalués
- Les scripts doivent déclarer les fonctions "window.maFunction=function() { ... }" et non pas "function maFunction() { ... }"
Rejoignez-nous