有没有办法让这个解决方案IE6和IE7兼容?
http://jsfiddle.net/kirkstrobeck/sDh7s/1/
我想我找到了一个真正的解决方案。我把它变成了一个新功能:
jQuery.style(name, value, priority);
您可以使用它来获取.style('name')
的值,就像.css('name')
一样,使用.style()
获取CSSStyleDeclaration,并设置值 - 可以将优先级指定为'important' 。请参阅https://developer.mozilla.org/en/DOM/CSSStyleDeclaration。
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'));
这是输出:
null
red
blue
important
// For those who need them (< IE 9), add support for CSS functions
var isStyleFuncSupported = CSSStyleDeclaration.prototype.getPropertyValue != null;
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(RegExp.escape(styleName) + '\\s*:\\s*' + RegExp.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(RegExp.escape(styleName) + '\\s*:\\s*[^\\s]*\\s*!important(\\s*;)?', 'gmi');
return rule.test(this.cssText) ? 'important' : '';
}
}
// Escape regex chars with \
RegExp.escape = function(text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}
// The style function
jQuery.fn.style = function(styleName, value, priority) {
// DOM node
var node = this.get(0);
// Ensure we have a DOM node
if (typeof node == 'undefined') {
return;
}
// CSSStyleDeclaration
var style = this.get(0).style;
// Getter/Setter
if (typeof styleName != 'undefined') {
if (typeof value != 'undefined') {
// Set style property
var priority = typeof priority != 'undefined' ? priority : '';
style.setProperty(styleName, value, priority);
} else {
// Get style property
return style.getPropertyValue(styleName);
}
} else {
// Get CSSStyleDeclaration
return style;
}
}
有关如何读取和设置CSS值的示例,请参阅https://developer.mozilla.org/en/DOM/CSSStyleDeclaration。我的问题是我已经为我的CSS中的宽度设置!important
以避免与其他主题CSS发生冲突,但是我对jQuery中的宽度所做的任何更改都不会受到影响,因为它们会被添加到style属性中。
要使用setProperty
功能设置优先级,http://help.dottoro.com/ljdpsdnb.php表示支持IE 9+和所有其他浏览器。我已经尝试过使用IE 8但它失败了,这就是为什么我在我的函数中建立了对它的支持(见上文)。它将适用于使用setProperty的所有其他浏览器,但它需要我的自定义代码才能在&lt; IE 9。
答案 0 :(得分:9)
看起来不必要复杂..我只是使用基于em的字体大小来容器内的标签,并使用百分比调整容器的字体大小。这样,容器内的所有标签都会自动调整大小。
JsFiddle:http://jsfiddle.net/qqxe9/
CSS:
.container {
font-size:100%;
}
p {
font-size:1em;
}
JS
function changeFontSize(n)
{
var size = $('.container').data('size');
size += n * 10;
$('.container').css('font-size',size+'%').data('size',size);
}
$(document).ready(function(){
$('body').prepend(' \
<div class="font-size-changer"> \
<a href="#" class="decrease">A↓</a> \
<!--<a href="#" class="reset">A</a>--> \
<a href="#" class="increase">A↑</a> \
<a href="#" class="null">null</a> \
</div> \
').find('> .container').data('size',100);
$('.font-size-changer .increase').click(
function()
{
changeFontSize(1);
}
);
$('.font-size-changer .decrease').click(
function()
{
changeFontSize(-1);
}
);
});
我已将保存删除到cookie部分,但这很容易重新应用..
一个技巧是在某处保存初始百分比(我使用data()),因为如果你试图用.css('font-size')检索它,它会给你计算出的大小(例如'16px' )。 可能有一种方法可以将值作为百分比获得但不记得如何。
重新应用cookie保存部分时,记得将初始数据()设置为cookie中的值而不是100%,然后调用changeFontSize(0)来应用它。
无论如何,这段代码适用于IE6。
答案 1 :(得分:4)
您将无法在IE 6或7中实现此功能。我建议改为创建新的样式规则,其中可以包含!important
声明,并且可以使用类似下面的函数在所有主流浏览器中实现。它需要通过选择器识别您的元素,例如ID选择器(如果不存在则需要向元素添加ID),并且只创建样式规则而不是检索它们,尽管这对您的示例很好。 / p>
我已经更新了您的示例,它现在适用于所有主流浏览器,包括IE 6和7:http://jsfiddle.net/9ZZVP/1/
样式规则创建代码:
var addRule;
if (typeof document.styleSheets != "undefined" && document.styleSheets) {
addRule = function(selector, rule) {
var styleSheets = document.styleSheets, styleSheet;
if (styleSheets && styleSheets.length) {
styleSheet = styleSheets[styleSheets.length - 1];
if (styleSheet.addRule) {
styleSheet.addRule(selector, rule)
} else if (typeof styleSheet.cssText == "string") {
styleSheet.cssText = selector + " {" + rule + "}";
} else if (styleSheet.insertRule && styleSheet.cssRules) {
styleSheet.insertRule(selector + " {" + rule + "}", styleSheet.cssRules.length);
}
}
}
} else {
addRule = function(selector, rule, el, doc) {
el.appendChild(doc.createTextNode(selector + " {" + rule + "}"));
};
}
function createCssRule(selector, rule, doc) {
doc = doc || document;
var head = doc.getElementsByTagName("head")[0];
if (head && addRule) {
var styleEl = doc.createElement("style");
styleEl.type = "text/css";
styleEl.media = "screen";
head.appendChild(styleEl);
addRule(selector, rule, styleEl, doc);
styleEl = null;
}
}
使用示例:
createCssRule("#foo", "background-color: purple !important;");
答案 2 :(得分:-1)
转到http://www.javascriptlint.com/online_lint.php
将Javascript粘贴到那里。
你会看到有很多警告。首先,修复所有警告。一旦JavaScript Lint不再生成警告,请在IE中测试它。这应该至少让你开始寻找解决方案。