要素がDom
ノードに追加されているかを調べる。
例えば、まだDom
ノードに追加されていない要素の高さや幅を取得しようとしても0
が返ってくる。
これではまずいこともあるだろう。
ということで、こんな関数を書いてみる。
function isAddedToDom(elm){ while (elm.parentNode && elm.parentNode.tagName) { elm = elm.parentNode; } return elm.tagName.toLowerCase() === "html"; }
tagName
まで見ている理由fragment
でループから抜けるDocument(elm.ownerDocument)
にまで到達しないようにする
親要素が
fragment
であれば、まだその要素はDom
に追加されていないということなので、その時点でループから抜ける。また、この
while
ループはほっとくと ownerDocument
にまで到達してしまう場合がある。ownerDocument
はDom
に追加されていない要素でも同様に取得できてしまう。そこで
tagName
を見ることによってownerDocument
まで到達しないようにする。この関数をjQueryで使う
$.extend($.expr[':'],{ addedToDom: function (elm){ //tagNameを見る理由 // - fragmentで抜ける // - Document(elm.ownerDocument)にまで到達しないようにする while (elm.parentNode && elm.parentNode.tagName) { elm = elm.parentNode; } return elm.tagName.toLowerCase() === "html"; } });
Usage
is
を使うfunction foo( elm ){ if ($(elm).is(":addedToDom")) { //something... } }
filter
を使うvar elm = $("foo").filter(":addedToDom");
0 Comments:
コメントを投稿