Ich habe Probleme, einen Stil anzuwenden, der ist !important
. Ich habe es versucht:
$("#elem").css("width", "100px !important");
Das macht nichts ; Es wird keinerlei Breitenstil angewendet. Gibt es eine jQuery-artige Möglichkeit, einen solchen Stil anzuwenden, ohne ihn überschreiben zu müssen cssText
(was bedeuten würde, dass ich ihn zuerst analysieren müsste usw.)?
Bearbeiten : Ich sollte hinzufügen, dass ich ein Stylesheet mit einem !important
Stil habe, den ich mit einem !important
Stil inline überschreiben .width()
möchte. Daher funktioniert die Verwendung und dergleichen nicht, da sie von meinem externen !important
Stil überschrieben wird .
Außerdem wird der Wert berechnet , der den vorherigen Wert überschreibt , sodass ich nicht einfach einen anderen externen Stil erstellen kann.
javascript
jquery
html
css
mkoryak
quelle
quelle
.css
und!important
im jQuery-Kern. Der Fehler wurde geschlossen, da "nicht behoben werden kann". Der Testfall dieses Fehlers war jedoch nicht so restriktiv wie der in dieser Frage - der Testfall hatte keinen Inline-!important
Stil, den er überschreiben wollte. Daher funktioniert die vorgeschlagene Problemumgehung in diesem Fehler in diesem Fall nicht.Antworten:
Das Problem wird dadurch verursacht, dass jQuery das
!important
Attribut nicht versteht und daher die Regel nicht anwendet.Möglicherweise können Sie dieses Problem umgehen und die Regel anwenden, indem Sie auf sie verweisen
addClass()
:Oder mit
attr()
:Der letztere Ansatz würde jedoch alle zuvor festgelegten Inline-Stilregeln aufheben. Also vorsichtig verwenden.
Natürlich gibt es ein gutes Argument dafür, dass die Methode von @Nick Craver einfacher / klüger ist.
Der obige
attr()
Ansatz wurde geringfügig geändert, um die ursprünglichestyle
Zeichenfolge / Eigenschaften beizubehalten , und wie von falko in einem Kommentar vorgeschlagen geändert :quelle
'undefinedwidth: 100px !important;'
wenn der aktuelle Stil leer ist.Ich denke, ich habe eine echte Lösung gefunden. Ich habe es zu einer neuen Funktion gemacht:
jQuery.style(name, value, priority);
Sie können es verwenden, um Werte mit
.style('name')
genau wie zu erhalten.css('name')
, erhalten Sie die CSSStyleDeclaration mit.style()
und auch Werte festzulegen - mit der Möglichkeit, die Priorität als 'wichtig' anzugeben. Sehen Sie das .Demo
Hier ist die Ausgabe:
Die Funktion
Sehen Sie dies für Beispiele dafür , wie die CSS - Werte zu lesen und setzen. Mein Problem war, dass ich bereits
!important
die Breite in meinem CSS festgelegt hatte, um Konflikte mit anderen Themen-CSS zu vermeiden. Änderungen, die ich an der Breite in jQuery vorgenommen habe, blieben jedoch unberührt, da sie dem Stilattribut hinzugefügt wurden.Kompatibilität
Für die Einstellung mit der Priorität mithilfe der
setProperty
Funktion wird in diesem Artikel angegeben , dass IE 9+ und alle anderen Browser unterstützt werden. Ich habe es mit IE 8 versucht und es ist fehlgeschlagen, weshalb ich in meinen Funktionen Unterstützung dafür aufgebaut habe (siehe oben). Es funktioniert in allen anderen Browsern mit setProperty, benötigt jedoch meinen benutzerdefinierten Code, um in <IE 9 zu funktionieren.quelle
!important
in Ihren Stilen, zumindest für Dinge , die Sie mit jQuery ändern gehen ... Solange sie sind Ihre Stile. Wenn Ihr Code auf einer Seite ausgeführt wird, die von einem Schüler codiert wurde, der seine Unkenntnis der Spezifitätsregeln umgeht, indem er!important
auf jeden zweiten Stil klatscht , werden Sie!importants
früher oder später mit dem Kopf voran in einen dieser Stile rammen .Sie können die Breite direkt
.width()
wie folgt einstellen :Für Kommentare aktualisiert: Sie haben auch diese Option, aber sie ersetzt alle CSS-Elemente des Elements. Sie sind sich also nicht sicher, ob sie praktikabler sind:
quelle
$('#elem').css('cssText', $('#elem').css('cssText')+'width: 100px !important');
Sie ihn mit dem vorherigen Wert abgleichenHinweis: Bei Verwendung von Chrome wird möglicherweise ein Fehler zurückgegeben, z.
Ändern der Zeile, um die
.removeProperty
Funktion zumelem[0].style.removeProperty('width');
Beheben des Problems zu verwenden.quelle
var = document.getElementById('elem');
möchten, erstellen Sie einfach die Stilmethoden für elem (im Gegensatz zu elem [0]) und führen Sie sie aus. Prost.var style = document.getElementById('elem'); style.removeProperty('width'); style.setProperty('width, '100px', 'important')
.removeAttribute
. Es scheint eine reine IE-Methode zu sein . @mcoenca Kommentar ist richtig;.removeProperty
funktioniert gut. Es ist IE9 + laut MSDNelem.next().get(0).style...
Die Antwort von David Thomas beschreibt eine Verwendung
$('#elem').attr('style', …)
, warnt jedoch davor, dass bei Verwendung zuvor festgelegte Stile imstyle
Attribut gelöscht werden. Hier ist eine Möglichkeit,attr()
ohne dieses Problem zu verwenden:Als eine Funktion:
Hier ist eine JS Bin-Demo .
quelle
addStyleAttribute()
kann auch geändert werden, um dieselben Parameter wie bei jQuery zu verwenden.css()
. Beispielsweise könnte es unterstützt werden, eine Zuordnung von CSS-Eigenschaften zu ihren Werten vorzunehmen. Wenn Sie dies tun würden, würden Sie im Grunde genommen.css()
mit dem!important
behobenen Fehler neu implementieren, jedoch ohne Optimierungen.Nachdem ich andere Antworten gelesen und experimentiert habe, funktioniert dies für mich:
Dies funktioniert jedoch nicht in IE 8 und darunter.
quelle
Du kannst das:
Verwenden Sie "cssText" als Eigenschaftsnamen und alles, was Sie dem CSS als Wert hinzufügen möchten.
quelle
cssText
vorher drin war - also kann man es nicht wirklich frei benutzenSie können dies auf zwei Arten erreichen:
quelle
.prop()
Funktion in jQuery v1.6 hinzugefügt und funktioniert in Chrome ... dies wird auf der Requisitenseite zitiert: Vor jQuery 1.6.attr()
berücksichtigte die Methode beim Abrufen einiger Attribute manchmal Eigenschaftswerte, was zu inkonsistentem Verhalten führen kann. Ab jQuery 1.6 bietet die.prop()
Methode eine Möglichkeit, Eigenschaftswerte explizit abzurufen und.attr()
Attribute abzurufen.Es ist nicht erforderlich, auf die Komplexität der Antwort von @ AramKocharyan einzugehen oder Stil-Tags dynamisch einzufügen.
Überschreiben Sie einfach den Stil, aber Sie müssen nichts analysieren. Warum sollten Sie das tun?
Kann nicht verwendet werden
removeProperty()
, da!important
Regeln in Chrome nicht entfernt werden.Kann nicht verwendet werden
element.style[property] = ''
, da es nur camelCase in Firefox akzeptiert.Sie könnten dies wahrscheinlich mit jQuery verkürzen, aber diese Vanille-Funktion wird in modernen Browsern, Internet Explorer 8 usw. ausgeführt.
quelle
Folgendes habe ich getan, nachdem ich auf dieses Problem gestoßen bin ...
quelle
Diese Lösung überschreibt keinen der vorherigen Stile, sondern wendet nur den gewünschten an:
quelle
Wenn es nicht so relevant ist und Sie es mit einem Element zu tun haben
#elem
, können Sie seine ID in etwas anderes ändern und es nach Ihren Wünschen gestalten ...Und in Ihrem CSS:
quelle
Anstatt die
css()
Funktion zu verwenden, versuchen Sie dieaddClass()
Funktion:quelle
Die einfachste und beste Lösung für dieses Problem war für mich, einfach addClass () anstelle von .css () oder .attr () zu verwenden.
Zum Beispiel:
$('#elem').addClass('importantClass');
Und in Ihrer CSS-Datei:
quelle
Zu Ihrer Information, es funktioniert nicht, weil jQuery es nicht unterstützt. 2012 wurde ein Ticket eingereicht ( # 11173 $ (elem) .css ("property", "value! Important") schlägt fehl ), das schließlich als WONTFIX geschlossen wurde.
quelle
Die meisten dieser Antworten sind mittlerweile veraltet. Die IE7-Unterstützung ist kein Problem.
Der beste Weg, dies zu tun, der IE11 + und alle modernen Browser unterstützt, ist:
Wenn Sie möchten, können Sie auch ein kleines jQuery-Plugin erstellen, das dies tut. Dieses Plugin stimmt
css()
in den unterstützten Parametern eng mit der eigenen Methode von jQuery überein :Beispiel jsfiddle hier .
quelle
Wir müssen zuerst den vorherigen Stil entfernen. Ich entferne es mit einem regulären Ausdruck. Hier ist ein Beispiel zum Ändern der Farbe:
quelle
$selector.css('cssText','margin-bottom: 0 !important')
Eine alternative Möglichkeit, Stil im Kopf anzuhängen:
Dadurch wird der Stil nach all Ihren CSS-Dateien angehängt, sodass er eine höhere Priorität als andere CSS-Dateien hat und angewendet wird.
quelle
Vielleicht sieht es so aus:
Zwischenspeicher
Stellen Sie CSS ein
Entfernen Sie CSS
quelle
Ich denke, es funktioniert in Ordnung und kann jedes andere CSS vorher überschreiben (dies: DOM-Element):
quelle
Mach es so:
quelle
Diese Lösung belässt das gesamte berechnete Javascript und fügt dem Element das wichtige Tag hinzu: Sie können Folgendes tun (Beispiel: Wenn Sie die Breite mit dem wichtigen Tag festlegen müssen)
quelle
Drei Arbeitsbeispiele
Ich hatte eine ähnliche Situation, aber ich habe .find () verwendet, nachdem ich lange mit .closest () mit vielen Variationen gekämpft hatte.
Der Beispielcode
Alternative
Arbeiten: http://jsfiddle.net/fx4mbp6c/
quelle
.indexOf()
Funktion durch etwas zu ersetzen, das browserübergreifender ist. Verwenden Sie stattdessen.match()
oder.test()
anstelle von.indexOf()
var contents =
?Es kann für Ihre Situation geeignet sein oder auch nicht, aber Sie können CSS-Selektoren für viele dieser Situationen verwenden.
Wenn Sie beispielsweise möchten, dass die 3. und 6. Instanz von .cssText eine andere Breite haben, können Sie Folgendes schreiben:
Oder:
quelle
.cssText
.:nth-of-type()
tut nicht das, was du denkst. Sehen Sie hier für eine Erklärung.li
Elementen zu tun . Sie haben alle den gleichen Elementtypli
, mit dem sich der Selektor befasst. Wenn Sie verschiedene Elemente im selben übergeordneten Element mischen:nth-of-type()
würden , würde sich dies anders verhalten, insbesondere wenn Sie der Mischung einen Klassenselektor hinzufügen.Ich würde annehmen, Sie haben es versucht, ohne hinzuzufügen
!important
?Inline-CSS (mit dem JavaScript das Styling hinzufügt) überschreibt das Stylesheet-CSS. Ich bin mir ziemlich sicher, dass dies auch dann der Fall ist, wenn die Stylesheet-CSS-Regel dies tut
!important
.Eine andere Frage (vielleicht eine dumme Frage, die aber gestellt werden muss): Ist das Element, an dem Sie arbeiten möchten,
display:block;
oderdisplay:inline-block;
?Sie kennen Ihre CSS-Kenntnisse nicht ... Inline-Elemente verhalten sich nicht immer so, wie Sie es erwarten würden.
quelle
Wir können setProperty oder cssText verwenden, um
!important
ein DOM-Element mit JavaScript hinzuzufügen .Beispiel 1:
Beispiel 2:
quelle
Ich habe auch festgestellt, dass bestimmte Elemente oder Add-Ons (wie Bootstrap) einige spezielle Klassenfälle haben, in denen sie nicht gut
!important
funktionieren, oder andere Workarounds wie.addClass/.removeClass
, und daher müssen Sie sie ein- und ausschalten.Wenn Sie beispielsweise so etwas verwenden, können Sie
<table class="table-hover">
Elemente wie die Farben von Zeilen nur erfolgreich ändern, indem Sie dietable-hover
Klasse wie folgt ein- oder ausschalten$(your_element).closest("table").toggleClass("table-hover");
Hoffentlich ist diese Problemumgehung für jemanden hilfreich! :) :)
quelle
Ich hatte das gleiche Problem beim Versuch, eine Textfarbe eines Menüelements bei "Ereignis" zu ändern. Der beste Weg, den ich fand, als ich das gleiche Problem hatte, war:
Erster Schritt: Erstellen Sie in Ihrem CSS eine neue Klasse mit diesem Zweck, zum Beispiel:
Letzter Schritt: Wenden Sie diese Klasse mit der addClass-Methode wie folgt an:
Problem gelöst.
quelle
Die sicherste Problemumgehung besteht darin, eine Klasse hinzuzufügen und dann die Magie in CSS auszuführen :-)
addClass()
undremoveClass()
sollte die Arbeit erledigen.quelle
https://jsfiddle.net/xk6Ut/256/
Ein alternativer Ansatz ist das dynamische Erstellen und Aktualisieren von CSS-Klassen in JavaScript. Dazu können wir das Stilelement verwenden und müssen die ID für das Stilelement verwenden, damit wir die CSS-Klasse aktualisieren können
...
quelle