|
|
||
CSS、HTML、XHTML、XML、DOM、XSLT、XPath、ECMAScript、Python、ウェブユーザビリティ、その他に関連する文書等のリソースを挙げていったりします。より本質的な議論を志向。
注意:Hatena::agendaの更新は終了しています!過去の記事はagenda のホームページよりどうぞ。今後の更新情報の取得は、agendaのフィード(XML/Atom)から。
javascript脳を動かす。私はgetElementsByTagNameを回避する方向で。あと、createTextNodeが個人的に見づらいので、テンプレートの各要素に空白文字を入れてdataアトリビュートの書き換えにしてみました。
<script type="text/javascript">
function HTMLWalker(handler){
this.handler = handler;
}
HTMLWalker.prototype.walk = function(node) {
try {
this.handler[node.nodeName](node);
} catch(err) {
if (node === null)
return;
else if (err instanceof TypeError)
// yada yada yada..
"";
}
arguments.callee.call(this, node.firstChild);
arguments.callee.call(this, node.nextSibling);
};
function MyHandler(){
this.resultNode = document.createDocumentFragment();
this["DIV"] = function(node) {
alert("DIV handler called");
node.id = "";
node.style.display = "block";
this.resultNode.appendChild(node);
};
this["H1"] = function(node) {
alert("H1 handler called");
node.firstChild.data = "Title";
};
this["P"] = function(node) {
alert("P handler called");
node.firstChild.data = "Paragraph";
};
this["#text"] = function(node) {
alert("#text handler called");
}
}
function add(){
var handler = new MyHandler();
var walker = new HTMLWalker(handler)
walker.walk(document.getElementById("template").cloneNode(true));
var contents = document.getElementById("contents");
contents.appendChild(handler.resultNode);
}
</script>
<button onclick="add()">add</button>
<div id="template" style="display: none;">
<h1> </h1>
<p> </p>
</div>
<div id="contents">
</div>
意味は無し。