Penso di aver trovato una vera soluzione. L'ho trasformato in una nuova funzione:
jQuery.style(name, value, priority);
Puoi usarlo per ottenere valori .style('name')
proprio come .css('name')
, ottenere CSSStyleDeclaration .style()
e anche impostare valori - con la possibilità di specificare la priorità come 'importante'. Vedere questo .
dimostrazione
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'));
Ecco l'output:
null
red
blue
important
La funzione
(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);
Vedi questo per esempi su come leggere e impostare i valori CSS. Il mio problema era che avevo già impostato !important
la larghezza nel mio CSS per evitare conflitti con altri temi CSS, ma qualsiasi modifica apportata alla larghezza in jQuery non sarebbe stata influenzata poiché sarebbero stati aggiunti all'attributo style.
Compatibilità
Per l'impostazione con la priorità utilizzando la setProperty
funzione, questo articolo afferma che esiste il supporto per IE 9+ e tutti gli altri browser. Ho provato con IE 8 e non ha funzionato, motivo per cui ho sviluppato il supporto nelle mie funzioni (vedi sopra). Funzionerà su tutti gli altri browser usando setProperty, ma avrà bisogno del mio codice personalizzato per funzionare in <IE 9.