Je pense avoir trouvé une vraie solution. Je l'ai transformé en une nouvelle fonction:
jQuery.style(name, value, priority);
Vous pouvez l'utiliser pour obtenir des valeurs avec .style('name')
tout comme .css('name')
, obtenir la CSSStyleDeclaration avec .style()
, et également définir des valeurs - avec la possibilité de spécifier la priorité comme «importante». Regardez ça .
Démo
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'));
Voici la sortie:
null
red
blue
important
La fonction
(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);
Voir ceci pour des exemples de lecture et de définition des valeurs CSS. Mon problème était que j'avais déjà mis!important
la largeur dans mon CSS pour éviter les conflits avec d'autres CSS de thème, mais toutes les modifications que j'ai apportées à la largeur dans jQuery ne seraient pas affectées car elles seraient ajoutées à l'attribut style.
Compatibilité
Pour définir la priorité à l'aide de la setProperty
fonction, cet article indique que IE 9+ et tous les autres navigateurs sont pris en charge. J'ai essayé avec IE 8 et il a échoué, c'est pourquoi j'ai intégré le support dans mes fonctions (voir ci-dessus). Il fonctionnera sur tous les autres navigateurs utilisant setProperty, mais il aura besoin de mon code personnalisé pour fonctionner dans <IE 9.