Bonjour. J'ai posé un problème dans comp.lang.javascript mais n'aboutis
pas. Tout est dit dans le fichier HTML dont je copies le contenu ci-
dessous (désolé, c'est en anglais parce que prévu pour un ng anglais à
l'origine ; je peux traduire si utile). Vos lumières m'intéressent.
-- DEBUT DE COPIE --
<html>
<head>
<title>Check Statistics</title>
<script type="text/javascript" language="JavaScript"><!--
var f = document.getElementById("stats");
function WaitStats4Checking(){
if (f.document.readyState == "complete"){Check();}
else{setTimeout("WaitStats4Checking()",50);}}
function GetStats(){
var f = document.getElementById("stats");
f.setAttribute("src","/cgi-bin/getstats.exe");
WaitStats4Checking();}
//--></script>
</head>
<body>
<p>Initially, the iframe contains help.htm which just says "Not any
statistic loaded. Click 'Get Statistics'" for which a heigh of 20px is
enough.
<br><br>
When user click on the 'Get Statistics' link, the GetStats() javascript
function run the getstats.exe CGI script which returns a generated
document in iframe.
<br><br>
When this generated document is well loaded in iframe (not before), the
Check() javascript function should be launched.
<br><br>
Current problem is that (f.document.readyState == "complete") is always
true even if generated document is not fully loaded.
<br><br>
How to solve this ? Maybe going through onreadystatechange to launch
WaitStats4Checking() rather than at the end of GetStats(), but how ?</p>
ok donc pour IE iframe.onreadystatechange = function() { if (this.readyState == 'complete') { Check(); }
[quoted text muted] };
Bon, ok pour tes multiples remarques sur ma page de test. Mes réponses vite fait :
- "text/javascript" seulement pour description script : ok - pourquoi var f en dehors fct ? parce qu'utile à d'autres fcts aussi
- timeout : abandonné bien sûr, c'était pour lancer le sujet et parce que je l'ai vu de nombreuse fois utilisé après recherche via gogol :)
- GetStats() ne retourne rien. C'est mal puisque handler sur un <a> : on est d'accord, mais ces fichiers HTML ont été écrit vite fait pour test et montrer mon pb. Les pages réelles sur lesquelles j'ai besoin de ça n'utilises pas d'anchors mais des div avec des réactions au onclick.
- Comment est retourné ce document par getstats.exe ? Il s'agit d'un executable écrit en C qui effectue des calculs sur le contenu de fichiers serveurs et renvoi tous ses résultats à l'écran. A savoir quelles fonctions sont utilisées pour faire ça, je n'en sais rien car je ne suis pas celui qui écrit ce script serveur. Ce que je sais, c'est que ça me sort du html bien en forme (si j'en crois le "afficher la source" de IE). Si la chose à vraiment une importance, il faudrait que je me renseigne auprès du gars en charge de ça. Quant à le voir : niet, je n'ai pas ce pouvoir de livrer ces stats internes à l'extérieur.
Et enfin :
- ton long code et ta page test : merci, ça marche très bien oui, mais tout ceci me paraît très compliqué pour simplement mettre un onload et/ou onreadystatechange comme dit ci-après.
- onload pour quasiment tous les navigateurs et onreadystatechange pour IE : oui, c'est le seul sujet qui m'intéresse dans ce fil ;-) Alors, parlons de ça, stp. Voir le bilan ci-après.
Bilan : ------- Au point où nous en sommes, j'ai simplement mis <iframe onload="Check ();"> et ça marche à merveille dans IE6 pour Win (pas encore testé sous d'autres navigateurs).
Bon, tu me diras alors : "tu n'as donc plus de pb". Et je réponds : "Et ben si, puisque selon ce que tu me dis, il faudrait onreadystatechange ds IE6 et le onload ne devrait pas marcher"... Comment se fait-il qu'il fonctionne ?
Que dois-je faire au final et en restant concentré sur ce seul sujet du déclenchement de Check() à chaque chargement de document dans iframe ?
- Solution 2 : <iframe onload="Check();"> + onreadystatechange pour cas IE6 ?
- Solution 3 : if (window.addEventListener){ f.onload = Check();} else if (f.attachEvent){ f.attachEvent("onload", Check());} else{return;}
- Solution 4 : onload = function(){ var f = document.getElementById('stats'); f.onload = function(e) { this.Check(); };}
- Solution 5 : Un mixage de tout ça !
In article <441586c5$0$26736$636a55ce@news.free.fr>, mokhet@mokhet.com
says...
ok donc pour IE
iframe.onreadystatechange = function()
{
if (this.readyState == 'complete') { Check(); }
[quoted text muted]
};
Bon, ok pour tes multiples remarques sur ma page de test. Mes réponses
vite fait :
- "text/javascript" seulement pour description script : ok
- pourquoi var f en dehors fct ? parce qu'utile à d'autres fcts aussi
- timeout : abandonné bien sûr, c'était pour lancer le sujet et parce
que je l'ai vu de nombreuse fois utilisé après recherche via gogol :)
- GetStats() ne retourne rien. C'est mal puisque handler sur un <a> : on
est d'accord, mais ces fichiers HTML ont été écrit vite fait pour test
et montrer mon pb. Les pages réelles sur lesquelles j'ai besoin de ça
n'utilises pas d'anchors mais des div avec des réactions au onclick.
- Comment est retourné ce document par getstats.exe ? Il s'agit d'un
executable écrit en C qui effectue des calculs sur le contenu de
fichiers serveurs et renvoi tous ses résultats à l'écran. A savoir
quelles fonctions sont utilisées pour faire ça, je n'en sais rien car je
ne suis pas celui qui écrit ce script serveur. Ce que je sais, c'est que
ça me sort du html bien en forme (si j'en crois le "afficher la source"
de IE). Si la chose à vraiment une importance, il faudrait que je me
renseigne auprès du gars en charge de ça. Quant à le voir : niet, je
n'ai pas ce pouvoir de livrer ces stats internes à l'extérieur.
Et enfin :
- ton long code et ta page test : merci, ça marche très bien oui, mais
tout ceci me paraît très compliqué pour simplement mettre un onload
et/ou onreadystatechange comme dit ci-après.
- onload pour quasiment tous les navigateurs et onreadystatechange pour
IE : oui, c'est le seul sujet qui m'intéresse dans ce fil ;-) Alors,
parlons de ça, stp. Voir le bilan ci-après.
Bilan :
-------
Au point où nous en sommes, j'ai simplement mis <iframe onload="Check
();"> et ça marche à merveille dans IE6 pour Win (pas encore testé sous
d'autres navigateurs).
Bon, tu me diras alors : "tu n'as donc plus de pb". Et je réponds : "Et
ben si, puisque selon ce que tu me dis, il faudrait onreadystatechange
ds IE6 et le onload ne devrait pas marcher"... Comment se fait-il qu'il
fonctionne ?
Que dois-je faire au final et en restant concentré sur ce seul sujet du
déclenchement de Check() à chaque chargement de document dans iframe ?
ok donc pour IE iframe.onreadystatechange = function() { if (this.readyState == 'complete') { Check(); }
[quoted text muted] };
Bon, ok pour tes multiples remarques sur ma page de test. Mes réponses vite fait :
- "text/javascript" seulement pour description script : ok - pourquoi var f en dehors fct ? parce qu'utile à d'autres fcts aussi
- timeout : abandonné bien sûr, c'était pour lancer le sujet et parce que je l'ai vu de nombreuse fois utilisé après recherche via gogol :)
- GetStats() ne retourne rien. C'est mal puisque handler sur un <a> : on est d'accord, mais ces fichiers HTML ont été écrit vite fait pour test et montrer mon pb. Les pages réelles sur lesquelles j'ai besoin de ça n'utilises pas d'anchors mais des div avec des réactions au onclick.
- Comment est retourné ce document par getstats.exe ? Il s'agit d'un executable écrit en C qui effectue des calculs sur le contenu de fichiers serveurs et renvoi tous ses résultats à l'écran. A savoir quelles fonctions sont utilisées pour faire ça, je n'en sais rien car je ne suis pas celui qui écrit ce script serveur. Ce que je sais, c'est que ça me sort du html bien en forme (si j'en crois le "afficher la source" de IE). Si la chose à vraiment une importance, il faudrait que je me renseigne auprès du gars en charge de ça. Quant à le voir : niet, je n'ai pas ce pouvoir de livrer ces stats internes à l'extérieur.
Et enfin :
- ton long code et ta page test : merci, ça marche très bien oui, mais tout ceci me paraît très compliqué pour simplement mettre un onload et/ou onreadystatechange comme dit ci-après.
- onload pour quasiment tous les navigateurs et onreadystatechange pour IE : oui, c'est le seul sujet qui m'intéresse dans ce fil ;-) Alors, parlons de ça, stp. Voir le bilan ci-après.
Bilan : ------- Au point où nous en sommes, j'ai simplement mis <iframe onload="Check ();"> et ça marche à merveille dans IE6 pour Win (pas encore testé sous d'autres navigateurs).
Bon, tu me diras alors : "tu n'as donc plus de pb". Et je réponds : "Et ben si, puisque selon ce que tu me dis, il faudrait onreadystatechange ds IE6 et le onload ne devrait pas marcher"... Comment se fait-il qu'il fonctionne ?
Que dois-je faire au final et en restant concentré sur ce seul sujet du déclenchement de Check() à chaque chargement de document dans iframe ?
- Solution 2 : <iframe onload="Check();"> + onreadystatechange pour cas IE6 ?
- Solution 3 : if (window.addEventListener){ f.onload = Check();} else if (f.attachEvent){ f.attachEvent("onload", Check());} else{return;}
- Solution 4 : onload = function(){ var f = document.getElementById('stats'); f.onload = function(e) { this.Check(); };}
- Solution 5 : Un mixage de tout ça !
ASM
Bilan : ------- Au point où nous en sommes, j'ai simplement mis <iframe onload="Check ();"> et ça marche à merveille dans IE6 pour Win (pas encore testé sous d'autres navigateurs).
ben oui, et c'était si simple ! :-)
Bon, tu me diras alors : "tu n'as donc plus de pb". Et je réponds : "Et ben si, puisque selon ce que tu me dis, il faudrait onreadystatechange ds IE6 et le onload ne devrait pas marcher"... Comment se fait-il qu'il fonctionne ?
à mon idée (mais je suis aussi un peu perdu) tu te mélanges entre onload glissé dans la balise et onload comme commande (ou attribut) ajoutée par le JS après chargement de page principale
bref, toujours à mon idée (mais je n'ai pas IE6) onload dans la balise est OK
- Solution 2 : <iframe onload="Check();"> + onreadystatechange pour cas IE6 ?
non
- Solution 3 : if (window.addEventListener){ f.onload = Check();}
f.onload = Check; }
ou
f.onload = function() { Check(); }; }
else if (f.attachEvent){ f.attachEvent("onload", Check());}
f.attachEvent("onload", "Check()");}
else{return;}
si tu veux
- Solution 4 : onload = function(){ var f = document.getElementById('stats'); f.onload = function(e) { this.Check(); };}
si tu veux
- Solution 5 : Un mixage de tout ça !
non, car à mon idée : 1, 3 et 4 sont pareils les mêmes sauf que 3 et 4 ne seront pas compatibles avec mon NC4.5 (ce dont on se moque : il ne sait pas non plus ce qu'est une iframe)
-- Stephane Moriaux et son [moins] vieux Mac
Bilan :
-------
Au point où nous en sommes, j'ai simplement mis <iframe onload="Check
();"> et ça marche à merveille dans IE6 pour Win (pas encore testé sous
d'autres navigateurs).
ben oui, et c'était si simple ! :-)
Bon, tu me diras alors : "tu n'as donc plus de pb". Et je réponds : "Et
ben si, puisque selon ce que tu me dis, il faudrait onreadystatechange
ds IE6 et le onload ne devrait pas marcher"... Comment se fait-il qu'il
fonctionne ?
à mon idée (mais je suis aussi un peu perdu)
tu te mélanges entre onload glissé dans la balise et onload comme
commande (ou attribut) ajoutée par le JS après chargement de page principale
bref, toujours à mon idée (mais je n'ai pas IE6)
onload dans la balise est OK
- Solution 2 :
<iframe onload="Check();"> + onreadystatechange pour cas IE6 ?
non
- Solution 3 :
if (window.addEventListener){
f.onload = Check();}
f.onload = Check; }
ou
f.onload = function() { Check(); }; }
else if (f.attachEvent){
f.attachEvent("onload", Check());}
f.attachEvent("onload", "Check()");}
else{return;}
si tu veux
- Solution 4 :
onload = function(){
var f = document.getElementById('stats');
f.onload = function(e) { this.Check(); };}
si tu veux
- Solution 5 :
Un mixage de tout ça !
non, car à mon idée : 1, 3 et 4 sont pareils les mêmes
sauf que 3 et 4 ne seront pas compatibles avec mon NC4.5
(ce dont on se moque : il ne sait pas non plus ce qu'est une iframe)
Bilan : ------- Au point où nous en sommes, j'ai simplement mis <iframe onload="Check ();"> et ça marche à merveille dans IE6 pour Win (pas encore testé sous d'autres navigateurs).
ben oui, et c'était si simple ! :-)
Bon, tu me diras alors : "tu n'as donc plus de pb". Et je réponds : "Et ben si, puisque selon ce que tu me dis, il faudrait onreadystatechange ds IE6 et le onload ne devrait pas marcher"... Comment se fait-il qu'il fonctionne ?
à mon idée (mais je suis aussi un peu perdu) tu te mélanges entre onload glissé dans la balise et onload comme commande (ou attribut) ajoutée par le JS après chargement de page principale
bref, toujours à mon idée (mais je n'ai pas IE6) onload dans la balise est OK
- Solution 2 : <iframe onload="Check();"> + onreadystatechange pour cas IE6 ?
non
- Solution 3 : if (window.addEventListener){ f.onload = Check();}
f.onload = Check; }
ou
f.onload = function() { Check(); }; }
else if (f.attachEvent){ f.attachEvent("onload", Check());}
f.attachEvent("onload", "Check()");}
else{return;}
si tu veux
- Solution 4 : onload = function(){ var f = document.getElementById('stats'); f.onload = function(e) { this.Check(); };}
si tu veux
- Solution 5 : Un mixage de tout ça !
non, car à mon idée : 1, 3 et 4 sont pareils les mêmes sauf que 3 et 4 ne seront pas compatibles avec mon NC4.5 (ce dont on se moque : il ne sait pas non plus ce qu'est une iframe)
-- Stephane Moriaux et son [moins] vieux Mac
Asterbing
In article <4415ae6b$0$6658$, says...
Au point où nous en sommes, j'ai simplement mis <iframe onload="Check ();"> et ça marche à merveille dans IE6 pour Win (pas encore testé sous d'autres navigateurs).
ben oui, et c'était si simple ! :-)
Remarque, c'est en soi un exploit d'avoir fait si long pour ça. Je propose de chercher maintenant comment gérer la couleur de fond de page en faisant comme si on ne conniassait pas <body bgcolor : bon, je propose d'attaquer les registres de la carte vidéo direct :o)
Sinon, oui, j'ai noté tes correctif sur le avec () et sans. Merci pour ta revue de bilan !
Bon, j'essaierai dans d'autres navigateurs et ne reviens que si ça ne marche pas.
In article <4415ae6b$0$6658$8fcfb975@news.wanadoo.fr>,
stephanemoriaux.NoAdmin@wanadoo.fr.invalid says...
Au point où nous en sommes, j'ai simplement mis <iframe onload="Check
();"> et ça marche à merveille dans IE6 pour Win (pas encore testé sous
d'autres navigateurs).
ben oui, et c'était si simple ! :-)
Remarque, c'est en soi un exploit d'avoir fait si long pour ça. Je
propose de chercher maintenant comment gérer la couleur de fond de page
en faisant comme si on ne conniassait pas <body bgcolor : bon, je
propose d'attaquer les registres de la carte vidéo direct :o)
Sinon, oui, j'ai noté tes correctif sur le avec () et sans. Merci pour
ta revue de bilan !
Bon, j'essaierai dans d'autres navigateurs et ne reviens que si ça ne
marche pas.
Au point où nous en sommes, j'ai simplement mis <iframe onload="Check ();"> et ça marche à merveille dans IE6 pour Win (pas encore testé sous d'autres navigateurs).
ben oui, et c'était si simple ! :-)
Remarque, c'est en soi un exploit d'avoir fait si long pour ça. Je propose de chercher maintenant comment gérer la couleur de fond de page en faisant comme si on ne conniassait pas <body bgcolor : bon, je propose d'attaquer les registres de la carte vidéo direct :o)
Sinon, oui, j'ai noté tes correctif sur le avec () et sans. Merci pour ta revue de bilan !
Bon, j'essaierai dans d'autres navigateurs et ne reviens que si ça ne marche pas.
Laurent Vilday
- ton long code et ta page test : merci, ça marche très bien oui, mais tout ceci me paraît très compliqué pour simplement mettre un onload et/ou onreadystatechange comme dit ci-après.
oui je sais, on me fait souvent la réflexion, mais j'y peux rien si il faut toujours tout codé en double (voir en triple des fois) parce que IE ne prend jamais la même direction que le reste du monde :( et pire, qu'il est même pas compatible avec ses propres inepties d'une version à l'autre. Ceci dit, c'est pas si énorme que ça si tu enlèves les commentaires.
Au point où nous en sommes, j'ai simplement mis <iframe onload="Check ();"> et ça marche à merveille dans IE6 pour Win (pas encore testé sous d'autres navigateurs).
Bon, tu me diras alors : "tu n'as donc plus de pb". Et je réponds : "Et ben si, puisque selon ce que tu me dis, il faudrait onreadystatechange ds IE6 et le onload ne devrait pas marcher"... Comment se fait-il qu'il fonctionne ?
Attention à ne pas confondre, mettre un onload sur le tag HTML et placer l'event depuis javascript bien que théoriquement on se prenne à penser que c'est pareil et bien non, on se retrouve toujours avec des différences de comportement, devines par qui ? par IE bien entendu :)
donc en HTML <tag onload=""> ca passe partout mais c'est assez obsolète et surtout l'event onload est executé au moment de la création de la page (sans parler de l'impossibilité d'avoir accès à l'iframe par this et le boxon qu'on a avec la perte de l'objet event ).
on se retrouve avec 2 alertes alors qu'on a chargé qu'une seule fois (1 fois lors de la création vide en HTML, une autre fois lors de l'attribution de la source)
par contre si tu places l'event onload avec du javascript lorsque tu as besoin, ce genre de problème disparait. A la limite, onload est suffisant pour tout le monde, mais dans ma mémoire readyState de IE te permet un contrôle plus fin que le onload qu'il propose et surtout il ne se trompe pas dans l'ordre de l'event.
J'ai essayé de retrouver un exemple ou le problème est visible lorsque le onload est lancé avant qu'on ait vraiment fini, mais je suis bredouille. J'ai essayé aussi de reproduire mais pareil, échec de la mission. Je regarderais et essayerais de comprendre un peu plus dans la nuit mais là on m'attend... donc je te donnes l'url de mon dernier test, si t'as un problème on dissèquera tout ça à mon retour. http://mokhet.com/tests/iframe_ordre_events.html
Que dois-je faire au final et en restant concentré sur ce seul sujet du déclenchement de Check() à chaque chargement de document dans iframe ?
- Solution 2 : <iframe onload="Check();"> + onreadystatechange pour cas IE6 ?
Si la solution 1 te satisfait, que tu n'as pas besoin d'accéder à l'event générer (son objet) et que tu n'as pas besoin d'accéder à l'iframe autrement que par son id alors je dirais la solution 1 est la bonne.
- Solution 3 : if (window.addEventListener){ f.onload = Check();} else if (f.attachEvent){ f.attachEvent("onload", Check());} else{return;}
La tu execute la fonction Check (à cause des () et tu attribues le résultat au gestionnaire de chargement, c'est pas bon, il lui faut la référence de la function, pas son résultat
- Solution 4 : onload = function(){ var f = document.getElementById('stats'); f.onload = function(e) { this.Check(); };}
Non, non, ça c'était quand on croyait que Check était un membre de ta iframe et qu'on ne savait pas trop ce que tu voulais faire, on sait tout ça maintenant et ce cas n'est pas adapté à ton problème. Donc non.
Résultat, moi je dit solution 1
Par contre, si tu as besoin de l'event généré ou besoin d'accéder à l'iframe, dit le et on en reparle
-- laurent
- ton long code et ta page test : merci, ça marche très bien oui, mais
tout ceci me paraît très compliqué pour simplement mettre un onload
et/ou onreadystatechange comme dit ci-après.
oui je sais, on me fait souvent la réflexion, mais j'y peux rien si il
faut toujours tout codé en double (voir en triple des fois) parce que IE
ne prend jamais la même direction que le reste du monde :( et pire,
qu'il est même pas compatible avec ses propres inepties d'une version à
l'autre. Ceci dit, c'est pas si énorme que ça si tu enlèves les
commentaires.
Au point où nous en sommes, j'ai simplement mis <iframe onload="Check
();"> et ça marche à merveille dans IE6 pour Win (pas encore testé sous
d'autres navigateurs).
Bon, tu me diras alors : "tu n'as donc plus de pb". Et je réponds : "Et
ben si, puisque selon ce que tu me dis, il faudrait onreadystatechange
ds IE6 et le onload ne devrait pas marcher"... Comment se fait-il qu'il
fonctionne ?
Attention à ne pas confondre, mettre un onload sur le tag HTML et placer
l'event depuis javascript bien que théoriquement on se prenne à penser
que c'est pareil et bien non, on se retrouve toujours avec des
différences de comportement, devines par qui ? par IE bien entendu :)
donc en HTML <tag onload=""> ca passe partout mais c'est assez obsolète
et surtout l'event onload est executé au moment de la création de la
page (sans parler de l'impossibilité d'avoir accès à l'iframe par this
et le boxon qu'on a avec la perte de l'objet event ).
on se retrouve avec 2 alertes alors qu'on a chargé qu'une seule fois (1
fois lors de la création vide en HTML, une autre fois lors de
l'attribution de la source)
par contre si tu places l'event onload avec du javascript lorsque tu as
besoin, ce genre de problème disparait. A la limite, onload est
suffisant pour tout le monde, mais dans ma mémoire readyState de IE te
permet un contrôle plus fin que le onload qu'il propose et surtout il ne
se trompe pas dans l'ordre de l'event.
J'ai essayé de retrouver un exemple ou le problème est visible lorsque
le onload est lancé avant qu'on ait vraiment fini, mais je suis
bredouille. J'ai essayé aussi de reproduire mais pareil, échec de la
mission. Je regarderais et essayerais de comprendre un peu plus dans la
nuit mais là on m'attend... donc je te donnes l'url de mon dernier test,
si t'as un problème on dissèquera tout ça à mon retour.
http://mokhet.com/tests/iframe_ordre_events.html
Que dois-je faire au final et en restant concentré sur ce seul sujet du
déclenchement de Check() à chaque chargement de document dans iframe ?
- Solution 2 :
<iframe onload="Check();"> + onreadystatechange pour cas IE6 ?
Si la solution 1 te satisfait, que tu n'as pas besoin d'accéder à
l'event générer (son objet) et que tu n'as pas besoin d'accéder à
l'iframe autrement que par son id alors je dirais la solution 1 est la
bonne.
- Solution 3 :
if (window.addEventListener){
f.onload = Check();}
else if (f.attachEvent){
f.attachEvent("onload", Check());}
else{return;}
La tu execute la fonction Check (à cause des () et tu attribues le
résultat au gestionnaire de chargement, c'est pas bon, il lui faut la
référence de la function, pas son résultat
- Solution 4 :
onload = function(){
var f = document.getElementById('stats');
f.onload = function(e) { this.Check(); };}
Non, non, ça c'était quand on croyait que Check était un membre de ta
iframe et qu'on ne savait pas trop ce que tu voulais faire, on sait tout
ça maintenant et ce cas n'est pas adapté à ton problème. Donc non.
Résultat, moi je dit solution 1
Par contre, si tu as besoin de l'event généré ou besoin d'accéder à
l'iframe, dit le et on en reparle
- ton long code et ta page test : merci, ça marche très bien oui, mais tout ceci me paraît très compliqué pour simplement mettre un onload et/ou onreadystatechange comme dit ci-après.
oui je sais, on me fait souvent la réflexion, mais j'y peux rien si il faut toujours tout codé en double (voir en triple des fois) parce que IE ne prend jamais la même direction que le reste du monde :( et pire, qu'il est même pas compatible avec ses propres inepties d'une version à l'autre. Ceci dit, c'est pas si énorme que ça si tu enlèves les commentaires.
Au point où nous en sommes, j'ai simplement mis <iframe onload="Check ();"> et ça marche à merveille dans IE6 pour Win (pas encore testé sous d'autres navigateurs).
Bon, tu me diras alors : "tu n'as donc plus de pb". Et je réponds : "Et ben si, puisque selon ce que tu me dis, il faudrait onreadystatechange ds IE6 et le onload ne devrait pas marcher"... Comment se fait-il qu'il fonctionne ?
Attention à ne pas confondre, mettre un onload sur le tag HTML et placer l'event depuis javascript bien que théoriquement on se prenne à penser que c'est pareil et bien non, on se retrouve toujours avec des différences de comportement, devines par qui ? par IE bien entendu :)
donc en HTML <tag onload=""> ca passe partout mais c'est assez obsolète et surtout l'event onload est executé au moment de la création de la page (sans parler de l'impossibilité d'avoir accès à l'iframe par this et le boxon qu'on a avec la perte de l'objet event ).
on se retrouve avec 2 alertes alors qu'on a chargé qu'une seule fois (1 fois lors de la création vide en HTML, une autre fois lors de l'attribution de la source)
par contre si tu places l'event onload avec du javascript lorsque tu as besoin, ce genre de problème disparait. A la limite, onload est suffisant pour tout le monde, mais dans ma mémoire readyState de IE te permet un contrôle plus fin que le onload qu'il propose et surtout il ne se trompe pas dans l'ordre de l'event.
J'ai essayé de retrouver un exemple ou le problème est visible lorsque le onload est lancé avant qu'on ait vraiment fini, mais je suis bredouille. J'ai essayé aussi de reproduire mais pareil, échec de la mission. Je regarderais et essayerais de comprendre un peu plus dans la nuit mais là on m'attend... donc je te donnes l'url de mon dernier test, si t'as un problème on dissèquera tout ça à mon retour. http://mokhet.com/tests/iframe_ordre_events.html
Que dois-je faire au final et en restant concentré sur ce seul sujet du déclenchement de Check() à chaque chargement de document dans iframe ?
- Solution 2 : <iframe onload="Check();"> + onreadystatechange pour cas IE6 ?
Si la solution 1 te satisfait, que tu n'as pas besoin d'accéder à l'event générer (son objet) et que tu n'as pas besoin d'accéder à l'iframe autrement que par son id alors je dirais la solution 1 est la bonne.
- Solution 3 : if (window.addEventListener){ f.onload = Check();} else if (f.attachEvent){ f.attachEvent("onload", Check());} else{return;}
La tu execute la fonction Check (à cause des () et tu attribues le résultat au gestionnaire de chargement, c'est pas bon, il lui faut la référence de la function, pas son résultat
- Solution 4 : onload = function(){ var f = document.getElementById('stats'); f.onload = function(e) { this.Check(); };}
Non, non, ça c'était quand on croyait que Check était un membre de ta iframe et qu'on ne savait pas trop ce que tu voulais faire, on sait tout ça maintenant et ce cas n'est pas adapté à ton problème. Donc non.
Résultat, moi je dit solution 1
Par contre, si tu as besoin de l'event généré ou besoin d'accéder à l'iframe, dit le et on en reparle
-- laurent
Bertrand B
J'ai toujours peur de faire de rectifier parce que peur d'être mal interprété, toujours peur d'avoir à m'excuser d'avoir pas suffise mment arrondi les angles pour faire comprendre ce que je veux dire sans avoir l'air pédant ou arrogant. Donc généralement je me tais, mais là bien que sachant que c'était que des bêtes typos lors de la rédaction, j'a i préféré intervenir parce que tu es un peu la FAQ de fciwa :D et q ue tes écrits sont comme une bible pour certains lecteurs. Donc plutôt que de laisser les lecteurs retenir une erreur j'ai pensé qu'il fallait rectifier. Tiens tu vois, je suis à la limite (comme d'hab) d'annuler ce post, grr, je rêve du jour ou je saurais m'exprimer clairement sans ê tre obligé d'en écrire autant. grrrr.
Tant qu'à partager le savoir, et probablement corrigé certaines closu res dans mes scripts. Y aurait il un document précisant ce à quoi fait référence le this avec des exemples de cas. Quand on arrive à écrire ça : function Requeteur(Nom){ this.fifo = new Array(); this.nom=Nom this.actived = false; this.stop=function(){ //alert("stop"); this.activedúlse; this.fifo=new Array(); } this.donext=function(){ if (this.fifo.length >0 && this.actived) { job=this.fifo.shift(); if(cache[job.methode][job.URL] && this.actived) {job.Apres(cache[job.methode][job.URL]);this.donext();} else job.xhr.send(null); //Probleme si le serveur ne retourne pas d'ereur 404 } else this.activedúlse; } this.send= function (Methode,URL,apres){ var me=this; var job={"xhr":getRequester(),"methode":Methode,"URL":URL,"Apres":apres}; function _todo(){ if (job.xhr.readyState ==4 && me.actived) { // if (!cache[Methode][URL]) alert(URL); if(!cache[Methode][URL]) cache[Methode][URL]=job.xhr else job.aDetruire=true; apres(job.xhr); if (job.aDetruire) {delete job.xhr; delete job;} me.donext(); }// else return; } job.xhr.open(Methode,URL,true); job.xhr.onreadystatechange=_todo; this.fifo.push(job); if (this.actived == false) {this.actived=true;this.donex t();} } }
(extrait de blog.js le moteur de chtioblogue) on finit par ne plus savoir à quoi correspond les this de me que l'on s e perd dans les closures et y aller à tâton
J'ai toujours peur de faire de rectifier parce que peur d'être mal
interprété, toujours peur d'avoir à m'excuser d'avoir pas suffise mment
arrondi les angles pour faire comprendre ce que je veux dire sans avoir
l'air pédant ou arrogant. Donc généralement je me tais, mais là bien que
sachant que c'était que des bêtes typos lors de la rédaction, j'a i
préféré intervenir parce que tu es un peu la FAQ de fciwa :D et q ue tes
écrits sont comme une bible pour certains lecteurs. Donc plutôt que de
laisser les lecteurs retenir une erreur j'ai pensé qu'il fallait
rectifier. Tiens tu vois, je suis à la limite (comme d'hab) d'annuler ce
post, grr, je rêve du jour ou je saurais m'exprimer clairement sans ê tre
obligé d'en écrire autant. grrrr.
Tant qu'à partager le savoir, et probablement corrigé certaines closu res
dans mes scripts. Y aurait il un document précisant ce à quoi fait
référence le this avec des exemples de cas.
Quand on arrive à écrire ça :
function Requeteur(Nom){
this.fifo = new Array();
this.nom=Nom
this.actived = false;
this.stop=function(){
//alert("stop");
this.actived=false;
this.fifo=new Array();
}
this.donext=function(){
if (this.fifo.length >0 && this.actived) {
job=this.fifo.shift();
if(cache[job.methode][job.URL] && this.actived)
{job.Apres(cache[job.methode][job.URL]);this.donext();}
else job.xhr.send(null);
//Probleme si le serveur ne retourne pas d'ereur 404
}
else this.actived=false;
}
this.send= function (Methode,URL,apres){
var me=this;
var
job={"xhr":getRequester(),"methode":Methode,"URL":URL,"Apres":apres};
function _todo(){
if (job.xhr.readyState ==4 && me.actived) {
// if (!cache[Methode][URL]) alert(URL);
if(!cache[Methode][URL]) cache[Methode][URL]=job.xhr
else job.aDetruire=true;
apres(job.xhr);
if (job.aDetruire) {delete job.xhr; delete job;}
me.donext();
}// else return;
}
job.xhr.open(Methode,URL,true);
job.xhr.onreadystatechange=_todo;
this.fifo.push(job);
if (this.actived == false) {this.actived=true;this.donex t();}
}
}
(extrait de blog.js le moteur de chtioblogue)
on finit par ne plus savoir à quoi correspond les this de me que l'on s e
perd dans les closures et y aller à tâton
J'ai toujours peur de faire de rectifier parce que peur d'être mal interprété, toujours peur d'avoir à m'excuser d'avoir pas suffise mment arrondi les angles pour faire comprendre ce que je veux dire sans avoir l'air pédant ou arrogant. Donc généralement je me tais, mais là bien que sachant que c'était que des bêtes typos lors de la rédaction, j'a i préféré intervenir parce que tu es un peu la FAQ de fciwa :D et q ue tes écrits sont comme une bible pour certains lecteurs. Donc plutôt que de laisser les lecteurs retenir une erreur j'ai pensé qu'il fallait rectifier. Tiens tu vois, je suis à la limite (comme d'hab) d'annuler ce post, grr, je rêve du jour ou je saurais m'exprimer clairement sans ê tre obligé d'en écrire autant. grrrr.
Tant qu'à partager le savoir, et probablement corrigé certaines closu res dans mes scripts. Y aurait il un document précisant ce à quoi fait référence le this avec des exemples de cas. Quand on arrive à écrire ça : function Requeteur(Nom){ this.fifo = new Array(); this.nom=Nom this.actived = false; this.stop=function(){ //alert("stop"); this.activedúlse; this.fifo=new Array(); } this.donext=function(){ if (this.fifo.length >0 && this.actived) { job=this.fifo.shift(); if(cache[job.methode][job.URL] && this.actived) {job.Apres(cache[job.methode][job.URL]);this.donext();} else job.xhr.send(null); //Probleme si le serveur ne retourne pas d'ereur 404 } else this.activedúlse; } this.send= function (Methode,URL,apres){ var me=this; var job={"xhr":getRequester(),"methode":Methode,"URL":URL,"Apres":apres}; function _todo(){ if (job.xhr.readyState ==4 && me.actived) { // if (!cache[Methode][URL]) alert(URL); if(!cache[Methode][URL]) cache[Methode][URL]=job.xhr else job.aDetruire=true; apres(job.xhr); if (job.aDetruire) {delete job.xhr; delete job;} me.donext(); }// else return; } job.xhr.open(Methode,URL,true); job.xhr.onreadystatechange=_todo; this.fifo.push(job); if (this.actived == false) {this.actived=true;this.donex t();} } }
(extrait de blog.js le moteur de chtioblogue) on finit par ne plus savoir à quoi correspond les this de me que l'on s e perd dans les closures et y aller à tâton
Bertrand B
Là, ta fonction GetStats() ne retourne rien. C'est mal puisque tu l'utilises comme handler sur un lien <a>. Tu dois *impérativement* retourné false si tu veux pas suivre ton lien <a href="#"> (voir FA Q)
Oups je viens d'apprendre quelque chose là ...
Là, ta fonction GetStats() ne retourne rien. C'est mal puisque tu
l'utilises comme handler sur un lien <a>. Tu dois *impérativement*
retourné false si tu veux pas suivre ton lien <a href="#"> (voir FA Q)
Là, ta fonction GetStats() ne retourne rien. C'est mal puisque tu l'utilises comme handler sur un lien <a>. Tu dois *impérativement* retourné false si tu veux pas suivre ton lien <a href="#"> (voir FA Q)
Oups je viens d'apprendre quelque chose là ...
Asterbing
In article <4415b600$0$29468$, says...
Résultat, moi je dit solution 1
Par contre, si tu as besoin de l'event généré ou besoin d'accéder à l'iframe, dit le et on en reparle
Merci de ton engagement sans limite dans le pb, Laurent. J'ai opté pour le <iframe onload=""> pour l'instant dans la mesure ou l'appel au chargement de la page ne me dérange pas (le Check() fera juste un return si rien dans l'iframe). Par contre, j'ai enregistré tout ton speech sur la difference onload ds tag ou ajout via js, car je présage que ça me sera utile un jour.
Bon, j'ai une nouvelle question sur require/use et comment, mais je crée un nouveau fil.
Merci encore : à toi et ASM ;)
In article <4415b600$0$29468$636a55ce@news.free.fr>, mokhet@mokhet.com
says...
Résultat, moi je dit solution 1
Par contre, si tu as besoin de l'event généré ou besoin d'accéder à
l'iframe, dit le et on en reparle
Merci de ton engagement sans limite dans le pb, Laurent. J'ai opté pour
le <iframe onload=""> pour l'instant dans la mesure ou l'appel au
chargement de la page ne me dérange pas (le Check() fera juste un return
si rien dans l'iframe). Par contre, j'ai enregistré tout ton speech sur
la difference onload ds tag ou ajout via js, car je présage que ça me
sera utile un jour.
Bon, j'ai une nouvelle question sur require/use et comment, mais je crée
un nouveau fil.
Par contre, si tu as besoin de l'event généré ou besoin d'accéder à l'iframe, dit le et on en reparle
Merci de ton engagement sans limite dans le pb, Laurent. J'ai opté pour le <iframe onload=""> pour l'instant dans la mesure ou l'appel au chargement de la page ne me dérange pas (le Check() fera juste un return si rien dans l'iframe). Par contre, j'ai enregistré tout ton speech sur la difference onload ds tag ou ajout via js, car je présage que ça me sera utile un jour.
Bon, j'ai une nouvelle question sur require/use et comment, mais je crée un nouveau fil.
Merci encore : à toi et ASM ;)
ASM
In article <4415b600$0$29468$, says...
Par contre, si tu as besoin de l'event généré ou besoin d'accéder à l'iframe, dit le et on en reparle
Merci de ton engagement sans limite dans le pb, Laurent.
voilà qui résume et classifie les propos précedents : http://www.aidejavascript.com/article143.html
(dommage que la balise script nue soit employée et qu'il n'y ait pas un exemple multi-navigateurs en conclusion de l'article)
-- Stephane Moriaux et son [moins] vieux Mac
In article <4415b600$0$29468$636a55ce@news.free.fr>, mokhet@mokhet.com
says...
Par contre, si tu as besoin de l'event généré ou besoin d'accéder à
l'iframe, dit le et on en reparle
Merci de ton engagement sans limite dans le pb, Laurent.
voilà qui résume et classifie les propos précedents :
http://www.aidejavascript.com/article143.html
(dommage que la balise script nue soit employée et qu'il n'y ait pas un
exemple multi-navigateurs en conclusion de l'article)
Par contre, si tu as besoin de l'event généré ou besoin d'accéder à l'iframe, dit le et on en reparle
Merci de ton engagement sans limite dans le pb, Laurent.
voilà qui résume et classifie les propos précedents : http://www.aidejavascript.com/article143.html
(dommage que la balise script nue soit employée et qu'il n'y ait pas un exemple multi-navigateurs en conclusion de l'article)
-- Stephane Moriaux et son [moins] vieux Mac
Laurent Vilday
dans mes scripts. Y aurait il un document précisant ce à quoi fait référence le this avec des exemples de cas. Quand on arrive à écrire ça : [cut]
(extrait de blog.js le moteur de chtioblogue) on finit par ne plus savoir à quoi correspond les this de me que l'on se perd dans les closures et y aller à tâton
Effectivement, *this* est un sujet assez vaste je pense, peut être qu'on devrait pas hijacker ce thread :)
Je me permet de reprendre ton exemple dans un autre message et d'essayer de raconter ce que je connais du mot clé this.
Si tu as aussi des interrogations sur les closures, qui sont à elles seules également un énorme sujet très intéressant et très puissant, je te propose de créer encore un autre post, histoire de ne pas tout mélanger.
Je pense qu'il faut absolument passer tout ton code à jslint, c'est un outils fantastique qui te permettra de clarifier ton code et de corriger quelques erreurs que j'ai vu trainer dans ton exemple. http://www.jslint.com/
-- laurent
dans mes scripts. Y aurait il un document précisant ce à quoi fait
référence le this avec des exemples de cas.
Quand on arrive à écrire ça :
[cut]
(extrait de blog.js le moteur de chtioblogue)
on finit par ne plus savoir à quoi correspond les this de me que l'on se
perd dans les closures et y aller à tâton
Effectivement, *this* est un sujet assez vaste je pense, peut être qu'on
devrait pas hijacker ce thread :)
Je me permet de reprendre ton exemple dans un autre message et d'essayer
de raconter ce que je connais du mot clé this.
Si tu as aussi des interrogations sur les closures, qui sont à elles
seules également un énorme sujet très intéressant et très puissant, je
te propose de créer encore un autre post, histoire de ne pas tout mélanger.
Je pense qu'il faut absolument passer tout ton code à jslint, c'est un
outils fantastique qui te permettra de clarifier ton code et de corriger
quelques erreurs que j'ai vu trainer dans ton exemple.
http://www.jslint.com/
dans mes scripts. Y aurait il un document précisant ce à quoi fait référence le this avec des exemples de cas. Quand on arrive à écrire ça : [cut]
(extrait de blog.js le moteur de chtioblogue) on finit par ne plus savoir à quoi correspond les this de me que l'on se perd dans les closures et y aller à tâton
Effectivement, *this* est un sujet assez vaste je pense, peut être qu'on devrait pas hijacker ce thread :)
Je me permet de reprendre ton exemple dans un autre message et d'essayer de raconter ce que je connais du mot clé this.
Si tu as aussi des interrogations sur les closures, qui sont à elles seules également un énorme sujet très intéressant et très puissant, je te propose de créer encore un autre post, histoire de ne pas tout mélanger.
Je pense qu'il faut absolument passer tout ton code à jslint, c'est un outils fantastique qui te permettra de clarifier ton code et de corriger quelques erreurs que j'ai vu trainer dans ton exemple. http://www.jslint.com/
-- laurent
ASM
Je pense qu'il faut absolument passer tout ton code à jslint, http://www.jslint.com/
Hou la la ! qu'il est chatouilleux ce jslink !
il lui faut absolument un { après une condition et une ; après la } de fermeture
à ce que j'ai compris sur un mini test.
Je l'ai bookmarqué tout de même qquefois que la console JS de FireFox ne soit pas précise sur un truc ou l'autre.
-- Stephane Moriaux et son [moins] vieux Mac
Je pense qu'il faut absolument passer tout ton code à jslint,
http://www.jslint.com/
Hou la la !
qu'il est chatouilleux ce jslink !
il lui faut absolument un { après une condition
et une ; après la } de fermeture
à ce que j'ai compris sur un mini test.
Je l'ai bookmarqué tout de même qquefois que la console JS de FireFox ne
soit pas précise sur un truc ou l'autre.