jquery ค้นหาพี่น้องที่ใกล้เคียงที่สุดก่อนหน้านี้กับชั้นเรียน


146

นี่คือ html คร่าวๆที่ฉันได้ทำงานกับ:

<li class="par_cat"></li>
<li class="sub_cat"></li>
<li class="sub_cat"></li>
<li class="par_cat"></li> // this is the single element I need to select
<li class="sub_cat"></li>
<li class="sub_cat"></li>
<li class="sub_cat current_sub"></li> // this is where I need to start searching
<li class="par_cat"></li>
<li class="sub_cat"></li>
<li class="par_cat"></li>

ฉันต้องการข้ามจาก.current_subหาสิ่งที่ใกล้เคียงที่สุดก่อนหน้านี้.par_catและทำสิ่งต่าง ๆ กับมัน

.find("li.par_cat")ส่งคืนภาระทั้งหมดของ.par_cat(ฉันมีประมาณ 30 ในหน้า) ฉันต้องการเป้าหมายเดี่ยว

ขอขอบคุณเคล็ดลับใด ๆ :)


7
ว้าวแมวอยู่ทั่วอินเทอร์เน็ตจริงๆ! ตอนนี้เรามีแมวที่ตราไว้และแมวย่อยด้วย
JD Smith

คำตอบ:


257

ลอง:

$('li.current_sub').prevAll("li.par_cat:first");

ทดสอบด้วยมาร์กอัปของคุณ:

$('li.current_sub').prevAll("li.par_cat:first").text("woohoo");

จะเติมที่ใกล้เคียงที่สุดก่อนหน้าli.par_catด้วย "woohoo"


ขอบคุณ Karim สิ่งนี้ทำงานได้ดีเช่นกัน แต่ฉันคิดว่า. prev () จะกินทรัพยากรน้อยลงเนื่องจาก. prevAll จะได้รับองค์ประกอบที่ตรงกันก่อนหน้านี้ทั้งหมดจากนั้นจะกรองสิ่งที่ฉันต้องการ ยอมรับคำตอบของเอ็ด
daulex

3
จริงๆแล้วหลังจากการส่งข้อความเล็กน้อย. prev () ล้มเหลวในบางกรณี .prevAll ด้วย: ก่อนทำงานทุกครั้ง ขอบคุณ.
daulex

1
.prev () ตรวจสอบองค์ประกอบก่อนหน้าทันทีเท่านั้น ฉันเพิ่มความคิดเห็นในคำตอบด้านล่างพร้อมกับ jsFiddle เป็นตัวอย่าง หลังจากมองไปรอบ ๆ นี่เป็นคำตอบที่ดีที่สุดราวกับว่ามันต้องวนไปตามองค์ประกอบทั้งหมดมันไม่จำเป็นต้องใช้สองฟังก์ชั่นในการคว้าทั้งหมดแล้วกรองเพื่อค้นหามัน
David Hobs

8
หมายความว่า:firstทำงานในรายการองค์ประกอบที่ส่งคืนซึ่งเริ่มใกล้กับวัตถุที่เลือก (ตรงข้ามกับด้านบนไปด้านล่างเมื่อเทียบกับหน้า) หรือไม่
NReilingh

2
ขอบคุณมากสำหรับคำตอบที่มีประโยชน์มาก คุณช่วยตอบคำถาม @NReilingh ได้ไหมเพราะมันทำให้ฉันสับสนจริงๆ ไม่ใช่:firstCSS selector ที่เลือกองค์ประกอบแรกในDOM (เช่นdiv.red:firstจะเลือก DIV สีแดงตัวแรกในDOM ) jQuery แยกวิเคราะห์ตัวเลือกต่างกันหรือไม่?
นักบัญชี

17

ลอง

$('li.current_sub').prev('.par_cat').[do stuff];


19
รออะไร? สิ่งนี้ไม่เพียงตรวจสอบองค์ประกอบก่อนหน้าทันทีหรือไม่ ดังนั้นรหัสของคุณจะกลับเป็นโมฆะ? - ที่นี่มีการทดสอบกับ jsFiddle: jsfiddle.net/Y2TEH
David Hobs

4
@DavidHobs ฉันเขียนเมื่อสองปีก่อน .... ฉันจะใช้ prevAll () ทุกวันนี้
Ed James

8
@EdWoodcock พิจารณาอัปเดตคำตอบของคุณในกรณีนั้น
Hugo Zink

14

การใช้ prevUntil () จะช่วยให้เราได้รับพี่น้องที่อยู่ห่างไกลโดยไม่ต้องรับทั้งหมด ฉันมีชุดยาวโดยเฉพาะที่ใช้ CPU มากเกินไป prevAll ()

var category = $('li.current_sub').prev('li.par_cat');
if (category.length == 0){
  category = $('li.current_sub').prevUntil('li.par_cat').last().prev();
}
category.show();

สิ่งนี้จะได้รับพี่น้องก่อนหน้านี้ถ้ามันตรงกันมิฉะนั้นจะได้รับพี่น้องก่อนหน้าหนึ่งตรงกันดังนั้นเราเพิ่งสำรองอีกหนึ่งกับ prev () เพื่อรับองค์ประกอบที่ต้องการ


5

ฉันคิดว่าคำตอบทั้งหมดขาดอะไรบางอย่าง ฉันชอบที่จะใช้สิ่งนี้

$('li.current_sub').prevUntil("li.par_cat").prev();

บันทึกคุณไม่ได้เพิ่ม: อันดับแรกภายในตัวเลือกและอ่านและเข้าใจได้ง่ายขึ้น วิธี prevUntil () มีประสิทธิภาพที่ดีขึ้นเช่นกันแทนที่จะใช้ prevAll ()


0

คุณสามารถทำตามรหัสนี้:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
    $(document).ready(function () {
        $(".add").on("click", function () {
            var v = $(this).closest(".division").find("input[name='roll']").val();
            alert(v);
        });
    });
</script>
<?php

for ($i = 1; $i <= 5; $i++) {
    echo'<div class = "division">'
        . '<form method="POST" action="">'
        . '<p><input type="number" name="roll" placeholder="Enter Roll"></p>'
        . '<p><input type="button" class="add" name = "submit" value = "Click"></p>'
        . '</form></div>';
}
?>

คุณสามารถรับแนวคิดได้จากสิ่งนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.