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.

35voto

mkoryak Punkte 55621

Die meisten dieser Antworten sind inzwischen veraltet, IE7-Unterstützung ist kein Thema.

Der beste Weg, dies zu tun, ist unterstützt IE11+ und alle modernen Browser ist:

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

Wenn Sie möchten, können Sie auch ein kleines jQuery-Plugin erstellen, das diese Aufgabe übernimmt. Dieses Plugin entspricht weitgehend dem jQuery-eigenen css() Methode in den von ihr unterstützten Parametern:

/**
 * Sets a CSS style on the selected element(s) with !important priority.
 * This supports camelCased CSS style property names and calling with an object 
 * like the jQuery `css()` method. 
 * Unlike jQuery's css() this does NOT work as a getter.
 * 
 * @param {string|Object<string, string>} name
 * @param {string|undefined} value
 */   
jQuery.fn.cssImportant = function(name, value) {
  const $this = this;
  const applyStyles = (n, v) => {
    // Convert style name from camelCase to dashed-case.
    const dashedName = n.replace(/(.)([A-Z])(.)/g, (str, m1, upper, m2) => {
      return m1 + "-" + upper.toLowerCase() + m2;
    }); 
    // Loop over each element in the selector and set the styles.
    $this.each(function(){
      this.style.setProperty(dashedName, v, 'important');
    });
  };
  // If called with the first parameter that is an object,
  // Loop over the entries in the object and apply those styles. 
  if(jQuery.isPlainObject(name)){
    for(const [n, v] of Object.entries(name)){
       applyStyles(n, v);
    }
  } else {
    // Otherwise called with style name and value.
    applyStyles(name, value);
  }
  // This is required for making jQuery plugin calls chainable.
  return $this;
};

// Call the new plugin:
$('#elem').cssImportant('height', '100px');

// Call with an object and camelCased style names:
$('#another').cssImportant({backgroundColor: 'salmon', display: 'block'});

// Call on multiple items:
$('.item, #foo, #bar').cssImportant('color', 'red');

Beispiel jsfiddle hier .

34voto

Nate Punkte 24336

Nachdem ich andere Antworten gelesen und experimentiert habe, funktioniert es bei mir folgendermaßen:

$(".selector")[0].style.setProperty( 'style', 'value', 'important' );

Dies funktioniert allerdings nicht im IE 8 und darunter.

30voto

9ete Punkte 3592

Sie können dies tun:

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

Verwenden Sie "cssText" als Eigenschaftsname und das, was Sie dem CSS hinzufügen möchten, als Wert.

19voto

kva Punkte 478

Sie können dies auf zwei Arten erreichen:

$("#elem").prop("style", "width: 100px !important"); // this is not supported in chrome
$("#elem").attr("style", "width: 100px !important");

14voto

Hashbrown Punkte 10248

Die Antwort von @AramKocharyan ist nicht so komplex wie die von @AramKocharyan, und es ist auch nicht nötig, Style-Tags dynamisch einzufügen.

Überschreiben Sie einfach den Stil, sondern Sie müssen nichts analysieren, warum sollten Sie?

// Accepts the hyphenated versions (i.e. not 'cssFloat')
function addStyle(element, property, value, important) {
    // Remove previously defined property
    if (element.style.setProperty)
        element.style.setProperty(property, '');
    else
        element.style.setAttribute(property, '');

    // Insert the new style with all the old rules
    element.setAttribute('style', element.style.cssText +
        property + ':' + value + ((important) ? ' !important' : '') + ';');
}

Kann nicht verwenden <code>removeProperty()</code> denn es wird nicht entfernt <code>!important</code> Regeln in Chrome.<br>Kann nicht verwendet werden <code>element.style[property] = ''</code> weil es in Firefox nur camelCase akzeptiert.

Mit jQuery könnte man das wahrscheinlich kürzer machen, aber diese Vanilla-Funktion läuft auf modernen Browsern, Internet Explorer 8 usw.

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