Dojo ToolkitでDOM操作

この記事はバージョン1.7以降の記法に基づいて書いています。
Dojoではバージョン1.7以降、使う関数ごとに細かくモジュールを指定する必要があるようです。
逆に、依存するモジュールをしっかり指定することで、
通常のライブラリではそのとき使わない機能にまでロード待ちさせられる所を、
そのページで必要な機能だけロードされた瞬間に動かせます。
Dojoの設計方針として、多少記述が面倒くさくなろうとも速度・効率を重視しているようです。

2018/09/30追記:
サンプルのリンク先をJSFiddleに置き換え。

DOMノードの取得

主にdojo/domとdojo/queryを使います。
dojo/domモジュールにはbyIdという関数が定義されていて、document.getElementByIdの代わりに使えます。
dojo/queryでは、CSSセレクタ形式でDOM要素を取得可能で、getElementsByClassNameやgetElementsByTagNameの代わりとして使えます。
以下サンプルです。ブラウザがDOM構造を読み込むのを待つため、dojo/domReady!も指定しています(サンプル)。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>DojoでDOMノードの取得</title>
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.js"
    data-dojo-config="parseOnLoad:true,async:true,isDebug:true"></script>
</head>
<body>
<ul>
    <li id="one">要素1</li>
    <li id="two">要素2</li>
    <li id="three">要素3
    <ul>
        <li>要素3-1</li>
        <li class="last">要素3-2</li>
    </ul>
    </li>
</ul>
<script>
require([
    "dojo/dom",
    "dojo/query",
    "dojo/domReady!"
], function(dom, query) {
    dom.byId("one").innerHTML += "→byIdで取得されました。";
    // ノードへの参照を取得
    var two = dom.byId("two");
    dom.byId(two).innerHTML += "→ノードへの参照も渡せます。";
    var lasts = query("#three li.last");
    lasts[0].innerHTML += "→複雑な指定はqueryで";
});
</script>
</body>
</html>

DOMノードの属性変更

dojo/dom-attr、dojo/dom-style、dojo/dom-classなどを使います。
特にdom-classでは、クラスの追加や削除、置換、トグルなど細かいメソッドが充実しているようです(サンプル)。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>DojoでDOMノードの変更</title>
<style>
.greenFont {
    color: green;
}
.blackBorder {
    border: solid black 1px;
}
.pinkFont {
    color: pink;
}
</style>
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.js"
    data-dojo-config="parseOnLoad:true,async:true,isDebug:true"></script>
</head>
<body>
<ul>
    <li id="one"><a id="link">要素1</a></li>
    <li id="two">要素2</li>
    <li id="three">要素3</li>
    <li id="four">要素4</li>
</ul>
</body>
<script>
require([
    "dojo/dom",
    "dojo/query",
    "dojo/dom-attr",
    "dojo/dom-style",
    "dojo/dom-class",
    "dojo/domReady!"
], function(dom, query, domAttr, domStyle, domClass) {
    // 指定したノードの属性を変更
    domAttr.set("link", "href", "https://www.google.com/");
    // 対象のノードが
    if (domAttr.has("link", "href")) {
        // 第1引数はidプロパティの値でも、ノードへの参照でもOK
        domAttr.set(dom.byId("link"), "innerHTML", "リンクが設定されています。");
    }
    // 指定したノードのスタイルを変更
    domStyle.set("two", "color", "red");
    var two = dom.byId("two");
    domAttr.set(two, "innerHTML", "現在の色: " + domStyle.get(two, "color"));
    // クラスの設定(それぞれ空白で区切れば同時指定可能)
    // 追加
    domClass.add("three", "greenFont blackBorder");
    var four = dom.byId("four");
    domClass.add(four, "greenFont");
    // 入れ替え
    domClass.replace(four, "pinkFont", "greenFont");
    // トグル
    domClass.toggle(four, "blackBorder");
});
</script>
</html>

DOMノードの作成・追加・削除

dojo/dom-constructを使います。
今回は要素が空になる様子を確認するため、dojo/onモジュールでボタンにイベントを追加しています(サンプル)。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>DojoでDOMノードの変更</title>
<style>
.greenFont {
    color: green;
}
</style>
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.js"
    data-dojo-config="parseOnLoad:true,async:true,isDebug:true"></script>
</head>
<body>
<button id="emptyButton">try empty</button>
<ul id="container">
    <li id="one"><a id="link">要素1</a></li>
    <li id="two">要素2</li>
    <li id="three">要素3</li>
</ul>
<script>
require([
    "dojo/dom",
    "dojo/dom-construct",
    "dojo/on",
    "dojo/domReady!"
], function(dom, domConstruct, on) {
    // 第2引数にプロパティを指定して要素を作成
    var li = domConstruct.create("li", {
        innerHTML : "新しい要素です。",
        class : "greenFont"
    });
    // 最初の子要素としてidが"container"の要素に追加
    domConstruct.place(li, "container", "first");
    var li2 = domConstruct.create("li", {
        id : "new2",
        innerHTML : "新しい要素その2です。",
        class : "greenFont"
    });
    // 第3引数を省略すると最後の子要素として追加
    domConstruct.place(li2, "container");
    // 作成時にそのまま設置
    domConstruct.create("li", {
        innerHTML : "新しい子要素その3です。",
        class : "greenFont"
    }, "new2", "before");
    // idが"two"の要素を削除
    domConstruct.destroy("two");
    // ボタンを押すとidが"container"の要素を空に
    on(dom.byId("emptyButton"), "click", function() {
        domConstruct.empty("container");
    });
});
</script>
</body>
</html>