【问题标题】:Match first occurrence of element backwards in jQuery在jQuery中向后匹配元素的第一次出现
【发布时间】:2014-07-19 04:12:29
【问题描述】:

我有一个包含一些表单的页面。在提交时,我想匹配第一次出现的元素(即段落)向后搜索表单。例如

  • #firstform提交我想匹配 #secondparagraph
  • #secondform提交我想匹配 #thirdparagraph

<div>
  <p id="firstparagraph">Some other paragraph</p>
  <ul>
    <li>First element</li>
    <li>Second element</li>
  </ul>
  <p id="secondparagraph">Some other paragraph</p>
</div>

<form id="firstform">
  <input type="submit" value="Submit1" />
</form>

<p id="thirdparagraph">Some other paragraph</p>

<form id="secondform">
  <input type="submit" value="Submit2" />
</form>

是否可以创建一个向后搜索并在第一次匹配时停止的 jQuery 函数?

【问题讨论】:

  • 这不是一个容易解决的问题,因为您需要递归地查看表单的兄弟元素以查找所需的 p 标记。您能否发布您尝试编写的代码来解决此问题。
  • &lt;div&gt; 必须存在吗?它使代码变得更加困难。如果&lt;div&gt; 不存在,它就像$('form').on('submit', function () { var paragraph = $(this).prevAll('p').first(); }); 一样简单
  • 它很大程度上取决于HTML结构,一般情况下我认为代码并不简单。
  • @RoryMcCrossan:实际上我对可能的代码一无所知。我发现了一些 jQuery 函数,例如 prevAll 或 reverse,但它们中的每一个似乎都只搜索兄弟姐妹。我完全意识到这不是一个微不足道的问题,因为我想独立于 HTML 结构找到第一次出现。我知道这是一个非常普遍的问题,因此非常困难。
  • 这个的用例是什么?为什么你的结构如此随机?

标签: jquery dom jquery-selectors


【解决方案1】:

你可以这样做:

var p = $(this).parents().addBack().prevAll().find('p').addBack('p').last();

demonstration

这个想法是从所有父母的前兄弟姐妹中收集一个集合,并在这个(大)集合中搜索最后一段。

【讨论】:

  • 我认为这是一个非常聪明的解决方案。当然,这假设我实际上没有对 jQuery 有深入的了解。让我想一想(分析链上每个命令的结果对我来说相当复杂),但我认为它可能是最好的,因为它非常笼统。
  • addBack() 现在是 jQuery 中的 andSelf() >= 1.8: api.jquery.com/andSelf api.jquery.com/addBack
  • @WesTurner 不推荐使用的是addBack,在这个答案中使用。
  • 谢谢!演示中还是andSelf
  • @WesTurner 哦,谢谢,我现在明白你的评论了。我编辑了小提琴。
【解决方案2】:

我认为jQuery按照我们阅读代码的顺序遍历元素,所以你可以试试这段代码,为了演示,我什至添加了一些嵌套的p元素,但可能不是你的情况。这适用于您拥有的任何 HTML 结构:

var token = 'abd432432efdfsdfe42342398kjkfljsdlkfjs';
$('input').click(function(e){
  $(this).wrap($("<p>").attr('id',token));
  var p;
  $('p[id]').each(function(i){        
    if($(this).attr('id') == token) return false;        
    p = $(this);
  });
  $(this).unwrap();
  //try showing the id of the matched p element
  alert(p.attr('id'));
  e.preventDefault();
});

Demo.

我们应该只搜索具有id 属性(或其他符号)的p 元素,因为浏览器有时会插入一些空的p 元素,因此会出现意外结果。

【讨论】:

  • @Barmar 谢谢 :) 但是它需要一些时间来思考,甚至​​因为空的p 元素(由浏览器自动插入)导致的意外结果而浪费了一些时间。
  • @dystroy 我不知道你的意思是直接搜索。如果您的意思是搜索整个文档的 HTML 文本,是的,我想到了这种方式,我只是喜欢使用 jQuery 的这种方式。
  • @dystroy 啊,如果事先知道 HTML 结构,那么这样做当然会简单得多,而且 more 高效。但是我添加了这个作为一个通用的解决方案,其中 HTML 结构无关紧要(它可以改变,并且代码仍然有效)。
  • 当然,我的解决方案也很通用。
  • @dystroy 不敢相信,你的代码更短,效率更高,我在这里做了一个 jsperf jsperf.com/demo1-vs-demo2 。我不敢相信我的解决方案太慢了。
【解决方案3】:

如果您只是在寻找 (type) 的最后一个元素,:last 选择器就是您要寻找的。它匹配元素的最后一次出现。所以

$("p:last")

会得到最后一段。

但是我理解它的方式,你想在另一个元素之前获取最后一个元素(在你的情况下,点击提交按钮),有几天的时间来做。我会使用类似的东西

$(myElement).prevAll('p:first');

您使用了类似的选择器,但现在它只影响提交元素之前的 DOM 元素(或您想要使用的任何元素)。您使用:first 而不是:last,因为prevAll() 以相反的顺序获取元素列表。

JSfiddle demonstrating this

【讨论】:

  • prevAll 只返回给定元素的兄弟姐妹。看他的例子,#secondparagraph不是#firstform的兄弟,是侄子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多