Ist es möglich, Inline-Stile mit jQuery zu entfernen?

236

Ein jQuery-Plugin wendet einen Inline-Stil an (display:block ). Ich fühle mich faul und möchte es überschreiben display:none.

Was ist der beste (faule) Weg?

Haroldo
quelle
79
Bitten Sie um Hilfe auf SO :)
Dave Swersky
15
Der beste Weg und der faule Weg sind nicht unbedingt gleich.
Joel
1
Ich habe oft das Argument gehört, dass die besten Entwickler faul sind ... blog.codinghorror.com/how-to-be-lazy-dumb-and-successful
kaelle
Mit removeAttr () oder .css () können zwei Möglichkeiten erreicht werden: siehe codepedia.info/jquery-remove-inline-style
Satinder singh

Antworten:

381

Update: Während die folgende Lösung funktioniert, gibt es eine viel einfachere Methode. Siehe unten.


Folgendes habe ich mir ausgedacht, und ich hoffe, dass dies nützlich ist - für Sie oder andere:

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

Dadurch wird dieser Inline-Stil entfernt.

Ich bin mir nicht sicher, ob du das wolltest. Sie wollten es überschreiben, was, wie bereits erwähnt, leicht von erledigt werden kann$('#element').css('display', 'inline') .

Was ich suchte, war eine Lösung, um den Inline-Stil vollständig zu entfernen. Ich benötige dies für ein Plugin, das ich schreibe und in dem ich vorübergehend einige Inline-CSS-Werte festlegen muss, diese aber später entfernen möchte. Ich möchte, dass das Stylesheet die Kontrolle zurückerhält. Ich könnte es tun, indem ich alle ursprünglichen Werte speichere und sie dann wieder inline setze, aber diese Lösung fühlt sich für mich viel sauberer an.


Hier ist es im Plugin-Format:

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

Wenn Sie dieses Plugin vor Ihrem Skript in die Seite aufnehmen, können Sie es einfach aufrufen

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

und das sollte den Trick machen.


Update : Mir wurde jetzt klar, dass dies alles zwecklos ist. Sie können es einfach auf leer setzen:

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

und es wird automatisch für Sie entfernt.

Hier ist ein Zitat aus den Dokumenten :

Durch Festlegen des Werts einer Stileigenschaft auf eine leere Zeichenfolge - z. B. $('#mydiv').css('color', '')- wird diese Eigenschaft aus einem Element entfernt, wenn sie bereits direkt angewendet wurde, sei es im HTML-Stilattribut, über die .css()Methode von jQuery oder durch direkte DOM-Manipulation der Stileigenschaft. Ein Stil, der mit einer CSS-Regel in einem Stylesheet oder <style>Element angewendet wurde, wird jedoch nicht entfernt .

Ich glaube nicht, dass jQuery hier etwas mag. es scheint, dass das styleObjekt dies nativ tut .

Joseph Silber
quelle
3
@ximi - Danke Mann. Ich habe darüber nachgedacht und festgestellt, dass dies keine Zeitverschwendung ist. Es könnte verwendet werden, um nach Inline-Stilen zu suchen, für die es derzeit in jQuery keine Unterstützung .css('property')gibt ( gibt Ihnen den Wert an, sagt Ihnen jedoch nicht, ob er von einem Inline-Stil stammt).
Joseph Silber
Ich bin unabhängig zu dem gleichen Schluss gekommen - eine leere Zeichenfolge scheint genau das zu tun, was wir wollen. Es ist nicht offiziell in der API dokumentiert, wird aber hoffentlich weiter funktionieren.
Jon z
@ Jonz - Es ist offiziell dokumentiert (obwohl ich nicht weiß, wann es hinzugefügt wurde; ich kann mich nicht erinnern, es dort gesehen zu haben, als ich es ursprünglich gepostet habe). Ich glaube auch nicht, dass jQuery hier etwas unternimmt. Das native styleObjekt scheint sich auf die gleiche Weise zu verhalten. Ich habe meine Antwort mit diesen Informationen geändert.
Joseph Silber
Funktioniert dies mit Dingen wie der Schriftfamilie oder bringt das - den regulären Ausdruck durcheinander?
TMH
4
@mosh - Warum benutzt du nicht einfach $('#element').css('display', '')?
Joseph Silber
157

