Как получить доступ к CSS сгенерированного контента с помощью JavaScript
я генерирую нумерацию моих заголовков и фигур с помощью CSS counter
и content
свойства:
img.figure:after {
counter-increment: figure;
content: "Fig. " counter(section) "." counter(figure);
}
это (соответствующий браузер предполагается) дает хорошую маркировку " рис. 1.1", "рис. 1.2 " и так далее после любого изображения.
вопрос: как я могу получить доступ к этому из Javascript? Вопрос двоякий в том, что я хотел бы получить доступ или текущее значение определенного счетчика (в определенном узле DOM) или значение CSS генерируемого контента (в определенном узле DOM) или, очевидно, как информация.
Справочная информация: я хотел бы добавить к ссылкам назад-ссылки на цифры соответствующее число, например:
<a href="#fig1">see here</h>
------------------------^ " (Fig 1.1)" inserted via JS
насколько я вижу, все сводится к этой проблеме:
Я может открыть content
или counter-increment
через getComputedStyle
:
var fig_content = window.getComputedStyle(
document.getElementById('fig-a'),
':after').content;
однако, это не live значением, но объявлено в таблице стилей. Я не могу найти интерфейс для доступа к реальные живу стоимости. В случае счетчика нет даже реального свойства CSS для запроса.
Edit: копая все глубже и глубже через спецификации DOM, я нашел интерфейс счетчика стилей DOM Level 2. Это похоже на a) разрешить доступ к текущему значению счетчика и b) быть реализованным в Firefox, по крайней мере. Однако я понятия не имею, как его использовать. Мой текущий подход трагически погиб после этого выхода Firebug:
// should return a DOM 2 Counter interface implementation...
window.getComputedStyle(fig_a_element, ':after')
.getPropertyCSSValue("counter-increment")[0]
.getCounterValue();
[Exception... "Modifications are not allowed for this document" code: "7"
nsresult: "0x80530007 (NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR)"
location: "http://localhost/countertest.html Line: 71"]
любая идея, как это может быть воплощено в жизнь, будет высоко оценена.
Edit 2: по-видимому, я неправильно истолковал встречный объект стиля DOM Level 2. Он тоже не имеет свойства возвращать текущее значение счетчика. Это делает вышеуказанный подход недействительным.
новый подход: есть ли возможность читать содержимое псевдо-элемента через DOM? То есть, могу ли я выберите псевдо-элемент (treeWalker
приходит на ум), а затем получить его nodeValue
? (Если вы начинаете вводить 'jQuery' теперь, пожалуйста, пересмотреть, чтобы изменить этот термин в 'шипеть'...)
4 ответа:
Я не могу найти интерфейс для доступа к реальной живой стоимости. [счетчик]
да. Я не думаю, что есть. Извиняюсь.
единственное, что я могу придумать, это пройти через каждый элемент (включая его
:before
/:after
псевдо-элементы) перед элементом в документе, ищет счетчики и складывает, сколько их есть.очевидно, что это отвратительно. Если вы собираетесь попытаться воспроизвести собственный браузер
counter
механизм вероятно, было бы проще (и гораздо более совместимо, учитывая отсутствие поддержки счетчика/контента IE<a href="#prettypicture">this</a> <div class="counter level=0">...</div> <img id="prettypicture" class="counter level=1" alt="ooo, pretty"/>
window.onload= function() { var counters= Node_getElementsByClassName(document.body, 'counter'); var indices= []; for (var counteri= 0; counteri<counters.length; counteri++) { var counter= counters[counteri]; var level= Element_getClassArgument(counter, 'level'); while (indices.length<=level) indices.push(0); indices[level]++; indices= indices.slice(level+1); var text= document.createTextNode('Figure '+indices.join('.')); counter.parentNode.insertBefore(text, counter.nextSibling); if (counter.id!=='') { for (var linki= document.links.length; linki-->0;) { var link= document.links[i]; if ( link.hostname===location.hostname && link.pathname===location.pathname && link.search===location.search && link.hash==='#'+counter.id ) { var text= document.createTextNode('('+indices.join('.')+')'); link.parentNode.insertBefore(text, link.nextSibling); } } } } };
читать это:
контент не меняет дерево документа. В частности, это не передается обратно на язык документа процессор (например, для повторной обработки).
содержимое, указанное в a таблица стилей не становится частью DOM.
Так по этой причине getComputedStyleне будет работать в этом случае; я думаю, что единственный способ, чтобы выполнить классический цикл как кто-то описал ниже!
Я не могу найти интерфейс для доступа к реальному значению в реальном времени.
Если вы не можете получить значение из
window.getComputedStyle
кажется, что это будет невозможно.что еще более важно, хотя он может это сделать, я думаю, что это может быть злоупотребление CSS, так как вы нарушаете барьер между контентом и презентацией в этот момент.
проверить этот вопрос что такое хорошее использование свойства css "Content"?
Я бы перенес ваш css на Javascript, это позволяет вам получить заголовок рисунка, а также вы получаете большее покрытие браузера. Используя jQuery вы бы сделали что-то вроде этого:
$(function() { var section = 0; $(".section").each(function() { section++; var figure = 0; $(this).find("img.figure").each(function() { figure++; var s = "Fig. " + section + "." + figure; $(this).attr({alt:s}).after(s); }); }); });
затем вы могли бы сделать:
<div class="section">blabla <img id="foo" src="http://www.example.com/foo.jpg"></div> <p>Lorem ipsum dolor sit amet <a href="#foo" class="figurereference">see here</a></p> <script type="text/javascript"> $(function() { $("a.figurereference").each(function() { var selector = $(this).attr("href"); var $img = $(selector); var s = $(this).text() + " (" + $img.attr("alt") + ")"; $(this).text(s); }); }); </script>
хотя я согласен, что делать это с помощью CSS было бы очень аккуратно.