Могут ли это решение совместимы с IE7 и IE6?
Есть ли способ сделать это решение совместимым с IE6 и IE7?
http://jsfiddle.net/kirkstrobeck/sDh7s/1/
Думаю, я нашел реальное решение. Я ввел новую функцию:
jQuery.style(name, value, priority);
Вы можете использовать его для получения значений с помощью .style('name')
точно так же, как .css('name')
, получить CSSStyleDeclaration с помощью .style()
, а также установить значения - с возможностью указать приоритет как "важный". См. https://developer.mozilla.org/en/DOM/CSSStyleDeclaration.
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'));
Здесь вывод:
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;
}
}
См. https://developer.mozilla.org/en/DOM/CSSStyleDeclaration для примеров того, как читать и устанавливать значения CSS. Моя проблема заключалась в том, что я уже установил !important
для ширины в моем CSS, чтобы избежать конфликтов с другими CSS темы, но любые изменения, которые я сделал для ширины в jQuery, не будут затронуты, поскольку они будут добавлены в атрибут стиля.
Совместимость
Для установки с приоритетом с помощью функции setProperty
http://help.dottoro.com/ljdpsdnb.php говорится, что есть поддержка IE 9+ и всех других браузеров, Я попытался с IE 8, и он провалился, поэтому я создал поддержку для него в моих функциях (см. Выше). Он будет работать во всех других браузерах с использованием setProperty, но для этого потребуется мой пользовательский код для работы в < IE 9.
Ответы
Ответ 1
Это выглядит бесполезно сложным. Я бы просто использовал размер шрифта 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);
}
);
});
Я удалил сохранение в куки файл, но это было достаточно легко, чтобы повторно подать заявку.
Один трюк заключается в том, чтобы сохранить исходный процент где-нибудь (я использовал data()), потому что если вы попытаетесь извлечь его с помощью .css('font-size'), он даст вам рассчитанный размер (например, "16px" )).
Может быть способ получить значение в процентах, но не может запомнить, как это сделать.
При повторном применении части сохранения файлов cookie не забудьте установить исходные данные() в значение в cookie вместо 100%, затем вызовите changeFontSize (0), чтобы применить его.
В любом случае, этот код работает в IE6.
Ответ 2
Вы не сможете получить эту работу в IE 6 или 7, как есть. Я бы предложил вместо этого создать новые правила стиля, которые могут включать объявления !important
и могут быть достигнуты во всех основных браузерах, используя что-то вроде следующей функции. Это потребовало бы, чтобы ваши элементы были идентифицированы с помощью селектора, например селектора идентификаторов (что потребовало бы добавления идентификаторов к элементам, если они не присутствуют), и только создает правила стиля, а не извлекает их, хотя это подходит для вашего примера.
Я обновил ваш пример, и теперь он работает во всех основных браузерах, включая 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;");
Ответ 3
Перейдите к http://www.javascriptlint.com/online_lint.php
Вставьте свой Javascript там.
Вы увидите, что есть несколько предупреждений. Для начала исправьте все предупреждения. Как только JavaScript Lint больше не генерирует предупреждения, проверьте его в IE. Это должно по крайней мере заставить вас начать поиск решения.