Слияние getComputedStyle и оценка в Greasemonkey - PullRequest
1 голос
/ 03 января 2011

Мне нужно получить все текстовые узлы с определенным шрифтом на странице в массив. Я пытался ..

textnodes = document.evaluate("//* [@style='font-family: foo;']//text()["
            + "not(ancestor::script) and not(ancestor::style)]", document,
            null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

и

textnodes = document.evaluate("//* [@face='foo']//text()["
            + "not(ancestor::script) and not(ancestor::style)]", document,
            null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

Но они не работают со страницами, стилизованными под внешние CSS-файлы. Кажется, getComputedStyle () - это путь. Я думаю, что мне нужно что-то вроде ..

var tags = document.getElementsByTagName('*');
for (var i in tags) {
    var style = getComputedStyle(tags[i], '');
    if (style.fontFamily.match(/foo/i)) {
        textnodes.push(tags[i]);
        }
    }

Но текстовые узлы не были возвращены в этом методе. Могу ли я в любом случае использовать гибрид xpathvaluate () и getComputedStyle () или любой другой способ добиться этого?

Ответы [ 2 ]

1 голос
/ 03 января 2011

Используйте jQuery.jQuery будет бесполезен для других задач, которые будет выполнять ваш GM-скрипт, плюс он гораздо более надежен и способен работать в разных браузерах.

(1) Добавьте эту строку в раздел метаданных Greasemonkey сразу после // @include директива (ы):

// @require http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js

(Обратите внимание, что вам, возможно, придется удалить, а затем переустановить скрипт, чтобы скопировать jQuery.)

(2) Затем вы можете использовать этот код дляполучить узлы:

var jPrelimNodes    = $("*:not(html, head, title, meta, script, link, style, body)");

var aMyTextNodes    = jPrelimNodes.map 
                    (
                        function () 
                        {
                            var jThis   = $(this);
                            if (jThis.children().length <= 1)   //-- Ignore containers.
                            {
                                if (/^\bTimes New Roman\b/i.test (jThis.css ("font-family") ) )
                                    return jThis; // Or return "this" or "jThis.text()", as desired.
                            }
                            return null;
                        } 
                    ).get ();


Это проверяет вычисленный стиль и в этом случае возвращает узлы, которые начинаются с Times New Roman.

Вы можете см. Версию этого кода в действии на jsFiddle .

1 голос
/ 03 января 2011

Один простой способ сделать это - найти все текстовые узлы:

textnodes = document.evaluate("//text()", document,
        null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

Перебирая каждый найденный TextNode, вы можете посмотреть его computedStyle parent . Если это тот шрифт, вы можете push TextNode в textnodes.

...