ウェブDeBLOG | トライデントコンピュータ専門学校 Webデザイン学科

トライデントWebデザイン学科の最新情報を紹介しています。学生へのインタビュー記事から学生作品の解説、Webデザイン・マークアップ・プログラミングの授業風景、プロジェクト発表会、名古屋のWeb制作会社情報、イベント参加レポートやWeb制作の技術解説記事などWeb制作に関連する記事を掲載しています。トライデントコンピュータ専門学校は、いま話題の名古屋駅から地下街を歩いて3分です。 

2017.01.23 [月] NodeList と HTMLCollection と Node.appendChild() と

JavaScriptを書いていると、Chrome Developer Toolsのコンソールに「Nodeが…」なんてエラーを、たびたび戴きます。

Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
「appendChild使うときは、Nodeじゃないとダメだよ」

その都度、Googleで調べたり書き直したりして対処していたのですが、すぐに忘れてしまうので備忘録として書いておきます。

javascript20170118-001.jpg

目次

  1. Nodeとは
  2. HTMLCollectionとは
  3. appendChildとは
  4. 動的と静的の違い

Nodeとは

Node(ノード)

NodeとはHTMLの中にあるすべてをNode(節-ふし)という単位で区切ったインターフェースのことを言います。
HTMLの要素はもちろん、テキストや属性、コメントにいたるすべてがNodeになります。
Nodeの種類には、12種類あり、主なものは下の表の太字「Document(ドキュメント)」「Element(要素)」「Attr(属性)」「Comment(コメント)」「Text(テキスト)」などです。

インターフェース解説定数タイプ
Elementエレメント、要素。HTMLタグを表します。ELEMENT_NODE1
Attrアトリビュート、属性。HTMLタグ内の属性。ATTRIBUTE_NODE2
Textテキストノード、タグ以外の文字データや、空白・タブ・改行(=ホワイトスペースノード)。TEXT_NODE3
CDATASectionCDATA セクションCDATA_SECTION_NODE4
EntityReferenceエンティティリファレンスENTITY_REFERENCE_NODE5
EntityエンティティENTITY_NODE6
ProcessingInstruction処理命令PROCESSING_INSTRUCTION_NODE7
Comment<!--から-->で囲まれたコメントCOMMENT_NODE8
DocumentHTML文書全体を表します。JavaScriptでは、documentオブジェクト。DOCUMENT_NODE9
DocumentTypeドキュメントタイプDOCUMENT_TYPE_NODE10
DocumentFragmentドキュメントフラグメントDOCUMENT_FRAGMENT_NODE11
NotationノーテーションNOTATION_NODE12

下記のようなHTMLをDOMツリーとノードで表すと

<!DOCTYPE html>
<html>
<head>

HTML5
<link href="style.css" rel="stylesheet" />
</head>
<body>

DOMとは

DOMとはDocument Objact Modelの略です。

</body> </html>
domtree2017.jpg

となります。
参考:DOMの基本を学ぼう(1):正しいHTMLとドキュメントツリーを理解しよう (1/3) - @IT

NodeList

NodeListオブジェクトは、この縦のノードを配列っぽく並べたものです。
DOMツリーを表したHTMLでbody内のNodeListは、childNodesで取得することができます。
配列っぽくというのは、インデックスで取得できたりして配列っぽく振舞いますが、実際には配列ではありませんので、配列で使える便利なメソッドは利用できません。

var nodelist = document.querySelectorAll('body');
console.log(nodelist[0].childNodes);
NodeList[5]
0:text
1:h1
2:text
3:p#explanation
4:text

個別で取得したい場合は、childNodesをインデックスでつなげて指定することができます。
また、item()でも取得できます。

console.log(nodelist[0].childNodes[1]);
console.log(nodelist[0].childNodes[3]);
console.log(nodelist[0].childNodes[3].childNodes[0]);
console.log(nodelist[0].childNodes[3].childNodes.item(1));
<h1>DOMとは</h1>
<p id="explanation">…</p>
<abbr title="Document Objact Model">DOM</abbr>
"とは"

HTMLCollectionとは

HTMLCollection

HTMLCollectionをMozilla Developer NetworkW3Cのドキュメントで調べてみました。

