POURQUOI MES SCRIPTS AJOUTÉS DYNAMIQUEMENT (AJAX, XSLT, ...) AVEC .INNERHTML NE
FREMYCOMPANY
Messages postés276Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention22 décembre 2008
-
12 avril 2007 à 18:26
Socki
Messages postés14Date d'inscriptionlundi 27 avril 2009StatutMembreDernière intervention12 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.
Socki
Messages postés14Date d'inscriptionlundi 27 avril 2009StatutMembreDernière intervention12 mai 2009 12 mai 2009 à 11:58
Bonjour,
J'ai une question, quelles sont les fonctions associées à innerHTML?
merci
Socki
HighSoul
Messages postés1Date d'inscriptionlundi 13 décembre 2004StatutMembreDerniè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és276Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention22 décembre 2008 21 juil. 2008 à 10:34
@MAX : Pas mal comme solution. C'est toujours à retenir !
cs_MaX3315
Messages postés170Date d'inscriptionmercredi 18 juin 2003StatutMembreDernière intervention11 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és163Date d'inscriptionmercredi 22 octobre 2003StatutMembreDerniè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;
}
Steph115
Messages postés163Date d'inscriptionmercredi 22 octobre 2003StatutMembreDerniè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és163Date d'inscriptionmercredi 22 octobre 2003StatutMembreDerniè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és22Date d'inscriptionmardi 21 janvier 2003StatutMembreDernière intervention11 septembre 2007 11 sept. 2007 à 21:22
Salut à tous
Pourquoi les class ne sont-elles pas interprétées ???
FREMYCOMPANY
Messages postés276Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention22 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és27Date d'inscriptionmardi 9 mars 2004StatutMembreDerniè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és276Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention22 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és68Date d'inscriptionsamedi 1 novembre 2003StatutMembreDerniè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és276Date d'inscriptionjeudi 12 janvier 2006StatutMembreDernière intervention22 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() { ... }"
12 mai 2009 à 11:58
J'ai une question, quelles sont les fonctions associées à innerHTML?
merci
Socki
4 août 2008 à 15:24
Merci pour cette solution lumineuse...
21 juil. 2008 à 10:34
21 juil. 2008 à 08:51
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.
24 oct. 2007 à 00:29
(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
24 oct. 2007 à 00:11
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,
23 oct. 2007 à 23:40
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,
11 sept. 2007 à 21:22
Pourquoi les class ne sont-elles pas interprétées ???
14 avril 2007 à 15:00
14 avril 2007 à 03:36
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
12 avril 2007 à 18:49
Regarde ma fonction setInnerHTML se débrouille sans...
12 avril 2007 à 18:38
Object.prototype.evalScripts = function(text){
var script, regexp = /<script[^>]*>([\s\S]*?)<\/script>/gi;
while ((script = regexp.exec(this.text))) eval(script[1]);
}
12 avril 2007 à 18:26
- Les scripts avec SRC ne sont pas évalués
- Les scripts doivent déclarer les fonctions "window.maFunction=function() { ... }" et non pas "function maFunction() { ... }"