OVH Cloud OVH Cloud

tbody.innerHTML et IE

12 réponses
Avatar
David JOURAND
Bonjour,

Je réalise un tableau triable...

Soit le code HTML suivant :

<table>
<thead><tr><th>En-tête</th></tr></thead>
<tbody id="refreshable"></tbody>
</table>

et le code JavaScript (utilisant prototype) suivant :

node = $('refreshable');
node.innerHTML = '<tr><td>Valeur</td></tr>';

L'instruction node.innerHTML = ... plante sous IE (mais pas sous FF) !

Quelqu'un saurait-il d'où vient le problème ?

En attendant de trouver une solution je réécris entièrement le tableau
(id="refreshable" placé sur la balise <table>), ce qui provoque un
clignotement lors du rafraichissement.

--
David Jourand

10 réponses

1 2
Avatar
Elegie
David JOURAND wrote:

L'instruction node.innerHTML = ... plante sous IE (mais pas sous FF) !


Sous IE, innerHTML est en lecture seule pour les éléments de type TBODY.

<URL:http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/innerhtml.asp>

En attendant de trouver une solution je réécris entièrement le tableau
(id="refreshable" placé sur la balise <table>), ce qui provoque un
clignotement lors du rafraichissement.


Pour info, les scripts de tri de tableau n'utilisent généralement pas
innerHTML, trop gourmand en ressources et donc subséquemment bien lent,
mais suivent plutôt un fonctionnement en deux étapes:

[1] récupération des données de façon optimisée, constitution d'une
liste triable de type {élément de comparaison; référence vers la ligne
(TR) correspondante}, tri de la liste en utilisant
Array.prototype.sort(comparateur efficace); possibilité de conserver un
cache;

[2] réorganisation des lignes (TR) en fonction de leur position triée,
en utilisant les méthodes de manipulation de nodes (insertBefore,
appendChild) - avec un intérêt sous Gecko à effecter cette opération en
détachant préalablement l'arbre représentant la table complète, de
l'arborescence globale.

<URL:http://www.litotes.demon.co.uk/example_scripts/fastTableSort_src.html>


HTH.

Avatar
David JOURAND
L'instruction node.innerHTML = ... plante sous IE (mais pas sous FF) !


Sous IE, innerHTML est en lecture seule pour les éléments de type TBODY.

<URL:http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/innerhtml.asp>


Merci pour l'explication.


Pour info, les scripts de tri de tableau n'utilisent généralement pas
innerHTML, trop gourmand en ressources et donc subséquemment bien lent,
mais suivent plutôt un fonctionnement en deux étapes:


En quoi innerHTML est-il gourmand en ressources ? Avez-vous un article la
dessus ?


[1] récupération des données de façon optimisée, constitution d'une
liste triable de type {élément de comparaison; référence vers la
ligne (TR) correspondante}, tri de la liste en utilisant
Array.prototype.sort(comparateur efficace); possibilité de conserver un
cache;

[2] réorganisation des lignes (TR) en fonction de leur position triée,
en utilisant les méthodes de manipulation de nodes (insertBefore,
appendChild) - avec un intérêt sous Gecko à effecter cette opération
en détachant préalablement l'arbre représentant la table complète,
de l'arborescence globale.

<URL:http://www.litotes.demon.co.uk/example_scripts/fastTableSort_src.html


Je vais creuser cette piste.

--
David jourand


Avatar
Elegie
David JOURAND wrote:

En quoi innerHTML est-il gourmand en ressources ? Avez-vous un article la
dessus ?


Hm non, et je pense m'être avancé un peu vite, après réflexion :)

En fait, la propriété innerHTML fait appel à un parser qui doit traiter
une chaîne pour en désérialiser des nodes, puis les insérer dans le
document, alors que les méthodes DOM peuvent manipuler directement les
éléments, sans besoin d'interprétation lexicale, et de façon "chirugicale".

