需要帮助优化隐藏表行的脚本

时间:2012-03-30 08:45:10

标签: javascript xpath optimization html-table greasemonkey

我制作了这个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 个答案:

答案 0 :(得分:1)

当然,还有更多方法可以改进您的脚本。

首先,您需要彻底思考您想要查找的内容。是每一行和每列?它是带有一些文本,类,任何其他属性的行/列吗?您甚至可以只选择文本值大于maxpi

的节点

阅读有关 XPath 的内容,可能最好的资源是official one

关于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 时,这会有点困难,因为你可以使用很多东西!

仅限初学者 - 您可以按String concatenationFor loop创建动态更改的xpath表达式,如下所示:

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

此外,您可以使用arrays存储XPath表达式返回的多个节点,并使用一个命令处理它们。

对于更多JavaScript,我会推荐一些JavaScript tutorial的第一章,这将大大提高您的工作效率。

答案 1 :(得分:0)

使用循环和函数。这是一种方式:

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';
        }
    }
}




然后阅读"Dont Repeat Yourself"(原文如此)。