2009-08-28 26 views
23

Estoy tratando de hacer una casilla que oculte una clase CSS específica cuando se hace clic, pero también quiero que este efecto se aplique a todos los objetos futuros que obtienen esa clase específica.¿puede jquery manipular la definición de css global del documento?

por ejemplo: tengo 2 divs:

diva es de clase ABC

divB no tiene ninguna clase

Quiero que la casilla de verificación para ocultar todos los divs de clase abc, esto es fácil, usando $(".abc").hide(). pero el problema es que si otra parte del sitio creó divB de la clase abc más adelante, entonces no se ocultará. porque el código jquery solo se habría aplicado a divA en ese momento.

lo que estoy tratando de hacer es hacer que la casilla de verificación manipule la definición de css global del documento. entonces, cuando el usuario haga clic en la casilla de verificación, cambiaría la clase abc para que se oculte, y más adelante cuando cualquier div se una a esa clase, se ocultaría.

¿es esto posible en jquery?

+0

Aquí hay una pregunta similar con una buena respuesta: http://stackoverflow.com/questions/1079237/jquery-equivalent-of-yui-stylesheet-utility – Jourkey

Respuesta

30

Puede usar los métodos insertRule y addRule (cuando sea necesario) para agregar nuevas reglas al selector .abc. Eso debería afectar cualquier cosa en el futuro que logre que la clase se le aplique.

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); 
} 

Hay un plugin de jQuery para esto también: $.rule(); Está disponible en https://github.com/flesler/jquery.rule

+5

Gracias por la respuesta. Aunque debería mencionar que este código solo funcionará en IE. Mi aplicación es un script de greasemonkey, así que después de pasar horas buscando en línea, resulta que para Firefox la sintaxis debería ser: document.styleSheets [0] .insertRule (". Abc {display: none;}", 0); –

+4

jquery.rule vive en https://github.com/flesler/jquery.rule hoy en día ... –

+0

No funciona en Firefox moderno. Obtiene: "Error: la operación es insegura". – caponica

18

Probablemente me volvería a manejar esto por tener su casilla añadir y eliminar una clase formar el <cuerpo> elemento:

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

y tienen el siguiente CSS:

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

Así Si en otro lugar de su página se agrega <div>, se le agrega la clase '.abc', entonces asumirá la primera regla CSS y se ocultará.

+2

En mi opinión, este es un enfoque mucho mejor (y en particular más simple) que las alternativas. ¿Por qué tan pocos votos? ¿Hay algún error con este enfoque? –

+1

Eso es realmente ingenioso y parece que sería mucho más confiable entre navegadores que tratar de agregar nuevas reglas en la hoja de estilos. No puedo pensar en ningún inconveniente de ese enfoque. – daGUY

+1

Esto parece simple ahora, pero se volvería mucho más complejo trabajar una vez que comenzara a aplicar la clase mediante programación a datos generados a partir de sondeos AJAX, por ejemplo. –

Cuestiones relacionadas