jQuery匹配ID的下一个“行”,没有递归

时间:2012-09-10 12:23:44

标签: jquery html

这有点奇怪,注意我不能改变由doxygen生成的HTML。

我正在尝试更改文件浏览器javascript的工作方式,目前如果您单击一个文件夹,它会完全展开它下面的所有文件夹。相反,我想只显示文件夹中的文件夹和文件。

HTML就像(简单的无效html)

<table>
<tr id="row_0" onclick="toggleFolder(0)">Folder1</tr>
<tr id="row_0_0" onclick="toggleFolder(0_0)">Project1</tr>
<tr id="row_0_0_0">File1.c</tr>
<tr id="row_1" onclick="toggleFolder(1)>Folder 2</tr>
</table>

代表如下结构:

  • 文件夹1
    • 项目1
      • File1中
  • 文件夹2

目前doxygen的javascript toggleFolder函数的工作原理如下(我添加了注释来解释发生了什么)。

function toggleFolder(id)
{
  var n = $('[id^=row_'+id+']'); //all rows "beneath" the clicked one
  var i = $('[id^=img_'+id+']'); //img's in rows "beneath" clicked
  var a = $('[id^=arr_'+id+']'); //a's in rows "beneath" clicked
  var c = n.slice(1); //remove the first match (the clicked row)

  //If the first element (reduce matches) is visible hide everything...
  if (c.filter(':first').is(':visible')===true) {
    i.attr('src','ftv2folderclosed.png'); //probably not needed
    a.attr('src','ftv2pnode.png'); //probably not needed
    c.hide();
  } else {
    i.attr('src','ftv2folderopen.png');
    a.attr('src','ftv2mnode.png');
    c.show();
  }
  updateStripes(); //update even/odd classes
}

相反,我只想在单击row_0而不是row_0_0_0时选择 row_0_0,如何更改选择器以实现此功能?

谢谢你的时间!


最后,我根据接受的答案使用了类似下面的内容

行只是$(tr)等价物

  //Only match elements AFTER this one (can't hide elements before)
  var childRows = rows.filter(function() {
    re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
    return this.id.match(re);
  });

  //All sub images
  var childImages = childRows.find("img");

  //Only the img images
  var childImg = childImages.filter("[id^=img]");

  //Only the arr images
  var childArr = childImages.filter("[id^=arr]");

1 个答案:

答案 0 :(得分:1)

替换:

var n = $('[id^=row_'+id+']');

使用:

var n = $("tr").filter(function() {
    re = new RegExp('^row_'+id+'_\\d+$', "i");
    return this.id.match(re);
});

等效代码也适用于图像/锚点(但我没有在你的问题中看到示例,因此无法编写正确的过滤器)。