2012-07-22 3 views
5

私は以下の要件があると仮定します:要素がある場合は"x"の要素にe要素を追加し、そうでない場合はeを本文に追加します。 DOMレベル0で別のものが存在しない場合、JQueryで要素を選択するうまい方法がありますか?

、私は書くことができる:ID xとは要素が、最初の論理和が存在しないため、場合

var parent = $("#x") || $("body"); 
parent.append(e); 

:jQueryので

var parent = document.getElementById("x") || document.body; 
parent.appendChild(e); 

を、以下では、ない作業を行います空のjqueryオブジェクトを返す。真実で、偽ではないので、appendは何もしない。私は、しかし、書くことができます。

var parent = $("#x")[0] || $("body")[0]; 
parent.appendChild(e); 

が、jQueryオブジェクトのインデックスを作成することはHTMLElementsに戻って私を取得しているため、この解決策はやや不格好なので、私はappendChildの代わりappend使用しなければなりません。これが機能している間、私はこのレベルの混合が適切であるか、または悪い設計の指標かどうか疑問に思っています。

使用方法があるかもしれませんfirst()?おそらく、最初の要素がid xのdivで、2番目がbodyだったという本質的な配列だったjQueryオブジェクトを作成することができました。私は要素配列を取るjQueryのコンストラクタフォームでこれを行うことができることを知っていますが、次にレベルの混合に戻ります。私はid x($("#x").length)の要素の存在を調べる方法も知っていますが、これがどのようにして "id xが存在する場合は要素"、それ以外の場合は "body"という要素をエレガントにする方法がわかりません。

このような製剤は存在しますか?

答えて

2

代わりの要素を選択するために、jQueryのを使用して、あなたがラップするためにそれを使用することができます。

また

は、ここだけ(それは読みやすさのトレードオフだが)一度各クエリを発射三部形式ですネイティブDOMコール:

$(document.getElementById("foo") || document.body) 

それはまさにエレガント(または実際にも、jQueryを使用して)、また普遍的に適用できる技術はないのですが、あなたは、あなたがに追加することができるものになってしまう(とちょうど比較的安価なjQueryの呼び出しを被るだろう一度)。

あなたはfirst()使用することはできません - それは、選択した要素を返した順序がDOMの順序に基づいているため、あなたはまた、ないセレクタ順(おかげで、@muistooshort)

+0

ああ、これはかなりですが、jQueryがここで本当に深刻な魔法を働かない限り、短絡の代わりに最初の要素を返す前にすべての*要素を選択するというパフォーマンスの欠点があります。それでもパフォーマンスのレベルを気にしていれば、まずはjQueryを使用するべきではありません。 – Matchu

+3

いいえ、これは動作しません。「返されたjQueryオブジェクトのDOM要素の順序は、ドキュメント順になるので同じではないかもしれません。」](http://api.jquery.com/multiple-セレクタ/)。例:http://jsfiddle.net/ambiguous/edYY6/。毎回 ' 'が表示されます。 –

+0

これはとても良いことに同意しました。最初のものはページ上で一意でなければならないIDを持ち、2番目のものは** the ** body要素ですから、どちらか一方のIDは大丈夫です(またはそうでなければなりません)。 HTMLにはこれらのうちの1つだけあるべきです。 –

3

正直なところ、私は本当にこれは非常に冗長であるとは思わない:

var parent = $('#x'); 
if(parent.length == 0) parent = $('body'); 

、その意図も非常に明確です。このイディオムがたくさん出てくると、関数にラップすることさえできます。

var parent = (x = $('#header')).length ? x : $('body'); 
+2

可能性 - 例えば、$("#foo, body").first();を'$("#x ")を使います。 $( "#x"):$( "body") '。 –

+0

クイック返信をありがとう。 1ライナーを求めるのは悪い気がします(あまりにも一般的ですが、私は知っています!!)しかし、DOMレベル0は簡潔な定式化があり、jqueryはおそらく必要であることに驚きました。 :) –

+0

@RayToal:パフォーマンスの良い1ライナーを追加しましたが、それは明らかに読みにくいです。私はまだ関数で2行バージョンをラップすることによってそれを1行にして投票したいと思います。 – Matchu

関連する問題