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
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'));
Hier ist die 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);
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.