วิธีการแยก jQuery ออกจากแต่ละวง


677

ฉันจะแยก jQuery eachloop ออกจากกันได้อย่างไร

ฉันเหนื่อย:

 return false;

ในวง แต่มันไม่ทำงาน ความคิดใด ๆ


11
สำหรับคนรุ่นหลัง: ทำไมผู้ถามถึงเหตุผลว่าทำไมการคืนความเท็จจึงไม่ได้ผล? แทบทุกคำตอบว่าจะทำอย่างนั้น สงสัยว่ามันอาจจะเป็นเพราะที่สิ้นสุดเพียงแต่ละวง คำสั่งผลตอบแทนภายในสำหรับวงโดยคมชัดจะออกจากวงและฟังก์ชั่นการโทร ที่จะได้รับพฤติกรรมรุนแรงดังกล่าวจากแต่ละวงที่คุณจะต้องตั้งธงที่มีการปิดขอบเขตภายในแต่ละวงแล้วตอบสนองธงนอก
Bob Stein

8
@ BobStein-VisiBone มีคนลบความคิดเห็นเดิมของฉัน ฉันใส่return falseผิดที่ เมื่อฉันคงได้ทำงานทุกอย่าง
Luke101

1
ไม่แน่ใจว่าทำไม "อัปเดต" ระบุว่าreturn falseใช้งานไม่ได้$().each- เพราะเป็นเช่นนั้น
billynoah

2
@ Luke101 คุณควรอัปเดตคำถามเพื่อให้ชัดเจนว่าอะไรไม่ทำงาน Q นี้ / A ทำให้รู้สึกไม่เมื่อคำถามของคุณว่าคำตอบที่ได้รับการยอมรับไม่ได้ทำงาน
xr280xr

คำตอบ:


1180

ไปที่breaka $.eachหรือ$(selector).eachloop คุณจะต้องย้อนกลับไปfalseที่ loop callback

กลับtrueไปที่การวนซ้ำครั้งถัดไปเทียบเท่ากับ a continueในลูปปกติ

$.each(array, function(key, value) { 
    if(value === "foo") {
        return false; // breaks
    }
});

// or

$(selector).each(function() {
  if (condition) {
    return false;
  }
});

3
ขอบคุณสิ่งที่ฉันกำลังมองหา @OZZIE เพียงใช้ "return true;" หรือ "คืนเท็จ" ตามเงื่อนไขของคุณ
dchayka

2
@CMS หมายความว่าอย่างไรกับ "return falsein the loop callback" อยู่ที่ไหนนี่
mesqueeb

เช่น$.each(array, function(key, value) { if(value == "foo") return false; });
SteveEdson

1
ไม่ทราบว่า jQuery ต้องสลับตำแหน่งพารามิเตอร์จาก javascript forEach
Mikee

1
@AlexR การแตกออกจาก a $().eachทำในลักษณะเดียวกันทุกประการการแก้ไขของคุณทำหน้าที่สร้างความสับสนเท่านั้น
Jake

57

ตามเอกสารที่return false;ควรทำ

เราสามารถแบ่งลูป $ .each () [.. ] โดยทำให้ฟังก์ชันการเรียกกลับคืนค่าเป็นเท็จ

กลับเท็จในการโทรกลับ:

function callback(indexInArray, valueOfElement) {
  var booleanKeepGoing;

  this; // == valueOfElement (casted to Object)

  return booleanKeepGoing; // optional, unless false 
                           // and want to stop looping
}

BTW continueทำงานเช่นนี้:

การส่งคืน non-false จะเหมือนกับคำสั่ง continue ใน a for loop; มันจะข้ามไปยังการทำซ้ำครั้งถัดไปทันที


35

ฉันสร้าง Fiddle สำหรับคำตอบสำหรับคำถามนี้เพราะคำตอบที่ยอมรับนั้นไม่ถูกต้องและนี่เป็น StackOverflow เธรดแรกที่ส่งคืนจาก Google เกี่ยวกับคำถามนี้

เพื่อแยกออกจาก $. แต่ละคุณต้องใช้ return false;

นี่เป็นซอพิสูจน์มัน:

http://jsfiddle.net/9XqRy/


14
ฉันชอบซอ แต่ฉันไม่แน่ใจว่าทำไมคุณพูดคำตอบที่ยอมรับไม่ถูกต้องเพราะคุณทั้งสองพูดในสิ่งเดียวกัน
gitsitgo

34

ฉันเจอสถานการณ์ที่พบเงื่อนไขที่ทำให้เกิดการวนซ้ำอย่างไรก็ตามรหัสหลังจากฟังก์ชัน. each () ยังคงทำงานอยู่ จากนั้นฉันจะตั้งค่าสถานะเป็น "true" ด้วยการตรวจสอบทันทีสำหรับการตั้งค่าสถานะหลังจากฟังก์ชั่น. each () เพื่อให้แน่ใจว่ารหัสที่ตามมาไม่ได้ถูกดำเนินการ

$('.groupName').each(function() {
    if($(this).text() == groupname){
        alert('This group already exists');
        breakOut = true;
        return false;
    }
});
if(breakOut) {
    breakOut = false;
    return false;
} 

7

"แต่ละ" ใช้ฟังก์ชั่นการโทรกลับ ฟังก์ชั่นการโทรกลับดำเนินการโดยไม่คำนึงถึงฟังก์ชั่นการโทรดังนั้นจึงเป็นไปไม่ได้ที่จะกลับไปที่ฟังก์ชั่นการโทรจากฟังก์ชั่นการโทรกลับ

ใช้สำหรับลูปถ้าคุณต้องหยุดการประมวลผลลูปตามเงื่อนไขบางอย่างและยังคงอยู่ในฟังก์ชั่นเดียวกัน


6

ฉันรู้ว่ามันเป็นคำถามที่ค่อนข้างเก่า แต่ฉันไม่เห็นคำตอบใด ๆ ซึ่งชี้แจงว่าทำไมและเมื่อใดที่เป็นไปได้ที่จะทำลายด้วยการกลับมา

ฉันต้องการอธิบายด้วย 2 ตัวอย่างง่ายๆ:

1. ตัวอย่าง: ในกรณีนี้เรามีการทำซ้ำอย่างง่ายและเราต้องการทำลายด้วยการส่งคืนจริงถ้าเราสามารถหาทั้งสามได้

function canFindThree() {
    for(var i = 0; i < 5; i++) {
        if(i === 3) {
           return true;
        }
    }
}

ถ้าเราเรียกฟังก์ชันนี้มันจะคืนค่าจริง

2. ตัวอย่าง ในกรณีนี้เราต้องการทำซ้ำกับ jquery's แต่ละฟังก์ชั่นซึ่งใช้ฟังก์ชั่นที่ไม่ระบุชื่อเป็นพารามิเตอร์

function canFindThree() {

    var result = false;

    $.each([1, 2, 3, 4, 5], function(key, value) { 
        if(value === 3) {
            result = true;
            return false; //This will only exit the anonymous function and stop the iteration immediatelly.
        }
    });

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