2011-07-25 6 views
0

この質問は、私の以前の質問hereに興味がある場合に備えています。getElementById()経由で動的に作成されたHTML要素(JavaScriptを介して)にアクセスできない

私はwindow.open()でウィンドウを作成していますが、ウィンドウがロードされたときに(子ウィンドウ内から)この関数を呼び出しています(onload経由)。チュートリアルから借用したこの関数は、基本的にタブ付きのテキスト領域を作成します。

function appendToBody(){ 
    for (moduleName in codes){ 
     //create text area 
     console.log(moduleName+' creating text area'); 
     var textArea = document.createElement('textarea'); 
     textArea.setAttribute('rows', '30'); 
     textArea.setAttribute('cols', '105'); 
     textArea.value = codes[moduleName]; 
     console.log(textArea); 

     //create div 
     console.log(moduleName+' creating div'); 
     var div = document.createElement('div'); 
     div.setAttribute('class', 'tabContent'); 
     div.setAttribute('id', moduleName); 
     div.appendChild(textArea); 
     console.log(div); 

     //create link 
     console.log(moduleName+' creating link'); 
     var link = document.createElement('a'); 
     link.setAttribute('href', '#' + moduleName); 
     console.log(link); 

     //add link to li 
     console.log(moduleName+' adding link to li'); 
     var li = document.createElement('li'); 
     li.appendChild(link); 
     console.log(li); 

     //add li to ul 
     console.log(moduleName+' Adding li to ul'); 
     var ul = document.getElementById('tabs'); 
     ul.appendChild(li); 
     console.log(ul); 
    } 
    foo(); 
} 

関数fooは、その後、いくつかの前処理を行い、だったので、(私は主にコピーし、このコードを貼り付け)

var tabLinks = new Array(); 
var contentDivs = new Array(); 

function init() { 

    // Grab the tab links and content divs from the page 
    var tabListItems = document.getElementById('tabs').childNodes; 
    for (var i = 0; i < tabListItems.length; i++) { 
     if (tabListItems[i].nodeName == "LI") { 
      var tabLink = getFirstChildWithTagName(tabListItems[i], 'A'); 
      var id = getHash(tabLink.getAttribute('href')); 
      tabLinks[id] = tabLink; 
      contentDivs[id] = document.getElementById(id); 
     } 
    } 
} 

document.getElementById('tabs')tabsがハード文書本体にコード化されているように動作しますが、document.getElementById(id)、のように見えます動的に作成され、nullを返します。私は名前を確認し、彼らは同一です。動的に要素を作成するときに考慮する必要がある余分なことはありますか?

+0

あなたは名前を確認しましたが、idを(console.logなどで)チェックしましたか? – cwallenpoole

+0

あなたはどのブラウザを使用していますか?ほとんどのブラウザには、この種のものをデバッグするのに非常に便利なデベロッパーツール機能が付属しています。 DOM内で実際にどのような要素が表示されているかを確認することができます。これは、どこが間違っているかを確認するのに役立ちます。 – Spudley

+0

私はクロムを使用していますが、私はデバッグツールを試したことがないと認めなければなりません。 – puk

答えて

0

あなたのinit関数のifで "nodeName"を "tagName"と誤っています。 childNodesはすべてのノード(他のDOM要素とテキストノード)を返すので注意してください。テキストノードにはtagNameプロパティがないので、JavaScriptエラーが発生する可能性があります。私は2つの変更を提案する。 childNodesの代わりに、子(DOM要素のみ)を使用します。 nodeNameの代わりにtagNameを使用してください:

var tabListItems = document.getElementById('tabs').children; 
for (var i = 0; i < tabListItems.length; i++) { 
    if (tabListItems[i].tagName == "LI") { 
     var tabLink = getFirstChildWithTagName(tabListItems[i], 'A'); 
     var id = getHash(tabLink.getAttribute('href')); 
     tabLinks[id] = tabLink; 
     contentDivs[id] = document.getElementById(id); 
    } 
} 
+0

私はこれらの変更を行いましたが、すぐに問題を解決することはできませんでした。一つのことは、 'documents.all'のすべての要素を' console.log'にダンプすると、 'setAttribute( 'id'、name)'で属性を設定してもid属性を持たないことに気付きます。それがどんなアイデアなのか? – puk

+0

idsを持つ唯一のものはdivです。何にも付加されていないようです(そのためドキュメントには含まれていないようです)。各divを作成した後に、something.appendChild(div)を追加する必要があります。 – James

+0

私はそんなにばかです。問題は、静的な実装から動的な実装に移行したので、body内のdivを宣言することによって追加されることを忘れてしまったということです – puk

関連する問題