HTMLCollection は要素群(document 内の順序)の一般的な集合(配列)を表現したインターフェイスで,リストから選択するためのメソッドとプロパティを提供します.

Note: This interface is called HTMLCollection for historical reasons (before DOM4, collections implementing this interface could only have HTML elements as their items).
注意: このインターフェースは歴史的な経緯からHTMLCollectionと呼ばれています。 (DOM4以前は、このインターフェースが実装されたコレクションは、その項目としてHTML要素のみを持つことができました。)

HTML DOM内のHTMLCollection は生きて(live)います; それらは元になったdocumentが変更された時点で自動的に更新されます.

HTMLCollection - Web API インターフェイス | MDN

An HTMLCollection is a list of nodes. An individual node may be accessed by either ordinal index or the node's name or id attributes.
HTMLCollectionはノードのリストです。個々のノードは、序数インデックスまたはノードの名前またはID属性のいずれかによってアクセスできます。

Note: Collections in the HTML DOM are assumed to be live meaning that they are automatically updated when the underlying document is changed.
注:HTML DOM内のコレクションは、基本となるドキュメントが変更されたときに自動的に更新されることを意味するライブと見なされます。

Document Object Model HTML

難しく書いてあるのですが、HTMLCollectionオブジェクトは動的に更新されるNodeListの一種です。
HTMLCollectionで取得することができるメソッドは、下記が代表的です。

  • document.anchors
  • document.forms
  • document.images
  • document.links
  • document.getElementsByClassName()
  • document.getElementsByTagName()
  • node.children

実際にNodeListを取得するquerySelectorAll()とHTMLCollectonを取得するgetElementsByClassName()、さらにjQueryでも取得してみます。

  • リスト1
  • リスト2
  • リスト3
var nodelist = document.querySelectorAll('.list');
var collection = document.getElementsByClassName('list');
var $node = $('.list');
console.log(nodelist);
console.log(collection);
console.log($node);
NodeList[3]
0:li#list1.list
1:li#list2.list
2:li#list3.list
HTMLCollection[3]
0:li#list1.list
1:li#list2.list
2:li#list3.list
r.fn.init[3]
0:li#list1.list
1:li#list2.list
2:li#list3.list

各オブジェクトがconsoleに表示されました。
でも、表示は同じなので、紛らわしいですね。

appendChildとは

Node.appendChild() メソッド

Node.appendChild() メソッドは、特定の親ノードの子ノードリストの末尾にノードを追加します。追加しようとしたノードが既に存在していたら、それは現在の親ノードから除かれ、新しい親ノードに追加されます(他のノードに追加する前にそのノードを親ノードから削除する必要はありません)。

Node.appendChild - Web API インターフェイス | MDN

この「親ノードの子ノードリストの末尾にノードを追加します。」のノードがわかっていないと最初に明記したエラーなどが表示されてしまいます。

jQueryでは、appendメソッドで文字列を追加することもできるので、リスト3の下に「リスト4」を追加したい場合、jQueryで書くと<li>リスト4</li>をそのまま引数に書きます。
classやidも必要であれば、一緒に記入します。

