Saya pikir saya telah menemukan solusi nyata. Saya telah membuatnya menjadi fungsi baru:
jQuery.style(name, value, priority);
Anda dapat menggunakannya untuk mendapatkan nilai .style('name')
seperti .css('name')
, dapatkan CSSStyleDeclaration dengan .style()
, dan juga menetapkan nilai - dengan kemampuan untuk menentukan prioritas sebagai 'penting'. Lihat ini .
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'));
Inilah hasilnya:
null
red
blue
important
Fungsinya
(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);
Lihat ini untuk contoh cara membaca dan mengatur nilai CSS. Masalah saya adalah bahwa saya sudah menetapkan!important
lebar pada CSS saya untuk menghindari konflik dengan CSS tema lainnya, tetapi setiap perubahan yang saya buat pada lebar dalam jQuery tidak akan terpengaruh karena mereka akan ditambahkan ke atribut style.
Kesesuaian
Untuk pengaturan dengan prioritas menggunakan setProperty
fungsi, Artikel ini mengatakan ada dukungan untuk IE 9+ dan semua browser lainnya. Saya telah mencoba dengan IE 8 dan gagal, itulah sebabnya saya membangun dukungan untuk itu dalam fungsi saya (lihat di atas). Ini akan bekerja pada semua browser lain menggunakan setProperty, tetapi akan membutuhkan kode khusus saya untuk bekerja di <IE 9.