È possibile rimuovere gli stili incorporati con jQuery?


236

Un plugin jQuery sta applicando uno stile inline ( display:block). Mi sento pigro e voglio scavalcarlo display:none.

Qual è il modo migliore (pigro)?


79
Chiedi aiuto su SO :)
Dave Swersky,

15
Il modo migliore e il modo pigro non sono necessariamente gli stessi.
Joel

1
Ho sentito spesso l'argomento che i migliori sviluppatori sono pigri ... blog.codinghorror.com/how-to-be-lazy-dumb-and-successful
kaelle

due modi possono raggiungere i, e usando removeAttr () o .css () fare riferimento a codepedia.info/jquery-remove-inline-style
Satinder singh

Risposte:


381

Aggiornamento: mentre la seguente soluzione funziona, esiste un metodo molto più semplice. Vedi sotto.


Ecco cosa mi è venuto in mente, e spero che questo sia utile - per te o per chiunque altro:

$('#element').attr('style', function(i, style)
{
    return style && style.replace(/display[^;]+;?/g, '');
});

Questo rimuoverà quello stile in linea.

Non sono sicuro che questo è quello che volevi. Volevi sostituirlo, che, come già sottolineato, è facilmente eseguibile $('#element').css('display', 'inline').

Quello che cercavo era una soluzione per RIMUOVERE completamente lo stile in linea. Ho bisogno di questo per un plugin che sto scrivendo in cui devo impostare temporaneamente alcuni valori CSS incorporati, ma voglio rimuoverli in seguito; Voglio che il foglio di stile riprenda il controllo. Potrei farlo memorizzando tutti i suoi valori originali e poi rimettendoli in linea, ma questa soluzione mi sembra molto più pulita.


Eccolo in formato plugin:

(function($)
{
    $.fn.removeStyle = function(style)
    {
        var search = new RegExp(style + '[^;]+;?', 'g');

        return this.each(function()
        {
            $(this).attr('style', function(i, style)
            {
                return style && style.replace(search, '');
            });
        });
    };
}(jQuery));

Se includi questo plugin nella pagina prima dello script, puoi semplicemente chiamare

$('#element').removeStyle('display');

e questo dovrebbe fare il trucco.


Aggiornamento : ora ho capito che tutto ciò è inutile. Puoi semplicemente impostarlo su vuoto:

$('#element').css('display', '');

e verrà automaticamente rimosso per te.

Ecco una citazione dai documenti :

L'impostazione del valore di una proprietà di stile su una stringa vuota, ad es $('#mydiv').css('color', '')., Rimuove quella proprietà da un elemento se è già stata direttamente applicata, sia nell'attributo HTML style, attraverso il .css()metodo jQuery o attraverso la manipolazione DOM diretta della proprietà style. Tuttavia, non rimuove uno stile che è stato applicato con una regola CSS in un foglio di stile o in un <style>elemento.

Non penso che jQuery stia facendo magie qui; sembra che l' styleoggetto lo faccia in modo nativo .


3
@ximi - Grazie amico. Ci ho pensato e ho deciso che non era una perdita di tempo. Potrebbe essere adottato per verificare gli stili inline, per i quali attualmente non è supportato in jQuery ( .css('property')ti dà il valore, ma non ti dice se proviene da uno stile inline).
Joseph Silber,

Sono giunto alla stessa conclusione in modo indipendente: la stringa vuota sembra fare esattamente ciò che vogliamo. Non è ufficialmente documentato nell'API, ma si spera che continuerà a funzionare.
Jon z

@Jonz - Si è ufficialmente documentato (anche se non so quando è stato aggiunto, non mi ricordo di aver visto lì quando ho originariamente pubblicato questo). Inoltre, non penso che jQuery stia facendo qualcosa qui. L' styleoggetto nativo sembra comportarsi allo stesso modo. Ho modificato la mia risposta con queste informazioni.
Joseph Silber,

Funziona con cose come la famiglia di caratteri o il - rovina la regex?
TMH,

4
@mosh - Perché non usi semplicemente $('#element').css('display', '')?
Joseph Silber,

158

.removeAttr("style") per sbarazzarsi di tutto il tag di stile ...

.attr("style") per testare il valore e vedere se esiste uno stile inline ...

.attr("style",newValue) per impostarlo su qualcos'altro


18
Ciò influenzerà tutti gli stili in linea, non solo display.
SLaks

1
suona bene male provalo e ti faccio sapere, non uso mai stili in linea normalmente così felici di cancellare tutti gli stili in linea
Haroldo

11
@Slaks bene, questo è ciò che intendevo per "sbarazzarsi di tutto il tag di stile";)
heisenberg

Ciao. c'è un modo per verificare se un certo 'stile' era stato applicato a ... $ ('*'), da qualsiasi fonte come uno stile inline, attributo di stile come font, b, strong, file css .. prima di tentare di rimuovere / ripristinare qualcosa o semplicemente resettare tutto uno scatto?
Milche Patern,

Poiché la rimozione di ogni stile inline singolarmente non rimuove l' styleattributo (ora vuoto) , questo è comunque degno di nota.
Brilliand,

26

Il modo più semplice per rimuovere gli stili incorporati (generati da jQuery) sarebbe:

$(this).attr("style", "");

Il codice incorporato dovrebbe scomparire e l'oggetto dovrebbe adattare lo stile predefinito nei file CSS.

Ha funzionato per me!


13

Puoi impostare lo stile usando il cssmetodo di jQuery :

$('something:visible').css('display', 'none');

