2016-05-23 4 views
0

TreeWalkerを使用して、特定のノードのすべての祖先を効率的にチェックすることを考えようとしていますか?効率的にDOMツリーを歩いて、nodeTypeと属性をチェックしますか?

具体的には、nodeTypeが<input>または<textarea>であるか、またはcontenteditable="true"であるかどうかを確認したい場合は、祖先が一致する場合はtrueを返します。

再帰関数は問題ありません。

+1

私は、ダックタイピングが最速のパフォーマンスであることを発見しました。 'var u; if(elm.value!= u || elm.contentEditable!= u) '...もちろん、SELECTとLIも' .value'を定義していますので、もう一つの節が必要ですが、 -sniffingパターンは、viaメソッドまたは複数のIFを比較するよりも高速です。それ以外は 'elm.parentNode'を何も見つからないようにしておきます。 – dandavis

+0

彼らは答えることができます。 '$ 0.appendChild(document.createElement(" span "))' – neaumusic

+1

'input'と' textarea'はノード型ではありません( 'nodeType'値として返されることはありません)。それらは要素名です。したがって、 'Node'が' nodeType''の 'ELEMENT_NODE'であるかどうかを確認し、次に' Element'オブジェクトを取り出し、 'Element.localName'をチェックする必要があります。 – Anthony

答えて

1

単純な反復的なツリーの登りで、目的の結果が得られます。

function findParentNodes(node) { 
    var parent = node.parentNode; 
    while(parent) { 
    if(parent.nodeName === 'INPUT' || 
     parent.nodeName === 'TEXTAREA' || 
     parent.getAttribute('contenteditable') === 'true') { 

     return true; 
    } 

    parent = parent.parentNode; 
    } 
    return false; 
} 
+0

contentEditableが文字列 '' true ''である必要があるため、これは間違っています – neaumusic

+0

'contentEditable'プロパティを単に使用しないでください:' parent.contentEditable === true'はブール 'true'または' false'を返します。 *属性*は '' true ''を(Stringとして)返すかもしれませんが、プロパティはブール値を返します。 (うっかり単純な)[デモ](https://jsfiddle.net/davidThomas/edsq9ugp/)(コンソール内)を参照してください。 –

関連する問題