857 Stimmen

Wie wendet man !important mit .css() an?

Ich habe Probleme bei der Anwendung eines Stils, der !important . Ich habe es versucht:

$("#elem").css("width", "100px !important");

Dies bedeutet nichts ; keine Breite Stil überhaupt angewendet wird. Gibt es eine jQuery-ish Weise der Anwendung eines solchen Stils, ohne zu überschreiben cssText (was bedeuten würde, dass ich sie zuerst parsen müsste usw.)?

Editar : Ich sollte hinzufügen, dass ich ein Stylesheet mit einem !important Stil, den ich versuche, mit einer !important Stil inline, also mit .width() und dergleichen funktioniert nicht, da sie von meiner externen Software überschrieben wird. !important Stil.

Außerdem wird der Wert, der den vorherigen Wert überschreibt wird errechnet Ich kann also nicht einfach einen anderen externen Stil erstellen.

739voto

David Thomas Punkte 239063

Das Problem wird dadurch verursacht, dass jQuery nicht die !important Attribut und kann daher die Regel nicht anwenden.

Möglicherweise können Sie dieses Problem umgehen und die Regel anwenden, indem Sie auf sie verweisen, und zwar über addClass() :

.importantRule { width: 100px !important; }

$('#elem').addClass('importantRule');

Oder durch die Verwendung von attr() :

$('#elem').attr('style', 'width: 100px !important');

Letzteres würde jedoch alle zuvor festgelegten Inline-Stilregeln außer Kraft setzen. Seien Sie also vorsichtig.

Natürlich gibt es ein gutes Argument dafür, dass die Methode von @Nick Craver einfacher/klüger ist.

Die oben genannten, attr() Ansatz leicht modifiziert, um das Original zu erhalten style string/properties, und geändert wie von falko in einem Kommentar:

$('#elem').attr('style', function(i,s) { return (s || '') + 'width: 100px !important;' });

344voto

Aram Kocharyan Punkte 19721

Ich glaube, ich habe eine Lösung gefunden. Ich habe es zu einer neuen Funktion gemacht:

jQuery.style(name, value, priority);

Sie können es verwenden, um Werte zu erhalten mit .style('name') genau wie .css('name') erhalten die CSSStyleDeclaration con .style() und auch Werte setzen, mit der Möglichkeit, die Priorität als wichtig . Siehe ce .

Beispiel

var div = $('someDiv');
console.log(div.style('color'));
div.style('color', 'red');
console.log(div.style('color'));
div.style('color', 'blue', 'important');
console.log(div.style('color'));
console.log(div.style().getPropertyPriority('color'));

Beispielhafte Ausgabe:

null
red
blue
important

Die Funktion

(function($) {    
  if ($.fn.style) {
    return;
  }

  // Escape regex chars with \
  var escape = function(text) {
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
  };

  // For those who need them (< IE 9), add support for CSS functions
  var isStyleFuncSupported = !!CSSStyleDeclaration.prototype.getPropertyValue;
  if (!isStyleFuncSupported) {
    CSSStyleDeclaration.prototype.getPropertyValue = function(a) {
      return this.getAttribute(a);
    };
    CSSStyleDeclaration.prototype.setProperty = function(styleName, value, priority) {
      this.setAttribute(styleName, value);
      var priority = typeof priority != 'undefined' ? priority : '';
      if (priority != '') {
        // Add priority manually
        var rule = new RegExp(escape(styleName) + '\\s*:\\s*' + escape(value) +
            '(\\s*;)?', 'gmi');
        this.cssText =
            this.cssText.replace(rule, styleName + ': ' + value + ' !' + priority + ';');
      }
    };
    CSSStyleDeclaration.prototype.removeProperty = function(a) {
      return this.removeAttribute(a);
    };
    CSSStyleDeclaration.prototype.getPropertyPriority = function(styleName) {
      var rule = new RegExp(escape(styleName) + '\\s*:\\s*[^\\s]*\\s*!important(\\s*;)?',
          'gmi');
      return rule.test(this.cssText) ? 'important' : '';
    }
  }

  // The style function
  $.fn.style = function(styleName, value, priority) {
    // DOM node
    var node = this.get(0);
    // Ensure we have a DOM node
    if (typeof node == 'undefined') {
      return this;
    }
    // CSSStyleDeclaration
    var style = this.get(0).style;
    // Getter/Setter
    if (typeof styleName != 'undefined') {
      if (typeof value != 'undefined') {
        // Set style property
        priority = typeof priority != 'undefined' ? priority : '';
        style.setProperty(styleName, value, priority);
        return this;
      } else {
        // Get style property
        return style.getPropertyValue(styleName);
      }
    } else {
      // Get CSSStyleDeclaration
      return style;
    }
  };
})(jQuery);

Siehe ce für Beispiele, wie die CSS-Werte gelesen und eingestellt werden können. Mein Problem war, dass ich bereits Folgendes eingestellt hatte !important für die Breite in meinem CSS, um Konflikte mit anderen Theme-CSS zu vermeiden, aber alle Änderungen, die ich in jQuery an der Breite vorgenommen habe, würden davon unberührt bleiben, da sie dem style-Attribut hinzugefügt werden würden.

Kompatibilität

Für die Einstellung mit der Priorität über die setProperty Funktion, Dieser Artikel sagt, dass es Unterstützung für IE 9+ und alle anderen Browser gibt. Ich habe es mit IE 8 versucht und es ist fehlgeschlagen, weshalb ich in meinen Funktionen Unterstützung dafür eingebaut habe (siehe oben). Bei allen anderen Browsern funktioniert es mit setProperty aber es braucht meinen eigenen Code, um im IE 9 zu funktionieren.

161voto

Nick Craver Punkte 609016

Sie können die Breite direkt mit .width() wie diese:

$("#elem").width(100);

Aktualisiert für Kommentare: Sie haben diese Option als auch, aber es wird alle css auf das Element ersetzen, so nicht sicher, es ist mehr praktikabel:

$('#elem').css('cssText', 'width: 100px !important');

95voto

BettaSplendens Punkte 911
const elem = $("#elem");
elem[0].style.removeAttribute('width');
elem[0].style.setProperty('width', '100px', 'important');

Anmerkung: Bei der Verwendung von Chrome kann ein Fehler wie der folgende auftreten:

elem[0].style.removeAttribute ist keine Funktion

Ändern der Zeile zur Verwendung der .removeProperty Funktion wie zum Beispiel elem[0].style.removeProperty('width'); Das Problem wurde behoben.

58voto

Rory O'Kane Punkte 27128

Die Antwort von David Thomas beschreibt einen Weg zur Verwendung von $('#elem').attr('style', …) , warnt aber davor, dass die Verwendung dieser Option die zuvor eingestellten Stile in der style Attribut. Hier ist eine Möglichkeit der Verwendung attr() ohne dieses Problem:

var $elem = $('#elem');
$elem.attr('style', $elem.attr('style') + '; ' + 'width: 100px !important');

Als Funktion:

function addStyleAttribute($element, styleAttribute) {
    $element.attr('style', $element.attr('style') + '; ' + styleAttribute);
}

addStyleAttribute($('#elem'), 'width: 100px !important');

Hier ist ein JS Bin-Demo .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X