Dans le cas qui nous occupe, le problème d'innerHTML est alors que tout
le tableau doit être retracé, alors que certaines lignes sont peut-être
déjà triées (le repositionnement n'est alors pas impératif) - j'en
imaginais donc un potentiel hit de performance.

Toutefois, et mon argument pèche un peu ici je l'avoue, il serait erroné
de déduire de façon générale la supériorité de méthodes DOM sur
innerHTML ou le contraire; tout dépend de l'utilisation qui en est faite
et de la plate-forme cible (sous réserve que les méthodes DOM et/ou
innerHTML soient supportés).

Dans notre cas, tout dépendrait du nombre de lignes à déplacer, et il ne
m'apparait plus nécessairement comme un mauvais choix d'utiliser la
mécanique interne de innerHTML pour retracer la totalité de la table
efficacement, plutôt que de déplacer les nodes qui doivent l'être (car
ils peuvent être nombreux, ce qui implique un overhead "javascript"
potentiellement lourd, résultat d'appels multiples de méthodes DOM au
lieu d'un appel unique à innerHTML).

FWIW. HTH.

Avatar
ASM
Bonjour,

Je réalise un tableau triable...


http://ygda.free.fr/sortTableByCols.htm
http://www.kryogenix.org/code/browser/sorttable/
http://www.letselplein.nl/~exemplarisch/sort-table/sort-table-rows

--
Stephane Moriaux et son [moins] vieux Mac

Avatar
Guy
Bonjour,

Je réalise un tableau triable...

Soit le code HTML suivant :

<table>
<thead><tr><th>En-tête</th></tr></thead>
<tbody id="refreshable"></tbody>
</table>

et le code JavaScript (utilisant prototype) suivant :

node = $('refreshable');
node.innerHTML = '<tr><td>Valeur</td></tr>';

L'instruction node.innerHTML = ... plante sous IE (mais pas sous FF) !

Quelqu'un saurait-il d'où vient le problème ?

En attendant de trouver une solution je réécris entièrement le tableau
(id="refreshable" placé sur la balise <table>), ce qui provoque un
clignotement lors du rafraichissement.

Bonjour,

en consultant msdn à l'adresse
http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/innerhtml.asp?frame=true
il apparait que
innerHTML est une propriété accessible par IE, mais pour construire une
table, MS demande d'utiliser les methodes propres aux tables
"dynamiques" (insertrow, createthead ....)
G
ps: je suppose que la fonction $ fait getElementById !!

Avatar
David JOURAND
Je réalise un tableau triable...


http://ygda.free.fr/sortTableByCols.htm
http://www.kryogenix.org/code/browser/sorttable/
http://www.letselplein.nl/~exemplarisch/sort-table/sort-table-rows


Merci pour ces liens ! Je vais m'en inspirer...

--
David Jourand


Avatar
David JOURAND
Toutefois, et mon argument pèche un peu ici je l'avoue, il serait erroné
de déduire de façon générale la supériorité de méthodes DOM sur
innerHTML ou le contraire; tout dépend de l'utilisation qui en est faite
et de la plate-forme cible (sous réserve que les méthodes DOM et/ou
innerHTML soient supportés).


J'ai quand même l'impression qu'utiliser les méthodes DOM empêche le
"clignotement" observé avec innerHTML...


Dans notre cas, tout dépendrait du nombre de lignes à déplacer, et il
ne m'apparait plus nécessairement comme un mauvais choix d'utiliser la
mécanique interne de innerHTML pour retracer la totalité de la table
efficacement, plutôt que de déplacer les nodes qui doivent l'être
(car ils peuvent être nombreux, ce qui implique un overhead
"javascript" potentiellement lourd, résultat d'appels multiples de
méthodes DOM au lieu d'un appel unique à innerHTML).


Comment évaluer l'efficacité de chacune des méthode ?

--
David Jourand

Avatar
David JOURAND
innerHTML est une propriété accessible par IE, mais pour construire une
table, MS demande d'utiliser les methodes propres aux tables
"dynamiques" (insertrow, createthead ....)


Exact...


ps: je suppose que la fonction $ fait getElementById !!


Tout à fait c'est une fonction définie par la librairie Prototype
(http://prototype.conio.net/)

--
David Jourand

Avatar
Elegie
David JOURAND wrote:

Comment évaluer l'efficacité de chacune des méthode ?


Une foi votre choix théorique effectué, la seule façon d'en évaluer
l'efficacité est d'effectuer quelques benchs sur un cas de tests simple,
sur différents navigateurs.

Typiquement, le cas de tests suivant permet de donner quelques éléments
de réponse, en fonction de 3 facteurs:
[1] le nombre de lignes total à retracer,
[2] le nombre de colones de la table (innerHTML retraçant par nature
toutes les cellules),
[3] le nombre de lignes effectivement déplacées (optimisation possible
avec les méthodes DOM).

Le cas de test ci-dessous, avec les paramètres indiqués, donne les
résultats suivants.

Browser innerHTML DOM
----------- --------- ----
IE 6 281 2625
Moz 1.7 344 234
FireFox 1.5 297 344
Opera 8.54 93 47


En conclusion, je recommanderais d'utiliser les méthodes DOM plutôt que
innerHTML, simplement car seulement l'approche technique me paraît plus
propre.



---
<script type="text/javascript">
var FACTEUR_NBR_LIGNES = 1000;
var FACTEUR_NBR_COL = 10;
var FACTEUR_NBR_REORG = 500;

function writeTable() {
var buf=[];
buf.push("<table id='foo' border='1'>");
for(var ii=0; ii<FACTEUR_NBR_LIGNES; ii++) {
buf.push("<tr>");
for(var j=0; j<FACTEUR_NBR_COL; j++) {
buf.push("<td>"+ii+","+j+"</td>");
}
buf.push("</tr>");
}
buf.push("</table>");
document.write(buf.join(""));
}

function makeTest01(container){
var d1, d2;
d1=new Date();
container.innerHTML=container.innerHTML;
d2=new Date();
document.write("TEST 01 : " + (d2-d1) + "<br>");
}

function makeTest02(table){
var d1, d2;
d1=new Date();
for(var ii=0, r=table.rows; ii<FACTEUR_NBR_REORG; ii++) {
table.appendChild(r[ii]);
}
d2=new Date();
document.write("TEST 02 : " + (d2-d1) + "<br>");
}

writeTable();
makeTest01(document.getElementById("foo").parentNode);
makeTest02(document.getElementById("foo"));
</script>
---

Avatar
David JOURAND
Comment évaluer l'efficacité de chacune des méthode ?


Le cas de test ci-dessous, avec les paramètres indiqués, donne les
résultats suivants.

Browser innerHTML DOM
----------- --------- ----
IE 6 281 2625
Moz 1.7 344 234
FireFox 1.5 297 344
Opera 8.54 93 47




Merci pour ces tests complets !


En conclusion, je recommanderais d'utiliser les méthodes DOM plutôt que
innerHTML, simplement car seulement l'approche technique me paraît plus
propre.


Je crois que 80 % des utilisateurs sont sous IE... par conséquent, aucune
hésitation : innerHTML !

--
David Jourand


1 2