2012-07-22 24 views
5

Aşağıdaki gereksinime sahip olduğumu varsayalım: e öğesinin elemanına "x" kimliğine sahip eleman eklenmesi halinde, aksi takdirde e gövdeye ekleyin.Başka bir tane yoksa JQuery'de bir öğeyi seçmenin zarif bir yolu var mı?

DOM 0 seviyesine yılında

, yazabilirim: jQuery yılında

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

, şunları yapar değil eser:

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

çünkü eğer id x var olan hiçbir unsur, disjunct ilk boş jquery nesnesini döndürür, doğrulukla değil, falsy ile append hiçbir şey yapmaz. Ben Ancak yazabilirsiniz:

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

ama jQuery nesnesi indeksleme HTMLElements beni geri alır çünkü bu çözüm biraz aksak, yani appendChild yerine append kullanmalıdır. Bu çalışırken, bu seviyelerin karıştırılmasının uygun olup olmadığını veya kötü tasarımın göstergesi olup olmadığını merak ediyorum.

first()'u kullanmanın bir yolu olabilir mi? Belki de ilk elemanı id x ile div ve ikincisi de gövdesi olan bir dizi olan bir jQuery nesnesi oluşturabilirim. Bunu bir eleman dizisi alan jQuery yapıcı form ile yapabilirim, ama sonra seviyelere bir karıştırma için geri döndüm. Ayrıca x ($("#x").length) kimliğine sahip bir elemanın varlığını nasıl kontrol edeceğimi de biliyorum, ancak bunun, "eğer var ise, kimlik x ile elemanın" ifadesini ifade etmenin zarif bir yoluna nasıl yol açacağını göremiyorum.

Böyle bir formülasyon var mı?

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

Ve niyet da oldukça net:

cevap

2

yerine elemanı seçmek için jQuery kullanarak, sen sarmak için kullanabilir:

Ayrıca

, burada sadece (bir okunabilirliğe ticaret-off olsa) bir zamanlar her sorgu tetikleyen bir üçlü form yerli DOM çağırır:

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

tam zarif (veya gerçekten hatta jQuery kullanarak), ne de evrensel olarak uygulanabilir bir teknik değil, ama sen eklenecek bir şey ile bitirmek (ve sadece nispeten ucuz jQuery çağırmayı tabi olacak bir kez).

Kullanılacak mümkün olmayacaktır first() - örneğin $("#foo, body").first(); - bu unsurları seçilmiş döndürür sırası DOM siparişi temel nedeni, sipariş Seçiciye değil (teşekkürler, @muistooshort) Ayrıca olabilir

+0

Ooh, bu çok güzel - jQuery burada gerçekten çok ciddi bir sihir çalışmadığı sürece - kısa devre yerine ilkini döndürmeden önce * tüm * öğeleri seçmenin dezavantajına sahiptir. Yine de, bu performans seviyesini önemsersek, ilk etapta jQuery kullanmamalıyız. – Matchu

+3

Hayır, bu işe yaramaz çünkü ["döndürülen jQuery nesnesindeki DOM öğelerinin sırası belge sırasına göre aynı olmayabilir."] (Http://api.jquery.com/multiple- selector /), örneğin: http://jsfiddle.net/ambiguous/edYY6/. Bu size her seferinde will verecektir. –

+0

Bunun çok güzel olduğunu kabul etti. Her birinden biriyle iyiyiz (ya da olması gerekir), çünkü ilkinin sayfada benzersiz olması gereken bir kimlik vardır, ikincisi ise ** vücut elemanıdır. HTML'de bunlardan sadece biri olmalı. –

3

Gerçekten, hiç bu derece ayrıntılı olduğunu sanmıyorum. Bu deyim çok fazla gelirse, onu bir işleve bile sığdırabilirsin.

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

$ ("# x"). $ ("# x"): $ ("vücut"). –

+0

Hızlı yanıt için teşekkürler. Ben bir tek-liner soran kötü hissediyorum (SO, çok biliyorum!) Ama DOM Level 0 kısa bir formülasyon olduğundan o zaman jquery muhtemelen gerekir ki şaşırdım. :) –

+0

@RayToal: İyi performans gösteren bir tek liner ekledi, ancak belirgin şekilde daha az okunabilir.Yine de, iki satırlı versiyonu bir işlevde sarmalayarak bir satır yapmaya oy vermekteyim, özellikle çok fazla geliyorsa… ama sadece bir kez kullanılmışsa, o zaman meh. – Matchu

İlgili konular