.removeAttr("style") um einfach den ganzen Style-Tag loszuwerden ...

.attr("style") um den Wert zu testen und festzustellen, ob ein Inline-Stil vorhanden ist ...

.attr("style",newValue) um es auf etwas anderes zu setzen

Heisenberg
quelle
18
Dies betrifft nicht nur alle Inline-Stile display.
SLaks
1
klingt gut krank probieren Sie es aus und lassen Sie es Sie wissen, ich verwende nie Inline-Stile normalerweise so glücklich, alle Inline-Stile zu löschen
Haroldo
11
@ Slaks gut, das habe ich mit "den ganzen Style-Tag loswerden" gemeint;)
heisenberg
Hallo. Gibt es eine Möglichkeit zu überprüfen, ob ein 'Stil' auf das ... $ ('*') angewendet wurde, und zwar aus einer beliebigen Quelle wie einem Inline-Stil, der atribute wie font, b, strong, css file .. formatiert, bevor versucht wird, dies zu tun irgendetwas entfernen / zurücksetzen oder einfach alle einen Schuss zurücksetzen?
Milche Patern
Da das Entfernen jedes einzelnen Inline-Stils das (jetzt leere) styleAttribut nicht entfernt, ist dies dennoch bemerkenswert.
Brilliand
26

Der einfachste Weg, Inline-Stile (von jQuery generiert) zu entfernen, ist:

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

Der Inline-Code sollte verschwinden und Ihr Objekt sollte den in Ihren CSS-Dateien vordefinierten Stil anpassen.

Hat für mich gearbeitet!

Rick van 't Wout Hofland
quelle
13

Sie können den Stil mit der cssMethode von jQuery festlegen :

$('something:visible').css('display', 'none');
SLaks
quelle
@Kobi: Er fragt nach einem Inline-Stil.
SLaks
äh, was? Ich verstehe wahrscheinlich nichts. Ich denke darüber nach <div style="display:block;">, $('div').hide().
Kobi
3
@Kobi: Behebt hideeinen Sonderfall beim Ändern von Inline-Stilen. Diese Antwort spricht alle Fälle an. ( hide/showhaben auch eine Einschränkung als zwei, welche zwei Werte umgeschaltet werden. dh keine-> Block oder keine-> Inline.)
Joel
@Joel: hide/ showmerkt sich den alten Wert von displayund stellt ihn korrekt wieder her.
SLaks
@ Slaks: Cool. Das muss kürzlich hinzugefügt worden sein, da ich mich daran erinnere, dass ich zuvor Probleme damit hatte.
Joel
12

Sie können ein jquery-Plugin wie folgt erstellen:

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

Verwendung

$(".foo").removeInlineCss(); //remove all inline styles
$(".foo").removeInlineCss("display"); //remove one inline style
$(".foo").removeInlineCss("color font-size font-weight"); //remove several inline styles
Yukulélé
quelle
1
Diese Antwort enthält einen sehr übersichtlichen einzeiligen Trick, der auch ohne jQuery nützlich ist und den möglicherweise nicht viele Entwickler kennen. Beim Aufrufen elem.style.removeProperty('margin-left')wird nur margin-leftdas styleAttribut entfernt (und der Wert dieser Eigenschaft zurückgegeben). Für IE6-8 ist es elem.style.removeAttribute().
Craigpatik
9

Der faule Weg (der dazu führen wird, dass zukünftige Designer Ihren Namen verfluchen und Sie im Schlaf ermorden):

#myelement 
{
    display: none !important;
}

Haftungsausschluss: Ich befürworte diesen Ansatz nicht, aber es ist sicherlich der faule Weg.

Joel
quelle
2
Dies ist eindeutig die beste Antwort auf die Frage, da sie im Geiste der schlechten Praxis "faul" ist. Prost!
Ktamlyn
6
$('div[style*=block]').removeAttr('style');
Ameisenpfote
quelle
Was ist mit nur $ ('div [style]'). RemoveAttr ('style');?
Skybondsor
@skybondsor würde es nicht nur für die Blockelemente entfernen, wie er es wollte
Antpaw
Ah ja. Ich dachte, er wollte Inline-Stile von allem entfernen.
Skybondsor
6
$("[style*=block]").hide();
David Morton
quelle
6

