2009-08-28 27 views
23

Tıklandığında belirli bir css sınıfını gizleyecek bir onay kutusu oluşturmaya çalışıyorum, ancak bu etkiyi o sınıfın gelecekteki tüm nesneleri için de uygulamak istiyorum.jquery, belgenin global css tanımını değiştirebilir mi?

örneğin

i 2 renklendirilmiş:

diva DIVB

i onay kutusu sınıfının abc tüm div'leri gizlemek istediğiniz klası yok

sınıf abc taşımaktadır, bu kullanarak, kolay $(".abc").hide(). Ancak sorun şu ki, sitenin başka bir bölümü daha sonra abc sınıfının divB'sini yaptıysa gizlenmeyecektir. Çünkü jQuery kodu o zaman sadece divA'ya uygulanmış olurdu.

Yapmaya çalıştığım şey, onay kutusunun belgenin global css tanımını değiştirmesini sağlamaktır. kullanıcı onay kutusunu tıklattığında, gizlenecek abc sınıfını değiştirirdim ve daha sonra herhangi bir div bu sınıfa katıldıklarında gizlenirdi.

jquery'de bu mümkün mü?

+0

İyi bir yanıtla benzer bir soru: http://stackoverflow.com/questions/1079237/jquery-equivalent-of-yui-stylesheet-utility – Jourkey

cevap

30

.abc seçiciye yeni kurallar eklemek için insertRule ve addRule (gerektiğinde) yöntemlerini kullanabilirsiniz. Bu, gelecekteki o sınıfı uygulayan bir şeyi etkilemelidir.

var stylesheet = document.styleSheets[0], 
    selector = ".abc", rule = "{color: red}"; 

if (stylesheet.insertRule) { 
    stylesheet.insertRule(selector + rule, stylesheet.cssRules.length); 
} else if (stylesheet.addRule) { 
    stylesheet.addRule(selector, rule, -1); 
} 

da bunun için bir jQuery eklentisi var: $.rule();

$('body').toggleClass('hideABC'); 

Ve aşağıdaki CSS var: Yani

body.hideABC div.abc { display:none; } 
body div.abc { display:block; } 

Ben Muhtemelen onay kutusunu ekleyip bir sınıf kaldırmak oluştururlar < gövde > eleman sağlayarak bu bakacaklarını https://github.com/flesler/jquery.rule

+5

Yanıt için teşekkürler. Bu kodun sadece IE'de çalışacağından bahsetmeliyim. Uygulamam bir greasemonkey komut dosyasıdır, bu yüzden çevrimiçi görünecek saatler geçirdikten sonra, firefox için sözdizimi şöyle olmalıdır: document.styleSheets [0] .insertRule (". Abc {display: none;}", 0); –

+4

jquery.rule, şu anda https://github.com/flesler/jquery.rule adresinde yaşıyor ... –

+0

Modern Firefox'ta çalışmıyor. "Hata: İşlem güvensiz." – caponica

18

mevcut bulunuyor Sayfanızda başka bir yer varsa <div> '.abc' sınıfına eklenirse, ilk CSS kuralını alır ve gizlenir.

+2

Zihnime göre bu, alternatiflerden çok daha iyi (ve özellikle daha basit) bir yaklaşım. Neden bu kadar az oy? Bu yaklaşımla bazı kusurlar var mı? –

+1

Bu gerçekten zeki ve stil sayfasına yeni kurallar eklemeyi denemekten çok daha güvenilir bir tarayıcı olacaktır. Bu yaklaşıma herhangi bir olumsuzluk düşünemiyorum. – daGUY

+1

Bu şimdi basit görünüyor, ancak AJAX yoklamadan elde edilen verilere programlı olarak dersi uygulamaya başladıktan sonra, birlikte çalışmak için çok daha karmaşık hale gelecekti. –