プログラマメモ2 - programmer no memo2

DOMCharacterDataModifiedをひろって、編集した内容をプログラムでさらに変更しようというための試み 2013/01/06
2013/01/07

DOMCharacterDataModifiedをひろって、編集した内容をプログラムでさらに変更しようというための試みのためのメモ

ためしたのはJavaFXのHTMLEditorのwebkitです。

DOMNodeInsertedを設定したあと、insertされたnodeごとにDOMCharacterDataModifiedを設定してゆく。

この方法をとると、Textをもつ子ノードの親ノードまでイベントを発行するので、setCancelBubbleをtrueにイベントの発行をとめるようにすると該当の変更だけ受け取ることができた。

 さて、つぎに対象のテキストの変更がどのノードでおこっているのかを知るのは、
org.w3c.dom.events.Eventにある

getCurrentTarget() 
現在 EventListeners を処理している EventTarget を示す場合に使用します。

getTarget()  
イベントが最初にディスパッチされた EventTarget を示す場合に使用します。 

を使う。DOMCharacterDataModifiedでおこるEventでは、getTargetがTextノードとなる。getCurrentTargetには、Textノードを内包している親ノードとなるので、ここからDOMツリーのどこの部分かわかる。


特定のタグを消したい 2012/12/10

Javaです。
「XMLから特定のタグだけを消して、その子のノードはそのままにしたい」
順繰りみていきながら、特定のタグで特定なクラス名だけを削除するという実装にしています。
むずかしかったのはその子の要素をそのままにしたいので、子のクローンを用意して、消したいノードの場所に次々と足すということをしています。気がついたらなるほどねということのなのでしょうけども。

はじめ子のクローンでなくそのもので足していたったら、JVMがぽこーんと落ちたので(正確には、JavaFXの上のHTMLEditorなのですが) ようやくクローンしないといけないことに気がついたのでした。


/** * * @param document * @param rootNode * @param tag * @param className */ public static void removeNodeByTagNameAndClassName(Document document, Node rootNode, String tag, String className) { NodeList nodeList = rootNode.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); removeNodeByTagNameAndClassName(document, node, tag, className); if (Node.ELEMENT_NODE == node.getNodeType()) { Element element = (Element) node; Attr attr = element.getAttributeNode("class"); if (element.getTagName().toUpperCase() .equals(tag.toUpperCase()) && attr != null && attr.getValue().equals(className)) { NodeList nodeList2 = element.getChildNodes(); Node parent = element.getParentNode(); for (int j = 0; j < nodeList2.getLength(); j++) { Node newChild = nodeList2.item(j).cloneNode(true); parent.insertBefore(newChild, element); } parent.removeChild(element); } } } }