Wenn Sie eine Eigenschaft innerhalb eines Stilattributs entfernen und nicht nur auf etwas anderes setzen möchten, verwenden Sie die folgende removeProperty()Methode:

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

UPDATE:
Ich habe eine interaktive Geige erstellt , um mit den verschiedenen Methoden und ihren Ergebnissen herumzuspielen. Offenbar gibt es nicht viel Unterschied zwischen set to empty string, set to faux valueund removeProperty(). Sie alle führen zu demselben Fallback - dies ist entweder eine vorgegebene CSS-Regel oder der Standardwert des Browsers.

WoodrowShigeru
quelle
5

Falls die Anzeige der einzige Parameter in Ihrem Stil ist, können Sie diesen Befehl ausführen, um alle Stile zu entfernen:

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

Bedeutet, dass, wenn Ihr Element zuvor so aussah:

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

Jetzt sieht Ihr Element folgendermaßen aus:

<input id="element" style="">
paulalexandru
quelle
3

Hier ist ein InlineStyle-Auswahlfilter, den ich geschrieben habe und der in jQuery integriert wird.

$("div:inlineStyle(display:block)") // will select all divs with an inline style of display: block set

In Ihrem Fall könnten Sie dies wie folgt verwenden:

$("div:inlineStyle(display:block)").hide();
Corban Brook
quelle
2

Ändern Sie das Plugin so, dass der Stil nicht mehr angewendet wird. Das wäre viel besser, als den Stil danach zu entfernen.

Josh Stodola
quelle
1
daher die "Faulen"! Ich kann nicht sagen, welches Bit von welchem ​​Plugin es ist!
Haroldo
4
Ich weiß nicht, wie du faul definierst, ich habe nur geantwortet, wie ich es machen würde. Es scheint sinnvoll zu sein, das Problem dort zu beheben, wo es entsteht, anstatt Dinge außerhalb des Plugins zu reparieren. Ich sehe Unordnung voraus, wenn ich es so mache.
Josh Stodola
Welche Richtung? Wenn Sie das Plugin bearbeiten, können nach dem Aktualisieren auf eine neue Version Probleme auftreten, die Ihre Änderung überschreiben und das Layout durcheinander bringen. Wer wird sich in ungefähr einem Jahr daran erinnern, dass Sie diese eine kleine Anpassung dort vorgenommen haben? Ich versuche immer, eine andere Lösung zu finden, als den Quellcode des
Plugins
1

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

etc...

Lass einfach den 2. Parameter leer!

Bert
quelle
1
Wenn ihr etwas abstimmt, hinterlasst bitte einen Kommentar.
Er Nrik
1
Ich würde vermuten, dass Sie die Abstimmungen erhalten haben, weil Sie die gestellte Frage nicht beantwortet haben : "jQuery plugin is applying an inline style (display:block). I'm feeling lazy and want to override it with display:none". Obwohl Ihr Text korrekt ist, löst Ihr Code die Frage nicht.
Gone Coding
Das Problem, das ich hatte, wurde gelöst. Tnx.
Jodalr
0

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

Zuerst habe ich versucht, den Inline-Stil in CSS zu entfernen, aber es funktioniert nicht und ein neuer Stil wie die Anzeige: Keiner wird überschrieben. Aber in JQuery funktioniert es so.

Cocoa3338
quelle
0

Ich hatte ein ähnliches Problem mit der Eigenschaft width. Ich konnte das! Wichtige nicht aus dem Code entfernen, und da es diesen Stil für eine neue Vorlage benötigte, fügte ich dem Element eine ID (Modalstyling) hinzu und fügte anschließend der Vorlage folgenden Code hinzu:

<script type="text/javascript">
    $('#modalstyling').css('width', '');    //Removal of width !important
    $('#modalstyling').width('75%');        //Set custom width
</script>
Mbotet
quelle