$('ul').append('
  • リスト4
  • ')
    • リスト1
    • リスト2
    • リスト3
    • リスト4
    •  //加わりました。

    と、簡単に追加できるのですが、ピュアなJavaScriotのappendChild()で同じようにすると

    var elm = document.getElementsByTagName('ul');
    elm.appendChild('
  • リスト5
  • ');

    エラーを戴いちゃいます。appendと名称が似ているので、同じ動きを期待しちゃいますよね。

    Uncaught TypeError: elm.appendChild is not a function

    原因は、「親ノードの子ノードリストの末尾にノードを追加します。」のノードがノードじゃないからです。
    親ノードは配列っぽくなっていますので、elm[0]とインデックスを加えます。

    elm[0].appendChild('
  • リスト5
  • ');

    でも、まだエラーがでます。

    Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.

    加える値もノードでないといけません。

    var elm = document.getElementsByTagName('ul');
    var newelm = document.createElement('li');
    newelm.classList.add('list');
    newelm.setAttribute('id', 'list5');
    newelm.innerHTML = 'リスト5';
    elm[0].appendChild(newelm);
    

    createElement('li')で新しくli要素ノードを作り、classとidを設定してinnerHTMLでテキストを加えます。
    これをappendChildすると、リスト5が追加されました。

    静的と動的の違い

    HTMLCollectionとNodeListの違い

    HTMLCollectionの特徴として、動的に要素を取得ができるということです。
    実際に上記の方法で追加した後 li の要素数を表示させます。

    var nodelist = document.querySelectorAll('.list');
    var collection = document.getElementsByClassName('list');
    var $node = $('.list');
    console.log(nodelist.length);
    console.log(collection.length);
    console.log($node.length);
    
    3
    4
    3

    HTMLCollectionで取得した要素数が増えてます。
    いま表示されている最新の状態を動的に更新して取得できるのです。

    また、HTMLCollectionは、インデックスだけでなくid やnameでも取得することができます。

    var nodelist = document.querySelectorAll('.list');
    var collection = document.getElementsByClassName('list');
    console.log(nodelist['list1']);
    console.log(collection['list1']);
    
    undefined
    <li class="list" id="list1">リスト1</li>

    参考:NodeListとHTMLCollectionも別物なので気を付けよう。(DOMおれおれAdvent Calendar 2015 – 13日目)

    関連記事
    Comment







    (編集・削除用)


    管理者にだけ表示を許可
    Trackback
    http://tridentwebdesign.blog.fc2.com/tb.php/578-d127db1a
    検索フォーム
    プロフィール

    担当:Webデザイン学科+

    名古屋駅から歩いて6分、トライデントコンピュータ専門学校のWebデザイン学科を紹介します。

    トライデントロゴ

    質問などはLINEでどうぞ。

    友だち追加数
    Instagram
    Webデザイン学科実績
    <プレゼン>
    WCAN 2016 Springに参加してきました。
    WCAN 2015 Winterに参加しました。
    建設業入職者増加プロジェクトの発表会に参加
    WCAN 2015 Summerに参加してきました。
    WCAN 2013 Winterに参加
    WCAN(秋)に参加しました。
    無事、発表が終わりました【WordFes Nagoya 2013】
    WCAN 2013 Summerに参加してきました。
    WCAN 2011 Winter LT&LOGO
    学生がライトニングトークで話しました。
    <展示会>
    1年生進級展「お母さんの2度見展」を開催中です。
    「うぇ~~~~~~~ぶ2016」終了しました。ご来場ありがとうございました!
    「うぇ〜〜〜〜〜ぶ!!」終了。ご来場ありがとうございました!
    <コンテスト>
    NCF2014(スマホアプリ開発テーマ2) 準グランプリ獲得!
    最優秀賞!HTML5スマートアプリ&クリエイティブコンテスト
    NCF2013グランプリ受賞!!!
    <Webサイト制作>
    建設業入職者増加プロジェクト発表会
    Webサイト制作発表会2014
    99eagle Webサイトリニューアル公開
    99eagle Webサイト公開
    「Bloom*Block」Webサイト公開
    セントレア「日本の四季 キルト展」Webサイト公開
    かっぱ商店街サイト制作
    ココストア共同企画「アサココ!」公開
    <技能五輪全国大会>
    第53回技能五輪全国大会(ウェブデザイン職種)その3
    第52回技能五輪全国大会が開催されました。
    銀メダル・銅メダル獲得【第51回技能五輪全国大会】
    第49回技能五輪全国大会結果発表 敢闘賞受賞
    第48回技能五輪全国大会結果発表(銀賞・敢闘賞受賞)
    第47回技能五輪閉会式 & 結果発表
    第46回技能五輪
    <若年者ものづくり競技大会>
    第11回若年者ものづくり競技大会 2日目&結果
    第9回若年者ものづくり競技大会2日目(競技日)
    第8回若年者ものづくり競技大会2日目
    第7回若年者ものづくり大会
    第6回若年者ものづくり大会2日目
    第5回若年者ものづくり大会
    第4回若年者ものづくり競技大会閉会式
    学生ブログリンク
    <1年生ブログ>

    WF1でBLOG 2017

    <Webデザイン学科2年生ブログ>
    タグリスト 改

    トライデントコンピュータ専門学校Webデザイン学科WCAN業界研究技能五輪ウェブデザイン職種ウェブデザイン若年者ものづくり競技大会2013名古屋Webサイト映画ECCコンピュータ専門学校ポートフォリオ2009Winter学生ブログWebデザインWebサイト制作WordPress2011JavaScript礒田優かっぱ商店街入学式cmsNagoyaライトニングトーク卒業制作展矢野りんa-blogWordpress2014技能五輪全国大会SummerCGイラスト学科Web瀬川大勝テンプレート作成石黒雄介ホームページ・ビルダーAutumn若年者ものづくり大会オープンキャンパス面白法人カヤックアクアリング1年生進級展2012第48回技能五輪全国大会大阪東京研修杉本拓也miniinアクセス解析ウェブデザイン技能競技会html5Flash体験入学JapanHCD2010GIO名古屋駅あいちカレーラーメンコンテストIIJココストアAdobe2015Web制作会社gifアニメ水野裕太CentOSラーメン卒業制作専門学校企業訪問Google卒展田中睦翔人間中心設計マール情報デザインフォーラム学生99eagleBananaAdCSS3合同企業展プレゼンテーションWebワークショップ上村水月情報デザインHTML5ウェブデザイン技能検定愛知県プロジェクトセントレアブログパーツ成田篤紀SpringCMStextarea要素output要素岩手県option要素カリキュラムlabel要素form要素Likefieldset要素legend要素select要素学生インタビューinput要素グループ制作FICCまぼろしうぇーぶナゴヤドーム知多みるくparticlecanvas1年生作品展サイバーエージェント長屋めぐみWEBサイト制作者のためのHCDの理解in名古屋SEO真鍋大度中日ドラゴンズスマホアプリアンティー・ファクトリー企業課題名商連モンキーワークス産学協同スマートフォン鷹野雅弘茂森仙直WordFesトライデント合同企業展ワークショップカメラ和み2008CalendarAdvent写真5T(ファイヴティー)作品集笈瀬本通り空気人形堀尾真衣ビジュアルエディタたこ焼きAnalyticsWebデザインギャラリー佐藤歩レイアウトCSSイラストマップ結果発表トライデントUXiPhoneForumBox塚本碧WordCamp熊谷佳紀F-site名古屋市科学館名古屋開府400年祭静岡阿部淳也卒業式jQuery会社訪問DTPWORLDWebクリエイター能力認定試験閉館日導入授業サーティファイ幕張メッセMarkup就職活動林田実樹豊田市美術館CSSNite謹賀新年Appleメ~テレコミュニケーションデザインワークショップ初期設定戸田芳裕Storeポートフォリオサイト情報デザイン基礎ディプロスウェブデザイン技能競技大会Yahoo!JapanRunstantjbstyleアサココ!中部国際空港株式会社ブラザー工業株式会社WasSalsaCODEポスターデザイン・コンペティションAndrioid増田悟アクセシビリティWEBサイト制作者のためのHCD(人間中心設計)の理解小林信次ITCIRCUS夢プロジェクト2009・成果報告会IA2010キックオフセミナー株式会社アクアリングウェブリテラシー協会第一回セミナー慶華飯店iPhone4森川眞行広島弁GoogleAnalytics会社見学タロヲ横浜デジタルアーツペルソナ1→10design細川太郎石井研二カメラワークAnd金シャチ商店街ThenThereNIKE新横浜ラーメン博物館箱根合宿商店街柴乃櫂人横浜中華街名古屋メディアボンドGA名古屋クリエイターフットサル鎌倉CODEシナリオ技能五輪予選ネスカフェゴールドブレンド大沢たかおWEBサイト制作者のためのHCDの理解道頓堀新世界求人ポスターデザイン・コンペディショングラフィクデザインスタジオジブリ・レイアウト展Twitter知多半島三蔵松坂屋美術館unoplusフナ犬ポートピア名古屋プロ野球プチ・フレーズ笈瀬本通商店サイト制作愛知商業高校名チャリサーバーみの治商店IAチタハン10名駅経済新聞餃子福みつ名古屋サイト改善研究会中級編UltimateWCAN46ビジュアルデベロップメントナゴヤ伊藤頼子プロトコル分析YORKE.武将都市TAFF武豊アニメーションフェスティバル名古屋おもてなし武将隊名古屋グランパス浜松ITホワイトボックスFINALアートアニメーション武豊町TAFF'09FANTASYVIICOMPLETECHILDRENADVENT広告批評WCAN×CSSNiteWebリテラシーデッサンDesign造形基礎HTML+CSS基礎西村真里子プレゼン演習ActionScript基礎TokyoLabuatファルコム音楽フリー宣言音楽ゲーム荒俣宏UNIQLOヤノベケンジカスタマイズセミナーCALENDAR日本ファルコム□□□switch「ヤノベケンジ-ウルトラ」展BlogUTZOOMワークスコーポレーションGENOウィルス山村浩二デコクレセキュリティCS4サムライStefanW+KTokyo(+CRUZ)QubibiArtlessSagmeisterHelvetica2008WinterWebDirectionEast'08デザインのへそNam丹下紘希WEBウェブデザイン部門カンファレンスTHECONTESTHPデザインデザインコンテスト01XRAYSIGGRAPHCollegeFLEXFLASHNightSakaeTEXTURE中村勇吾佐藤可士和MAXデザイナーのためのプログラミング入門鳥取VideopuppetryASIA鳥取砂丘デザインPHP愛知県美術館アンドリュー・ワイエスウルトラ展黒い太陽映画のオープニング閉会式ゆるキャラFlash-Gamesマクロマリオネットマークアップ演習FITCCREAMごはんとFlashwonderflKyotoストリートビューJAPANインターネットクリエイティブアワードYahoo!カラーAutumindotFesHCDプロセスブランディングロゴ公募教育勉強会おかだよういちペルソナ/シナリオ法情報デザイン教育勉強会浅野智ペルソナ&シナリオ法横浜デジタルアーツ専門学校3校合同発表会クリ博就職フェスタウェブDeBLOGヨウイチコピーライティング小野裕子#infoedu山崎デザイン事務所スーパーエレメンツイラストコンテストデュエル・マスターズ長谷川恭久世界のCMフェスティバルPHP勉強会電信柱エレミの恋ウサビッチカナバングラフィックスコマ撮りアニメソバットシアターアイディグラフィックス学生参加CMS特集富岡聡学科国家検定インターネットスキル認定普及協会ライブペイント西田幸司ヱヴァンゲリヲン新劇場版:破旭食品サンプル製作所食品サンプルActionScript今井佳子グラフィックデザインUNIQLOCKギレン総帥LPOナゴヤデザインウィーク2009是枝裕和監督大富豪スコアシート東京ゲームショウ2009人喰いの大鷲トリコ第4回アックゼロヨン・アワードCG・イラストコンテスト後期入賞ガンダムMozoramaアニメーションモーション演習animationescalator日本電子専門学校3CGスペシャリスト松田洋樹3DCG東京コスモ味仙FlexboxUXデザインDmm.com岡田陽一FlexibleBoxクリスマス熊﨑彩Velocity.jsScrollMagicScrollmagic八木智章Webアクセシビリティアクセシビリティからはじめる、WebサイトのUXデザイ第53回ワクワク建設タウン建設経営者倶楽部源賢司アクティビティシナリオウェブアートデザイナーうぇ~~~~~~~ぶワイヤーフレーム仕事レスポンシブWebデザイン職業実践専門課程専門士学位出席率UIバイドゥグロースハッカーグロースハックPlatformKaizen14高校平野健太郎ポートフォリオアイデア帳採用担当者の心に響く竹中民男夏麺フェアoptgroup要素type属性紅茶専門店Liyn-anアイテムカンパニーkeygen要素datalist要素第52回技能五輪全国大会HTMLbutton要素ネイルサロンマウア授業加藤ひとみ西岡克真AnimationAO山田拓生青山敬司アイチータ結団式愛知県選手団オリエンタル麺の匠森田霞HighlighterSyntaxCrayonマークアップエンジニアアップルップル飯田淳介フロントエンドエンジニア木村哲朗2015年度新入生NTTドコモ東海NCF2014新年のご挨拶親孝行名古屋駅麺通りCSS3&jQueryで作るWF1でBLOGインターンシップスマートフォンサイトUI図鑑合同制作合宿合同制作HTMLCollectionNodeList美大芸大appendChild()Webプログラミング初級講座お母さんの二度見展学習進級展マイクロソフト水野怜美株式会社LIGいな世驛麺通り再進学醐りょうインスタグラム料理ドラマInstagramライデントコンピュータ専門学校ECMAScript山川綾那鈴木雄太フォトアルバムスタジオディテイルズ株式会社エイチーム梅澤朝樹出張講座尾鷲高校衣台高校服部友厚佐藤洋介SyntaxHighlighter制作合宿ES2015ES6v4.0.1WCAN2017Springターミナル学校Proxy学園祭情報系カークスヴィルIA/UXプラクティス平野秀幸坂本貴史沼田啓助河地芳明CodePenプログラムクイズAO入試制作実績津田直明WebディレクターWeb制作のおしごと懇親会合宿WebデザイナーWebプログラマー2016原一浩坂本邦夫JSBinJSFiddle夏休みジムナストコロン日清食品グループタカガールサイト夏季閉館日トライデント祭りMonaca学生作品集沖縄水曜日のカンパネラプラネタリアン涼麺jsdo.itCodeplyPlunker駅麺通りクイズResurgenceDay:Independence特別授業青空学区東京ゲームショウ神戸神戸国際展示場ゲーム大賞アマチュア部門Ohanaツインメッセ静岡静岡県ロゴマークメールマガジン鈴木プラネタリウムGATEDRAGONドラゴンゲート愛知淑徳大学ゴールデンウィークGoogleロゴライアン・ウッドワードマーサ・グレアム5月11日敢闘賞迎春GAMETOKYO東京ゲームショウ2012第7回若年者ものづくり競技大会SHOWベースキャンプ名古屋IllustratorSVGFacebookページ尾花大輔Bloom*BlockFuturedocomoドコモ2011年度StationNHNBloosumTeamイマジンカップみつけもの恵那市岩村キルターズフェスティバル2011笈瀬本通商店街名古屋市中村区FLAVER3.0放課後のプレアデスSUBARU日本の四季中部国際空港GAINAXFLV8341-3:2010PluginLoadLazy大西健太forSlimbox2XJISウェブリテラシー協会キルト展愛知県立芸術大学北岡弘至伊達千代DTPの勉強部屋ablogcmsMagnumJAPANWORLDCUPプロジェクションマッピングバルサマンノートPC貸与トライデントカレッジCustomSmilies絵文字円JOY!map卒業・修了制作展KtaistyleぬいぐるみのラパンUntitled!!!!!!!!英国王のスピーチ卒業制作・研究発表会2011長野結果parseInt()DesignergoogleGWDparseFloat()備忘録中村健太道家陽介concrete5栗山聡一F81教室トライデント合同企業説明会HTML5スマートアプリ&クリエイティブコンテストモテ声ボーダーlist-itemdisplayKDDIジョルテ10日でおぼえるLinuxサーバー入門教室卒業研究制作展最優秀賞ランチ石原愛実丸高アロチ本家和歌山中華そば熊野三山丸田屋岩出本店名古屋市営地下鉄柏木祥太スパルタキャンプ大門坂那智の大滝名古屋マークアップ勉強会tableテーブル宇野剛志マカベン熊野古道本州最南端串本八鬼山list-style-typeNTTドコモ東海支社木下健太郎就職東京佐藤ねじThree.jsプレゼンRhizomatiks田代豊たにぐちまことみんなのICTウェブアクセシビリティ画像をチェックボタンにする張山大祐JQuery第50回MuseWeb制作合宿モリサワFacebookたこ焼きパーティinspiredbyNEXT高橋雅人カレーラーメン麺やOKCOMMUNICATIONAWARDNCF2013美術大学芸術大学麺屋ココイチフジ家55あいちトリエンナーレ2013そこにいない。展PARTYPerfumeWebデザイン演習第51回技能五輪全国大会さかなや晴れやか嵐が如く田中稚妃呂

    メールフォーム

    名前:
    メールアドレス:
    件名:
    本文:

    東京コスモ
    トライデントコンピュータ専門学校
    Pagetop