JavaScript中でのHTML表現にE4Xを提案してみる
E4X使っちゃダメなんかな。XMLそのままなので冗長といえば冗長だが、標準化されていて使いやすいと思う。ただ、使える環境がモダンなブラウザに限定されてしまうので一般的なJavaScriptには使えないかもしれない。
環境が満たされるなら独自フォーマットよりE4Xの方が楽が出来るんじゃないかな。
var html = <div id="outer" style="width:100px; height:100px; color: #FFFFFF"> <a href="http://google.com">google</a> </div>;
文字列化したいなら
XML.prettyPrinting = false; //おまじない(toString時に綺麗にフォーマットするか否か var str = html.toString(); // <div id="outer" style="width:100px; height:100px; color: #FFFFFF"><a href="http://google.com">google</a></div>
toStriingよりtoXMLStringを使った方が良いかも。
文字列からXMLにしたいなら
var str = '<div id="outer" style="width:100px; height:100px; color: #FFFFFF"><a href="http://google.com">google</a></div>'; var xml = new XMLList(str);
要素の追加削除
xml.*[0] = <p>before</p> + xml.*[0]; //insertBefore的 // <div id="outer" style="width:100px; height:100px; color: #FFFFFF"> // <p>before</p> // <a href="http://google.com">google</a>< // </div> xml.*[0] += <p>after</p>; //apendChild的 // <div id="outer" style="width:100px; height:100px; color: #FFFFFF"> // <p>before</p> // <a href="http://google.com">google</a>< // <p>after</p> // </div> delete xml.*[0]; // <div id="outer" style="width:100px; height:100px; color: #FFFFFF"> // <a href="http://google.com">google</a> // <p>after</p> // </div>
DOMに変換したいなら
innerHTMLが使えない環境だと一個関数を作ってやる必要がある。
function xmlToDom(node, doc) { XML.prettyPrinting = false; switch(node.nodeKind()) { case 'text': return doc.createTextNode(node); case 'element': var ns = doc.documentElement.namespaceURI ? doc.documentElement.namespaceURI : 'http://www.w3.org/1999/xhtml'; var domnode = doc.createElementNS(ns, node.localName()); for each(var attr in node.@*) domnode.setAttribute(attr.name(), String(attr)); for each(var child in node.*) domnode.appendChild(arguments.callee(child, doc)); return elm; } } var elm = xmlToDom(xml, document);
注:この関数はオイラの自作じゃなくて、vimperatorのユーティリティ的な関数群に含まれていたもの。