@Kobi: sta chiedendo uno stile in linea.
SLaks

err cosa? Probabilmente non capisco qualcosa. Ci sto pensando <div style="display:block;">, $('div').hide().
Kobi,

3
@Kobi: hiderisolve un caso speciale di modifica degli stili in linea. Questa risposta risolve tutti i casi. ( hide/showhanno anche una limitazione come due, i cui due valori sono attivati. vale a dire none-> block o none-> inline.)
Joel

@Joel: hide/ showricorderà il vecchio valore di displaye lo ripristinerà correttamente.
SLaks

@SLaks: fantastico. Deve essere stato aggiunto di recente, poiché ricordo di aver avuto problemi con prima.
Joel

12

puoi creare un plugin jquery come questo:

jQuery.fn.removeInlineCss = (function(){
    var rootStyle = document.documentElement.style;
    var remover = 
        rootStyle.removeProperty    // modern browser
        || rootStyle.removeAttribute   // old browser (ie 6-8)
    return function removeInlineCss(properties){
        if(properties == null)
            return this.removeAttr('style');
        proporties = properties.split(/\s+/);
        return this.each(function(){
            for(var i = 0 ; i < proporties.length ; i++)
                remover.call(this.style, proporties[i]);
        });
    };
})();

uso

$(".foo").removeInlineCss(); //remove all inline styles
$(".foo").removeInlineCss("display"); //remove one inline style
$(".foo").removeInlineCss("color font-size font-weight"); //remove several inline styles

1
Questa risposta contiene un trucco di una riga molto accurato utile anche senza jQuery e che non molti sviluppatori possono sapere: la chiamata elem.style.removeProperty('margin-left')verrà rimossa solo margin-leftdall'attributo style(e restituirà il valore di quella proprietà). Per IE6-8 è elem.style.removeAttribute().
Craigpatik,

9

The Lazy Way (che indurrà i futuri designer a maledire il tuo nome e ucciderti nel sonno):

#myelement 
{
    display: none !important;
}

Disclaimer: non sostengo questo approccio, ma è certamente il modo pigro.


2
Questa è chiaramente la migliore risposta alla domanda perché è nello spirito della cattiva pratica "pigra". Saluti!
ktamlyn,

6
$('div[style*=block]').removeAttr('style');

Che dire solo $ ('div [style]'). RemoveAttr ('style') ;?
skybondsor

@skybondsor non lo rimuoverebbe solo per gli elementi del blocco, come lo voleva
antpaw

Ah sì. Ho pensato che volesse rimuovere gli stili in linea da tutto.
skybondsor


6

Se vuoi rimuovere una proprietà all'interno di un attributo di stile - non solo impostarla su qualcos'altro - fai uso del removeProperty()metodo:

document.getElementById('element').style.removeProperty('display');

AGGIORNAMENTO:
ho creato un violino interattivo per giocare con i diversi metodi e i loro risultati. Apparentemente, non c'è molta differenza tra set to empty string, set to faux valuee removeProperty(). Tutti generano lo stesso fallback, ovvero una regola CSS prestabilita o il valore predefinito del browser.


5

Nel caso in cui il display sia l'unico parametro del tuo stile, puoi eseguire questo comando per rimuovere tutto lo stile:

$('#element').attr('style','');

Significa che se il tuo elemento era simile a questo prima:

<input id="element" style="display: block;">

Ora il tuo elemento sarà simile a questo:

<input id="element" style="">


2

Modifica il plug-in per non applicare più lo stile. Sarebbe molto meglio che rimuovere lo stile da allora in poi.


1
da qui il 'pigro'! non posso essere certo di trovare quale parte di quale plugin sia!
Haroldo,

4
Non so come definisci pigro, ho appena risposto a come lo farei. Sembra logico risolvere il problema nel punto in cui ha origine invece di rattoppare le cose al di fuori del plugin. Prevedo disordine quando lo faccio in questo modo.
Josh Stodola,

Quale via? Se modifichi il plug-in, potresti avere problemi dopo l'aggiornamento alla nuova versione che sovrascriverà la modifica e rovinerà il layout. Chi ricorderà tra circa un anno che hai fatto quel piccolo aggiustamento lì? Cerco sempre di trovare una soluzione diversa dalla modifica del codice sorgente del plug-in
Zefiryn,

2

$el.css({ height : '', 'margin-top' : '' });

eccetera...

Lascia vuoto il secondo parametro!


1
Se fate un voto negativo su qualcosa, lasciate un commento.
Ha Nrik il

1
Direi che hai i downvotes perché non hai risposto alla domanda ha chiesto : "jQuery plugin is applying an inline style (display:block). I'm feeling lazy and want to override it with display:none". Sebbene il testo sia corretto, il codice non risolve la domanda.
Codice finito

Risolto il problema che avevo. Tnx.
yodalr,

0

$("#element").css({ display: "none" });

All'inizio ho provato a rimuovere lo stile inline in css, ma non funziona e il nuovo stile come display: nessuno verrà sovrascritto. Ma in JQuery funziona così.


0

Ho avuto un problema simile con la proprietà width. Non sono riuscito a rimuovere! Important dal codice, e dato che aveva bisogno di questo stile su un nuovo modello ho aggiunto un Id (modalstyling) all'elemento e successivamente ho aggiunto il seguente codice al modello:

<script type="text/javascript">
    $('#modalstyling').css('width', '');    //Removal of width !important
    $('#modalstyling').width('75%');        //Set custom width
</script>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.