2010-11-06 13 views
4

J'essaie de comprendre comment modifier le DOM pour remplacer un élément avec une table. Le code suivant montre un snafu que j'ai rencontré: si j'essaie de remplacer un élément par un simple paragraphe, cela fonctionne bien, mais si j'essaie d'utiliser une table, rien n'apparaît dans Internet Explorer 8, bien que d'autres navigateurs fonctionnent encore. Comment puis-je réécrire le code pour le faire fonctionner dans tous les navigateurs?Comment remplacer un élément DOM enfant par une table, compatible avec Internet Explorer?

HTML:

<p> 
<a onclick="replaceElementTest(this);">Replace this text</a> 
</p> 

<p> 
<a onclick="replaceWithTableTest(this);">Replace with test table</a> 
</p> 

JavaScript:

// Works in all browsers 
function replaceElementTest(domElement){ 
    var p = document.createElement("p"); 
    p.innerHTML = "This element got REPLACED!"; 
    domElement.parentNode.replaceChild(p,domElement); 
} 

// Doesn't work in IE8 
function replaceWithTableTest(domElement){ 
    var table, tr, td; 

    table = document.createElement("table"); 
    tr = document.createElement("tr"); 
    td = document.createElement("td"); 
    td.innerHTML = "This element got replaced by a TABLE!" 

    table.appendChild(tr); 
    tr.appendChild(td); 

    domElement.parentNode.replaceChild(table,domElement); 
} 
+0

Eh bien, j'utiliser une bibliothèque telle jQuery qui prend en charge la compatibilité cross-browser ... n'a pas affiché cette réponse que parce que Je ne sais pas si cela pourrait être une option? – Lucero

+0

Peut-être essayer de changer le innerHTML après que vous appendChild (Je ne peux pas le tester moi-même, je n'ai pas IE8 pour le moment) – DaiYoukai

+0

Changer le innerHTML après appendChild n'avait aucun effet visible. Je prévois d'utiliser éventuellement jQuery, mais je pense que je devrais d'abord me familiariser avec au moins quelques différences de navigateur. – camomilk

Répondre

1

Merci à Erik Noren pour partager this link:

Remarque Internet Explorer exige que vous créez un tbody élément et l'insérer dans la table lors de l'utilisation du DOM. Comme vous manipulez directement l'arborescence du document, Internet Explorer ne crée pas le tBody, ce qui est automatiquement implicite lors de l'utilisation de HTML.

Ce code JavaScript révisé fonctionne dans IE8:

function replaceWithTableTestA(domElement){ 
    var table, tBody, tr, td; 

    table = document.createElement("table"); 
    tBody = document.createElement("tbody"); 
    tr = document.createElement("tr"); 
    td = document.createElement("td"); 

    table.appendChild(tBody); 
    tBody.appendChild(tr); 
    tr.appendChild(td); 

    td.innerHTML = "This element got replaced by a TABLE!" 

    domElement.parentNode.replaceChild(table,domElement); 
} 
+0

+1 Pour revenir et poster la solution à votre problème. –

2

Internet Explorer a quelques problèmes avec les tableaux. La plupart des éléments utilisés dans une table sont en fait en lecture seule et cela peut être à l'origine de certains problèmes que vous rencontrez. Dans un projet sur lequel j'ai travaillé, j'ai fini par remplacer toutes mes tables par des tableaux CSS pour contourner la limitation.

http://support.microsoft.com/kb/239832

Certains documents font référence à l'utilisation de la "Table Object Model" pour faire la manipulation.

http://msdn.microsoft.com/en-us/library/ms532998(VS.85).aspx

+0

Jolis liens, le second contenait la réponse à ma question: "Remarque: Internet Explorer nécessite que vous créiez un élément tBody et l'insériez dans la table lors de l'utilisation du DOM. Puisque vous manipulez directement l'arborescence du document, Internet Explorer ne crée pas le tBody, qui est automatiquement impliqué lors de l'utilisation de HTML. " – camomilk