16.06.2013, 23:57
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
function queryStyleRule(selector) {
var sheets = document.styleSheets,
j, i = sheets.length,
rules = [];
for( ;i--; ) {
try {
rules = sheets[i].cssRules ? sheets[i].cssRules : sheets[i].rules ? sheets[i].rules : [];
} catch(_e_) {
rules = [];
}
for(j = rules.length; j--; ) {
var sel = rules[j].selectorText.replace(/(^|[^:]):(after|before)/i, '$1::$2');
if (sel.toLowerCase() === selector) {
return rules[j];
}
}
}
var style = document.documentElement.firstChild.appendChild(document.createElement('style'));
try {
selector = selector.replace(/::(after|before)/, ':$1');
if (style.sheet) {
style.sheet.insertRule(selector + '{}', 0);
return style.sheet.cssRules[0];
} else if (style.styleSheet) {
style.styleSheet.addRule(selector, ' ', 0);
return style.styleSheet.rules[0];
}
} catch(_e_) {
style.parentNode.removeChild(style);
}
return null;
}
queryStyleRule('body::after').style.content = '"Hello World!"';;
alert(queryStyleRule('body::after').style.content);
Последний раз редактировалось devote, 17.06.2013 в 04:41.
|
|
17.06.2013, 00:05
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
<style>
div:after {
content: 'Этот текст будем получать с помощью метода queryStyleRule';
}
</style>
<div>Во как! </div>
<input type="button" onclick="queryStyleRule('div::after').style.content='\'Вот мы его и заменили)))\'';" value="Заменить текст" />
<script>
function queryStyleRule(selector) {
var sheets = document.styleSheets,
j, i = sheets.length,
rules = [];
for( ;i--; ) {
try {
rules = sheets[i].cssRules ? sheets[i].cssRules : sheets[i].rules ? sheets[i].rules : [];
} catch(_e_) {
rules = [];
}
for(j = rules.length; j--; ) {
var sel = rules[j].selectorText.replace(/(^|[^:]):(after|before)/i, '$1::$2');
if (sel.toLowerCase() === selector) {
return rules[j];
}
}
}
var style = document.documentElement.firstChild.appendChild(document.createElement('style'));
try {
selector = selector.replace(/::(after|before)/, ':$1');
if (style.sheet) {
style.sheet.insertRule(selector + '{}', 0);
return style.sheet.cssRules[0];
} else if (style.styleSheet) {
style.styleSheet.addRule(selector, ' ', 0);
return style.styleSheet.rules[0];
}
} catch(_e_) {
style.parentNode.removeChild(style);
}
return null;
}
alert('Текущий текст у псевдо-элемента: ' + queryStyleRule('div::after').style.content);
</script>
Последний раз редактировалось devote, 17.06.2013 в 04:41.
|
|
17.06.2013, 01:07
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
devote,
|
|
17.06.2013, 04:08
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Мой вариант, без поиска существующих правил, исправленный:
<script>
var addRule = (function(){
var head = document.head || document.getElementsByTagName('head')[0];
var style = head.appendChild(document.createElement('style'));
var styleSheet = style.sheet || style.styleSheet;
var cssRules = styleSheet.cssRules || styleSheet.rules;
return function(selector) {
if (styleSheet.insertRule) {
styleSheet.insertRule(selector + '{}', cssRules.length);
} else {
styleSheet.addRule(selector, ' ', cssRules.length);
}
return cssRules[cssRules.length - 1];
}
})();
var pseudoRule = addRule('span:before');
var setPseudoContent = function(content) {
pseudoRule.style.content = '"' + content + '"';
}
</script>
<input onkeyup="setPseudoContent(value)" />
Pseudo:<span></span>
Проверено в Opera, Firefox, Google Chrome, IE8, IE10.
Сообщение от devote
|
addRule(selector, 'e:0;', 0);
|
Вот тут вроде бы достаточно пробел передать в качестве второго аргумента.
Последний раз редактировалось danik.js, 17.06.2013 в 06:11.
|
|
17.06.2013, 04:41
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от danik.js
|
Вот тут вроде бы достаточно пробел передать в качестве второго аргумента.
|
ну да, верно говоришь.. подправил свой код
|
|
17.06.2013, 04:48
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от danik.js
|
// почему-то style.content не работает в хроме.
|
любопытно почему у тебя не работает... у меня все гуд.. Может ты пытаешься назначить свойству просто значение вида:
style.content = 'ololo';
хотя по правилам нужно:
style.content = '"ololo"';
// или
style.content = 'attr(data-my-attr)';
|
|
17.06.2013, 04:55
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
кстати о птичках.. а нафига такой хренью заниматься, если можно все упростить))
Для ИЕ8 обязательно должен присутствовать у спана атрибут, иначе ИЕ8 не будет обновлять значение
<style>
span:before {
content: attr(data-before-content);
}
</style>
<input onkeyup="document.getElementById('spanId').setAttribute('data-before-content', this.value)" />
Pseudo:<span id="spanId" data-before-content="Начальное значение псевдо-элемента, может быть пустым значением"></span>
Последний раз редактировалось devote, 17.06.2013 в 05:09.
|
|
17.06.2013, 06:14
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от devote
|
любопытно почему у тебя не работает... у меня все гуд.. Может ты пытаешься назначить свойству просто значение вида..
|
Я - лох ((
Сообщение от devote
|
нафига такой хренью заниматься, если можно все упростить
|
Блин, реально круто )
Кстати, как заэкранировать кавычку? В моем варианте текст с двойной кавычкой не проходит..
|
|
17.06.2013, 10:11
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от danik.js
|
Кстати, как заэкранировать кавычку? В моем варианте текст с двойной кавычкой не проходит..
|
просто использовать "
|
|
17.06.2013, 10:31
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от danik.js
|
Кстати, как заэкранировать кавычку? В моем варианте текст с двойной кавычкой не проходит..
|
И еще у меня прокатывает такой вариант:
style.content = JSON.stingify('Мой текст в "Кавычках" и \'одинарных\' тоже');
|
|
|
|