【问题标题】:selecting a table row which contains a tr with a certain text with jQuery using .filter()使用 .filter() 使用 jQuery 选择包含带有特定文本的 tr 的表行
【发布时间】:2013-06-20 19:56:13
【问题描述】:

我正在尝试使用jQuery .filter() 函数选择包含one td 和特定文本的表中的行。我的函数是这样的......

function getBudgetRowByType(serviceTypeNum) {
        alert(serviceTypeNum);
        if (parseInt(serviceTypeNum) == 1) {
            var row = $('.bgTablePopUp > tbody > tr').filter(function () {
                $(this).children("td:contains('Instruction')");
            });
            return row;
        } else if (parseInt(serviceTypeNum) == 2) {
            var row = $('.bgTablePopUp > tbody > tr').filter(function () {
                $(this).children("td:contains('Research')");
            });
            return row;
        } else if (parseInt(serviceTypeNum) == 3) {
            var row = $('.bgTablePopUp > tbody > tr').filter(function () {
                $(this).children("td:contains('Administration')");
            });
            return row;
        } else {
            // Else nada
            return null;
        }
    }

html 看起来像这样......

<table>
<tr>
<td>Instruction</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td>Research</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td>Administration</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
</table>

我不断收到未定义的结果,我不知道为什么...

【问题讨论】:

    标签: javascript jquery html dom web-applications


    【解决方案1】:

    像这样使用.filter - (其他条件相同

    if (parseInt(serviceTypeNum) == 1) {
                var row = $('.bgTablePopUp > tbody > tr > td').filter(function () {
                        return $.trim($(this).text()) === "Instruction";
                }).closest('tr');
                return row;
            }
    

    【讨论】:

    • 我不明白为什么我的原始代码不起作用。如果找到这样的孩子,DOM 查询不会返回 true 吗?我的意思是如果我添加了 return 关键字...
    • @MassStrike 不,您需要明确返回 true 或 false。更多信息可以参考api---&gt;api.jquery.com/filter
    【解决方案2】:

    这是一种 POJS 方法(IE9+),否则需要 Array.prototype.filter 支持(有垫片),document.querySelectorsAll(但您可以使用其他 DOM 方法来获取 tr 元素,或者再次它们是可用的垫片,您可以使用 jquery 来选择它们)和Node.textContent(垫片再次可用,或者只是遍历 DOM 并收集文本节点)。我认为看到替代方案很好,您已经为您的jQuery.filter 问题选择了答案。您可能还会发现使用 switch 语句更适合您正在做的事情。

    Javascript

    function contains(elements, string) {
        return Array.prototype.filter.call(elements, function (tr) {
            return tr.textContent.indexOf(string) !== -1;
        });
    }
    
    function getBudgetRowByType(serviceTypeNum) {
        var row = null,
            selector = "table tr";
    
        switch (parseInt(serviceTypeNum)) {
            case 1:
                row = contains(document.querySelectorAll(selector), "Instruction");
                break;
            case 2:
                row = contains(document.querySelectorAll(selector), "Research");
                break;
            case 3:
                row = contains(document.querySelectorAll(selector), "Administration");
                break;
            default:
        }
    
        return row;
    }
    
    console.log(getBudgetRowByType("1"));
    console.log(getBudgetRowByType("2"));
    console.log(getBudgetRowByType("3"));
    console.log(getBudgetRowByType("4"));
    

    开启jsfiddle

    【讨论】:

    • 哦,这是一个很酷的解决方案,我将不得不更仔细地阅读它,有些东西我以前从未见过。谢谢大佬!
    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 2012-03-14
    • 2021-02-23
    • 2015-10-28
    • 2015-05-11
    • 1970-01-01
    • 2015-02-06
    • 2013-06-08
    相关资源
    最近更新 更多