【问题标题】:Why do jQuery .prev() and .next() work incorrectly?为什么 jQuery .prev() 和 .next() 工作不正确?
【发布时间】:2022-01-11 21:18:55
【问题描述】:

为什么当我在这里使用 .prev()(与 .next() 相同)来启动除 r2 之前的音频之外的所有音频时,它会启动除 r2 和一些随机的音频(不完全是先前的音频)之外的所有音频?它应该只播放 r2 元素的前一个。我试着理解这一点

<html>
<head>
<script type="text/javascript" src="RadioN.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js">
</script>
<script>
$(document).ready(function(){
$("#i1").click(function(){
var player = $("audio").not("#r2").prev();for(i=0; i<player.length; i++) player[i].play();
});
});
</script>
</head>
<body>
<a href="#">
<img id="i1" src="r1.png" style="height:50px"></a><br>
<div>
<audio class="r" id="r1" src="https://rs103-krk-cyfronet.rmfstream.pl/RMF24" controls preload="none" style="visibility: visible"></audio>
<audio class="r" id="r2" src="https://radiostream.pl/tuba10-1.mp3" controls preload="none" style="visibility: visible"></audio>
<audio class="r" id="r4" src="https://c13.radioboss.fm:18296/stream" controls preload="none" style="visibility: visible"></audio>
<audio class="r" id="r5" src="http://stream.affordablestreaming.com:8000/KDDL.mp3" controls preload="none" style="visibility: visible"></audio>
<audio class="r" id="r6" src="https://p10.p4groupaudio.com/P10_MM" controls preload="none" style="visibility: visible"></audio>
</div>
</body>
</html>

【问题讨论】:

  • $("audio").not("#r2").prev() 将选择 ID 为 r2、r4 和 r5 的元素。那么你真正想做的是什么?
  • 我尝试选择除 "#r2" 之前的 ID 之外的所有 ID 并将它们设为 .play。在这种情况下,答案是“选择除“r1”之外的所有内容,但我尝试了解使用 .prev() 和 .next() 的一般方式。这背后的想法是学习如何编写“播放除给定 ID 的 3 个前一个和 3 个后一个 ID 之外的所有音频”
  • .not("#r2").prev() 不是上下文过程。 .not('#r2').prev() 的功能无关。
  • .not 接受一个函数,您可以使用与 .filter 相同的方法从集合中直接过滤掉 #r2 之前的任何元素。或者,.not 也接受一个集合,因此您可以选择 #r2 的前一个兄弟并将其传递给 .not。 .not($('#r2').prev())
  • 你是对的。 fmquaglia 也纠正了我的误解。但是现在如何编写“播放除 r2 之前的所有内容”的代码?最后“播放除了给定ID的前一个ID,这个给定ID的第二个和第三个之前的所有内容”?

标签: javascript jquery


【解决方案1】:

jQuery 的prev 方法将返回与.not('#r2') 匹配的元素的先前兄弟元素的数组。

.not('#r2') 将返回 [audio#r1.r, audio#r4.r, audio#r5.r, audio#r6.r]

.not('#r2').prev() 将返回 [audio#r2.r, audio#r4.r, audio#r5.r]。 这是:

  • #r1 前一个兄弟姐妹将不返回任何内容
  • #r4 前一个兄弟姐妹将是 #r2
  • #r5 上一个兄弟姐妹将是 #r4
  • #r6 前一个兄弟姐妹将是 #r5

如果您只想播放 #r2 的前一个兄弟,您应该使用更具确定性的选择器。 $("audio#r2").prev().get(0).play() 之类的可能是?

【讨论】:

  • 感谢您的澄清!我显然误解了 .not 和 .prev 之间的关系。实际上我打算做的是除了#r2的前一个兄弟之外的所有东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2011-09-27
  • 2011-07-24
  • 2020-11-07
  • 1970-01-01
相关资源
最近更新 更多