Eu acho que encontrei uma solução real. Eu fiz isso em uma nova função:
jQuery.style(name, value, priority);
Você pode usá-lo para obter valores .style('name')
como .css('name')
, obter CSSStyleDeclaration .style()
e também definir valores - com a capacidade de especificar a prioridade como 'importante'. Veja isso .
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'));
Aqui está a saída:
null
red
blue
important
A função
(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);
Veja isso para exemplos de como ler e definir os valores CSS. Meu problema foi que eu já havia definido !important
a largura do meu CSS para evitar conflitos com outro tema do CSS, mas quaisquer alterações feitas na largura do jQuery não seriam afetadas, pois seriam adicionadas ao atributo style.
Compatibilidade
Para definir com prioridade usando a setProperty
função, este artigo diz que há suporte para o IE 9+ e todos os outros navegadores. Eu tentei com o IE 8 e ele falhou, e é por isso que criei suporte para ele em minhas funções (veja acima). Ele funcionará em todos os outros navegadores usando setProperty, mas precisará do meu código personalizado para funcionar no <IE 9.