匹配元素,其ID以字符串开头,而不仅仅匹配字符串

时间:2012-02-15 10:08:52

标签: jquery jquery-selectors

我正在尝试使用JQuery UI编写一个函数,该函数接受一行的id并隐藏所有其他具有id的行,其中id作为参数传递给函数。 (如果单击父行,我正在尝试折叠子行等。)

例如

如果传递的id为'1',则应隐藏ID为'11','111','12','121','122'等的所有行,但不应将ID为ID的行隐藏起来'1'

如果传递的id为'2',则所有具有ID'21','211','22','221','222'等的行都应该被隐藏,但不应该是具有ID的行。 '2'

目前我正在尝试这样的事情:

$(function() {
        // run the currently selected effect
        function runEffect(divId) {

            // set effect type
            var selectedEffect = "blind";

            // most effect types need no options passed by default
            var options = {};

            // run the effect
            $('tr[id^=%s]'.replace('%s',divId)).hide( selectedEffect, options, 1000, callback );
        };

        // callback function
        function callback() {

        };

        // set effect from select menu value
        $( "tr" ).click(function() {
            var divId = this.getAttribute('id');
            runEffect(divId);
            return false;
        });
    });

这只能解决一个问题。它还隐藏了传递了id的行。因此,如果我点击ID为“1”的行,它会隐藏ID为1的所有行以及从1开始的所有行。我只想隐藏以ID 1开头的所有其他行,但不要隐藏ID为1的行。

Please help!

1 个答案:

答案 0 :(得分:1)

你可以在那里扔.not来做到这一点:

$('tr[id^=%s]'.replace('%s',divId)).not('#' + divId).hide...

旁注1:我认为我不会在那里使用replace,一般情况下你应该用引号括住属性值(尽管你已经显示了ID值,但你可以没有引号,因为它们没有空格;一般来说这只是一个好主意)。 E.g:

$('tr[id^="' + divId + '"]'.not('#' + divId).hide...

旁注2:id以数字开头的值为not valid in CSS;他们不能以数字开头。它们在invalid in HTML之前也是HTML5,这扩大了允许值的范围。由于jQuery使用CSS样式选择器,因此在使用jQuery时,我倾向于坚持使用最严格的ID值形式(CSS)。 FWIW。