Нужна помощь в оптимизации скрипта, который скрывает строки таблицы - PullRequest
1 голос
/ 30 марта 2012

Я сделал этот скрипт Greasemonkey:

var maxpi = 250;
var p1 = "/html/body/div/div[2]/div/div[2]/table[2]/tbody/tr[1]/td[11]";
var p2 = "/html/body/div/div[2]/div/div[2]/table[2]/tbody/tr[2]/td[11]";
..
var p25 = "/html/body/div/div[2]/div/div[2]/table[2]/tbody/tr[25]/td[11]";

var r1 = "/html/body/div/div[2]/div/div[2]/table[2]/tbody/tr[1]";
var r2 = "/html/body/div/div[2]/div/div[2]/table[2]/tbody/tr[2]";
..
var r25 = "/html/body/div/div[2]/div/div[2]/table[2]/tbody/tr[25]";

var xpathPI1 = document.evaluate(p1, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
..
var xpathPI25 = document.evaluate(p25, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);

var xpathrow1 = document.evaluate(r1, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
..
var xpathrow25 = document.evaluate(r25, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);

if (xpathPI1.singleNodeValue.textContent >maxpi ){
xpathrow1.singleNodeValue.style.display='none';}
..
if (xpathPI25.singleNodeValue.textContent >maxpi ){
xpathrow25.singleNodeValue.style.display='none';}


По сути, он проверяет 11-е поле строки таблицы и, если его содержимое> 250, он скрывает строку.

С моим ограниченным знанием JavaScript, это заняло довольно много времени.

Проблема в том, что мне нужно переписать каждую строку, если я хочу скрыть другую строку.
Я хочу сделать его более удобным, чтобы я мог использовать его на похожих таблицах, не переписывая все это.

Может быть, мне нужно использовать другой тип XPath или использовать какую-то переменную?

Ответы [ 2 ]

1 голос
/ 30 марта 2012

Конечно, есть и другие способы улучшить ваш сценарий.

Во-первых, вам нужно тщательно продумать, ЧТО именно вы хотите найти.Является ли каждая строка и столбец?Это строки / столбцы с некоторым текстом, классом, любым другим атрибутом?Вы даже можете выбрать только те узлы, текстовое значение которых больше, чем у maxpi!

. Прочитайте что-нибудь о XPath , возможно, лучший ресурс - официальный .

Несколько случайных мыслей о том, что может быть полезно в отношении XPath:

//table//tr[5]/td[2]   ...   the double slash is the deal here
//table//tr/td[number(text()) > 250]   ...   the number() and text() functions

Если говорить о JavaScript , это будет немного сложнее, потому чтоВы можете использовать столько вещей!

Только для начала - вы можете создавать динамически изменяемые выражения xpath с помощью конкатенации строк и для цикла , например:

for (var i = 1; i <= maxNumberOfRows; i++) {
    var p1 = "//table/tbody/tr[" + i + "]";
    // more work goes here...
}

Кроме того, вы можете использовать массивы для хранения нескольких узлов, возвращаемых вашими выражениями XPath, и работать с ними всеми с помощью одной команды.

Для большего количества JavaScript я быпорекомендуйте первые главы некоторого учебника JavaScript , который значительно повысит вашу производительность.

0 голосов
/ 30 марта 2012

Используйте цикл и функции. Вот один из способов:

hideRowsWithLargeCellValue (
    "/html/body/div/div[2]/div/div[2]/table[2]/tbody/tr[",
    25,
    "]/td[11]",
    250
);

function hideRowsWithLargeCellValue (xpathPre, maxRows, xpathPost, maxpi) {
    for (var J = maxRows;  J >= 1;  --J) {
        var srchRez  = document.evaluate (
            xpathPre + J + xpathPost, 
            document, 
            null, 
            XPathResult.FIRST_ORDERED_NODE_TYPE, 
            null
        );
        if (srchRez.singleNodeValue  &&  srchRez.singleNodeValue.textContent > maxpi) {
            var rowToHide = srchRez.singleNodeValue.parentNode;
            rowToHide.style.display='none';
        }
    }
}




Тогда прочитайте «Не повторяйте себя» (sic).

...