ฉันจะตรวจสอบว่าองค์ประกอบถูกซ่อนไว้ใน jQuery ได้อย่างไร


7739

มันเป็นไปได้ที่จะสลับการแสดงผลขององค์ประกอบโดยใช้ฟังก์ชั่น.hide(), .show()หรือ.toggle()?

วิธีที่คุณจะทดสอบว่าเป็นองค์ประกอบvisibleหรือhidden?


49
มันมูลค่าการกล่าวขวัญ (แม้หลังจากที่ทุกเวลานี้) ที่$(element).is(":visible")งานสำหรับ jQuery 1.4.4 แต่ไม่ได้สำหรับ jQuery 1.3.2 ภายใต้อินเทอร์เน็ต & nbsp; & nbsp Explorer ที่ 8 นี้สามารถทดสอบโดยใช้ข้อมูลโค้ดการทดสอบที่เป็นประโยชน์ Tsvetomir Tsonev ของ เพียงจำไว้ว่าให้เปลี่ยน jQuery เวอร์ชันเพื่อทดสอบแต่ละอัน
รูเบน

2
สิ่งนี้เกี่ยวข้องกับคำถามที่แตกต่าง: stackoverflow.com/questions/17425543/…
Mark Schultheiss

คำตอบ:


9396

เนื่องจากคำถามหมายถึงองค์ประกอบเดียวรหัสนี้อาจเหมาะสมกว่า:

// Checks CSS content for display:[none|block], ignores visibility:[true|false]
$(element).is(":visible");

// The same works with hidden
$(element).is(":hidden");

มันเหมือนกับคำแนะนำของ twerntแต่ใช้กับองค์ประกอบเดียว และมันตรงกับขั้นตอนวิธีการที่แนะนำใน jQuery คำถามที่พบบ่อย

เราใช้ jQuery's is () เพื่อตรวจสอบองค์ประกอบที่เลือกด้วยองค์ประกอบอื่นตัวเลือกหรือวัตถุ jQuery ใด ๆ เมธอดนี้สำรวจไปตามองค์ประกอบ DOM เพื่อค้นหาการจับคู่ซึ่งตรงตามพารามิเตอร์ที่ส่งผ่าน มันจะกลับมาจริงถ้ามีการแข่งขันมิฉะนั้นกลับเท็จ


164
วิธีนี้ดูเหมือนจะกระตุ้นให้เกิดการสับสนvisible=falseและdisplay:none; ในขณะที่วิธีการแก้ไขของโมทย์ให้ความชัดเจนแก่ผู้ลงรหัสว่าเจตนาจะตรวจสอบdisplay:none; (ผ่านการกล่าวถึงการซ่อนและแสดงว่าdisplay:noneไม่สามารถควบคุมได้visible=true)
kralco626

93
ถูกต้อง แต่:visibleจะตรวจสอบว่าองค์ประกอบหลักปรากฏหรือไม่ตามที่ chiborg ชี้ให้เห็น
Tsvetomir Tsonev

45
คุณมีประเด็น - ฉันจะทำให้ชัดเจนว่ารหัสตรวจสอบเฉพาะสำหรับdisplayทรัพย์สิน เนื่องจากคำถามเดิมนั้นมีไว้สำหรับshow()และhide()และพวกเขาได้ตั้งdisplayคำตอบของฉันถูกต้อง โดยวิธีการทำงานกับ IE7 นี่คือตัวอย่างทดสอบ - jsfiddle.net/MWZss ;
Tsvetomir Tsonev

53
ฉันพบว่าจริง ๆ แล้วตรรกะคำกลับดีกว่า:! $ ('selector'). คือ (': ซ่อน'); ด้วยเหตุผลบางอย่าง. คุ้มค่าที่จะลอง.
Kzqai

21
นี่คือการทดสอบมาตรฐานง่ายๆคือ () กับ regexp: jsperf.com/jquery-is-vs-regexp-for-css-visibility สรุป: หากคุณไม่ได้ใช้ประสิทธิภาพให้ใช้ regexp over is () (เนื่องจาก is () จะค้นหาโหนดที่ซ่อนอยู่ทั้งหมดก่อนที่จะดูองค์ประกอบที่แท้จริง
Max Leske

1457

คุณสามารถใช้hiddenตัวเลือก:

// Matches all elements that are hidden
$('element:hidden')

และvisibleตัวเลือก:

// Matches all elements that are visible
$('element:visible')

67
เพียงระวังมีเคล็ดลับเกี่ยวกับประสิทธิภาพที่ดีในการนำเสนอนี้: addyosmani.com/jqprovenperformance
codecraig

27
ในหน้า 21 ถึง 28 จะแสดงว่าช้า: ซ่อนหรือ: มองเห็นได้เมื่อเทียบกับตัวเลือกอื่น ๆ ขอบคุณสำหรับการชี้สิ่งนี้
Etienne Dupuis

109
เมื่อคุณจัดการกับองค์ประกอบสองสามอย่างและสิ่งที่เกิดขึ้นน้อยมาก - นั่นคือกรณีส่วนใหญ่ที่ขาดหายไปอย่างรวดเร็ว - ปัญหาเวลาเป็นปัญหาที่น่ากังวลเล็กน้อย โอ้! ใช้เวลา 42 ms แทน 19 ms !!!
vbullinger

16
ฉันสลับองค์ประกอบด้วยการใช้ตัวเลือกนี้ $ ('องค์ประกอบ: ซ่อนอยู่') เป็นจริงเสมอสำหรับฉัน!
ZoomIn

15
@cwingrav คุณอาจต้องการอ่านเอกสารอีกครั้ง: ซ่อนใช้กับองค์ประกอบทั้งหมด องค์ประกอบของแบบฟอร์มที่มีtype="hidden"เพียงหนึ่งกรณีที่สามารถเรียก: ซ่อน องค์ประกอบที่ไม่มีความสูงและความกว้างองค์ประกอบที่มีdisplay: noneและองค์ประกอบที่มีบรรพบุรุษที่ซ่อนอยู่จะมีคุณสมบัติเป็น: ซ่อน
Joshua Walsh

948
if ( $(element).css('display') == 'none' || $(element).css("visibility") == "hidden"){
    // 'element' is hidden
}

วิธีการข้างต้นไม่พิจารณาการมองเห็นของผู้ปกครอง ที่จะต้องพิจารณาผู้ปกครองเป็นอย่างดีคุณควรใช้หรือ.is(":hidden").is(":visible")

ตัวอย่างเช่น,

<div id="div1" style="display:none">
  <div id="div2" style="display:block">Div2</div>
</div>

วิธีการข้างต้นจะพิจารณาdiv2มองเห็นได้ในขณะที่:visibleไม่ แต่ข้างต้นอาจมีประโยชน์ในหลายกรณีโดยเฉพาะอย่างยิ่งเมื่อคุณต้องการค้นหาว่ามีข้อผิดพลาดใด ๆ divs ที่มองเห็นได้ในผู้ปกครองที่ซ่อนอยู่เพราะในเงื่อนไขดังกล่าว:visibleจะไม่ทำงาน


131
สิ่งนี้จะตรวจสอบคุณสมบัติการแสดงผลขององค์ประกอบเดียวเท่านั้น กระบวนการ: แอตทริบิวต์ที่มองเห็นได้จะตรวจสอบการเปิดเผยองค์ประกอบหลักด้วย
chiborg

16
นี่เป็นทางออกเดียวที่ทำงานสำหรับฉันเมื่อทำการทดสอบกับ IE 8
evanmcd

20
@chiborg ใช่ แต่บางครั้งก็เป็นสิ่งที่คุณต้องการและฉันต้องเรียนรู้วิธีการที่ "ฉลาด" jQuery เป็นวิธีที่ยาก ...
Casey

9
นี้ไม่ตอบคำถามที่เป็นคำถามที่เป็นเรื่องเกี่ยวกับองค์ประกอบเดียวและโดยใช้hide(), show()และtoggle()ฟังก์ชั่นอย่างไรก็ตามในขณะที่ส่วนใหญ่ได้กล่าวไว้แล้วว่าเราควรใช้:visibleและ:hiddenหลอกชั้นเรียน
จิมมี่ Knoot

2
คำตอบนี้สามารถใช้เมื่อองค์ประกอบมีอยู่ แต่ไม่ได้อยู่ในหน้าปัจจุบันเช่นหลังจากแยกออก ()
atheaos

526

คำตอบเหล่านี้ไม่มีคำตอบที่ฉันเข้าใจว่าเป็นคำถามซึ่งเป็นสิ่งที่ฉันกำลังค้นหา"ฉันจะจัดการรายการที่มีได้visibility: hiddenอย่างไร" . ไม่มี:visibleและ:hiddenจะไม่จัดการสิ่งนี้เนื่องจากทั้งคู่มองหาการแสดงตามเอกสาร เท่าที่ฉันจะทราบได้ไม่มีตัวเลือกใดที่จะจัดการกับการมองเห็น CSS นี่คือวิธีที่ฉันแก้ไขมัน (ตัวเลือก jQuery มาตรฐานอาจมีไวยากรณ์ที่ย่อมากขึ้น):

$(".item").each(function() {
    if ($(this).css("visibility") == "hidden") {
        // handle non visible state
    } else {
        // handle visible state
    }
});

18
คำตอบนี้เป็นสิ่งที่ดีที่จะจัดการกับvisibilityตัวอักษร How you would test if an element has been hidden or shown using jQuery?แต่คำถามก็คือ การใช้ jQuery หมายถึง: displayคุณสมบัติ
MarioDS

10
องค์ประกอบที่มีvisibility: hiddenหรือopacity: 0ถือว่ามองเห็นได้เนื่องจากยังคงใช้พื้นที่ในเค้าโครง ดูคำตอบโดยPedro Rainhoและเอกสาร jQueryบน:visibleตัวเลือก
ความกลัว

9
คุณจำเป็นต้องสำรวจ DOM เพื่อตรวจสอบพาเรนต์ของโหนดมิฉะนั้นจะไร้ประโยชน์
vsync

389

จากฉันจะตรวจสอบสถานะขององค์ประกอบสลับหรือไม่


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

var isVisible = $('#myDiv').is(':visible');
var isHidden = $('#myDiv').is(':hidden');

หากคุณเพียงแค่แสดงองค์ประกอบตามการมองเห็นคุณสามารถรวม:visibleหรือ:hiddenในนิพจน์ตัวเลือก ตัวอย่างเช่น:

 $('#myDiv:visible').animate({left: '+=200px'}, 'slow');

4
สงสัยว่าทำไมไม่มีคำตอบกล่าวถึงกรณีที่องค์ประกอบถูกย้ายออกไปจากหน้าต่างที่มองเห็นได้เช่นtop:-1000px... คิดว่ามันเป็นกรณีที่ขอบ
jazzcat

294

บ่อยครั้งที่ตรวจสอบว่ามีสิ่งใดปรากฏอยู่หรือไม่คุณกำลังจะไปข้างหน้าทันทีและทำอย่างอื่นกับมัน jQuery การโยงทำให้ง่ายขึ้น

ดังนั้นหากคุณมีตัวเลือกและคุณต้องการที่จะดำเนินการบางอย่างกับมันเฉพาะในกรณีที่มองเห็นหรือซ่อนอยู่คุณสามารถใช้filter(":visible")หรือfilter(":hidden")ตามด้วยการผูกมัดกับการกระทำที่คุณต้องการ

ดังนั้นแทนที่จะเป็นifคำสั่งเช่นนี้:

if ($('#btnUpdate').is(":visible"))
{
     $('#btnUpdate').animate({ width: "toggle" });   // Hide button
}

หรือมีประสิทธิภาพมากขึ้น แต่แม้กระทั่งขี้เหร่:

var button = $('#btnUpdate');
if (button.is(":visible"))
{
     button.animate({ width: "toggle" });   // Hide button
}

คุณสามารถทำได้ทั้งหมดในบรรทัดเดียว:

$('#btnUpdate').filter(":visible").animate({ width: "toggle" });

25
ไม่มีเหตุผลที่จะแยกโหนด DOM ในตัวอย่างที่ใช้ในตัวอย่างจากนั้นต้องค้นหาอีกครั้ง ดีกว่าที่จะทำ: var $ button = $ ('# btnUpdate'); จากนั้นในนิพจน์ If เพียงแค่ใช้ปุ่ม $ แทน $ (ปุ่ม) มีข้อดีของการแคชวัตถุ jQuery
LocalPCGuy

1
นี่คือตัวอย่างง่ายๆjquerypot.com/ ..
Ketan Savaliya

242

:visibleเลือกตามเอกสาร jQuery :

  • พวกเขามี CSS ค่าของdisplaynone
  • type="hidden"พวกเขาเป็นองค์ประกอบของแบบฟอร์มที่มี
  • ความกว้างและความสูงของพวกเขาถูกตั้งค่าเป็น 0 อย่างชัดเจน
  • องค์ประกอบบรรพบุรุษถูกซ่อนดังนั้นองค์ประกอบจะไม่ปรากฏในหน้า

องค์ประกอบที่มีvisibility: hiddenหรือopacity: 0ถือว่ามองเห็นได้เนื่องจากยังคงใช้พื้นที่ในเค้าโครง

สิ่งนี้มีประโยชน์ในบางกรณีและไม่มีประโยชน์กับผู้อื่นเพราะหากคุณต้องการตรวจสอบองค์ประกอบที่มองเห็นได้ ( display != none) โดยไม่สนใจการมองเห็นของผู้ปกครองคุณจะพบว่าการทำเช่น.css("display") == 'none'นั้นไม่เพียง แต่เร็วกว่าเท่านั้น

.css("visibility") == "hidden"หากคุณต้องการที่จะตรวจสอบการแสดงผลแทนการแสดงที่คุณควรใช้:

พิจารณาบันทึกย่อ jQuery เพิ่มเติมด้วย :

เนื่องจาก:visibleเป็นส่วนขยาย jQuery และไม่ได้เป็นส่วนหนึ่งของข้อมูลจำเพาะ CSS การสืบค้นที่ใช้:visibleจึงไม่สามารถใช้ประโยชน์จากการเพิ่มประสิทธิภาพที่มีให้โดยquerySelectorAll()วิธีDOM ดั้งเดิม เพื่อให้เกิดประสิทธิภาพที่ดีที่สุดเมื่อใช้:visibleในการเลือกองค์ประกอบแรกเลือกองค์ประกอบโดยใช้ตัวเลือก CSS .filter(":visible")บริสุทธิ์แล้วการใช้งาน

นอกจากนี้หากคุณกังวลเกี่ยวกับประสิทธิภาพคุณควรตรวจสอบตอนนี้คุณเห็นฉัน ... แสดง / ซ่อนประสิทธิภาพ (2010-05-04) และใช้วิธีการอื่นเพื่อแสดงและซ่อนองค์ประกอบ


214

มันใช้งานได้สำหรับฉันและฉันกำลังใช้show()และhide()ทำให้ div ของฉันถูกซ่อน / มองเห็นได้:

if( $(this).css('display') == 'none' ){
    /* your code goes here */
} else {
    /* alternate logic   */
}

213

การมองเห็นองค์ประกอบและ jQuery ทำงานอย่างไร ;

องค์ประกอบที่อาจซ่อนอยู่ด้วยdisplay:none, หรือvisibility:hidden opacity:0ความแตกต่างระหว่างวิธีการเหล่านั้น:

  • display:none ซ่อนอิลิเมนต์และไม่ใช้พื้นที่ใด ๆ
  • visibility:hidden ซ่อนองค์ประกอบ แต่ยังคงใช้พื้นที่ในเค้าโครง
  • opacity:0ซ่อนองค์ประกอบเป็น "การมองเห็น: ซ่อนอยู่" และยังคงใช้พื้นที่ในเค้าโครง ความแตกต่างเพียงอย่างเดียวคือความทึบช่วยให้องค์ประกอบหนึ่งโปร่งใส

    if ($('.target').is(':hidden')) {
      $('.target').show();
    } else {
      $('.target').hide();
    }
    if ($('.target').is(':visible')) {
      $('.target').hide();
    } else {
      $('.target').show();
    }
    
    if ($('.target-visibility').css('visibility') == 'hidden') {
      $('.target-visibility').css({
        visibility: "visible",
        display: ""
      });
    } else {
      $('.target-visibility').css({
        visibility: "hidden",
        display: ""
      });
    }
    
    if ($('.target-visibility').css('opacity') == "0") {
      $('.target-visibility').css({
        opacity: "1",
        display: ""
      });
    } else {
      $('.target-visibility').css({
        opacity: "0",
        display: ""
      });
    }

    วิธีการสลับ jQuery ที่เป็นประโยชน์:

    $('.click').click(function() {
      $('.target').toggle();
    });
    
    $('.click').click(function() {
      $('.target').slideToggle();
    });
    
    $('.click').click(function() {
      $('.target').fadeToggle();
    });

20
ความแตกต่างระหว่างอีกvisibility:hiddenและopacity:0เป็นองค์ประกอบที่จะยังคงตอบสนองต่อเหตุการณ์ (เช่นการคลิก) opacity:0ด้วย ฉันเรียนรู้เคล็ดลับการสร้างปุ่มที่กำหนดเองสำหรับการอัปโหลดไฟล์
urraka

1
เช่นกันถ้าคุณซ่อนอินพุตด้วยความทึบ: 0 มันยังคงถูกเลือกด้วยรหัสแท็บ
YangombiUmpakati

161

คุณสามารถทำได้โดยใช้ JavaScript ธรรมดา:

function isRendered(domObj) {
    if ((domObj.nodeType != 1) || (domObj == document.body)) {
        return true;
    }
    if (domObj.currentStyle && domObj.currentStyle["display"] != "none" && domObj.currentStyle["visibility"] != "hidden") {
        return isRendered(domObj.parentNode);
    } else if (window.getComputedStyle) {
        var cs = document.defaultView.getComputedStyle(domObj, null);
        if (cs.getPropertyValue("display") != "none" && cs.getPropertyValue("visibility") != "hidden") {
            return isRendered(domObj.parentNode);
        }
    }
    return false;
}

หมายเหตุ:

  1. ทำงานได้ทุกที่

  2. ใช้งานได้กับองค์ประกอบที่ซ้อนกัน

  3. ใช้งานได้กับ CSS และสไตล์อินไลน์

  4. ไม่ต้องการเฟรมเวิร์ก


6
ทำงานแตกต่างจาก jQuery เล็กน้อย จะมีการพิจารณาvisibility: hiddenที่จะมองเห็นได้
alex

4
ง่ายพอที่จะเปลี่ยนรหัสด้านบนเพื่อเลียนแบบพฤติกรรม jQuery (โง่) . . . . ฟังก์ชั่น isRendered (o) {ถ้า ((o.nodeType! = 1) || (o == document.body)) {return true;} ถ้า (o.currentStyle && o.currentStyle ["display"]! = "none") {return isRendered (o.parentNode);} ถ้า if (window.getComputedStyle) {ถ้า (document.defaultView.getComputedStyle (o, null) .getPropertyValue ("display")! = "none") (return isRendered (o.parentNode) );}} return false;}
Matt Brock

3
แน่นอนฉันเพิ่งเพิ่มที่เพื่อประโยชน์ของผู้ใช้ที่ใช้โดยไม่ต้องสแกนรหัส :)
alex

160

.hide { display: none!important; }ผมจะใช้คลาส CSS

การซ่อน / .addClass("hide")/.removeClass("hide")แสดงโทรฉัน .hasClass("hide")สำหรับการตรวจสอบการแสดงผลที่ผมใช้

เป็นวิธีที่ง่ายและชัดเจนในการตรวจสอบ / ซ่อน / แสดงองค์ประกอบหากคุณไม่ได้วางแผนที่จะใช้.toggle()หรือ.animate()วิธีการ


11
.hasClass('hide')ไม่ตรวจสอบว่าบรรพบุรุษของผู้ปกครองนั้นถูกซ่อน (ซึ่งจะทำให้มันถูกซ่อนไว้ด้วย) คุณสามารถทำให้สิ่งนี้ทำงานได้อย่างถูกต้องโดยตรวจสอบว่า.closest('.hide').length > 0แต่ทำไมต้องคิดค้นล้อใหม่
nbrooks

1
ชุดตัวเลือกที่คุณเสนอให้ส่งคืนถ้าองค์ประกอบที่มองเห็นได้บน html ชุดตัวเลือกของฉันจะคืนค่าถ้าองค์ประกอบถูกซ่อนโดยตรงโดยรหัสจาวาสคริปต์ / โปรแกรมดูของคุณ หากคุณรู้ว่าองค์ประกอบหลักไม่ควรถูกซ่อนไว้ให้ใช้. hasClass () เพื่อเข้มงวดมากขึ้นและป้องกันข้อบกพร่องในอนาคต หากคุณต้องการตรวจสอบไม่เพียง แต่การมองเห็น แต่สถานะองค์ประกอบตั้งเกินไป - ใช้. hasclass () เกินไป ในกรณีอื่น ๆ . closest () จะดีกว่า
Evgeny Levin

1
ทำไมคุณไม่ใช้. is (": มองเห็นได้")?
dont_trust_me

138

ลิงค์สาธิต

$('#clickme').click(function() {
  $('#book').toggle('slow', function() {
    // Animation complete.
    alert($('#book').is(":visible")); //<--- TRUE if Visible False if Hidden
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="clickme">
  Click here
</div>
<img id="book" src="https://upload.wikimedia.org/wikipedia/commons/8/87/Google_Chrome_icon_%282011%29.png" alt="" width="300"/>

ที่มา:

Blogger Plug n Play - เครื่องมือและวิดเจ็ต jQuery: วิธีดูว่าองค์ประกอบถูกซ่อนหรือมองเห็นได้โดยใช้ jQuery


1
@Adrew แต่ลิงค์นี้แสดงตัวอย่างการทำงานของฟังก์ชันนี้ ผมคิดว่าคำตอบในทางปฏิบัติอาจมีน้ำหนักมากกว่าหน้าเต็มของข้อความ :)
Spy รหัส

133

หนึ่งสามารถใช้hiddenหรือvisibleคุณลักษณะเช่น:

$('element:hidden')
$('element:visible')

หรือคุณสามารถลดความซับซ้อนเช่นเดียวกันกับมีดังต่อไปนี้

$(element).is(":visible")

130

ebdivstyle="display:none;"ควรจะกำหนดให้ มันใช้งานได้ทั้งการแสดงและการซ่อน:

$(document).ready(function(){
    $("#eb").click(function(){
        $("#ebdiv").toggle();
    });    
});

118

คำตอบอื่นที่คุณควรคำนึงถึงคือถ้าคุณซ่อนองค์ประกอบคุณควรใช้jQueryแต่แทนที่จะซ่อนไว้จริง ๆ คุณลบองค์ประกอบทั้งหมด แต่คุณคัดลอกเนื้อหาHTMLและแท็กตัวเองลงในตัวแปร jQuery แล้ว if (!$('#thetagname').length)ทั้งหมดที่คุณต้องทำคือการทดสอบว่ามีเช่นแท็กบนหน้าจอโดยใช้ปกติ


100

เมื่อทำการทดสอบองค์ประกอบกับ:hiddenตัวเลือกใน jQuery ก็ควรได้รับการพิจารณาว่าเป็นองค์ประกอบในตำแหน่งที่แน่นอนอาจจะได้รับการยอมรับในฐานะที่ซ่อนอยู่แม้ว่าองค์ประกอบเด็กของพวกเขาจะมองเห็นได้

สิ่งนี้ดูเหมือนจะค่อนข้างต่อต้านในตอนแรก - แม้ว่าการดูเอกสาร jQuery อย่างละเอียดจะให้ข้อมูลที่เกี่ยวข้อง:

องค์ประกอบสามารถพิจารณาซ่อนอยู่ได้จากหลายสาเหตุ: [... ] ความกว้างและความสูงของพวกมันถูกตั้งค่าไว้ที่ 0 [... ]

ดังนั้นนี่สมเหตุสมผลจริง ๆ แล้วเกี่ยวกับแบบจำลองกล่องและลักษณะที่คำนวณสำหรับองค์ประกอบ แม้ว่ากว้างและความสูงไม่ได้ตั้งค่าอย่างชัดเจนถึง 0 พวกเขาอาจถูกตั้งค่าโดยปริยาย

ดูตัวอย่างต่อไปนี้:

console.log($('.foo').is(':hidden')); // true
console.log($('.bar').is(':hidden')); // false
.foo {
  position: absolute;
  left: 10px;
  top: 10px;
  background: #ff0000;
}

.bar {
  position: absolute;
  left: 10px;
  top: 10px;
  width: 20px;
  height: 20px;
  background: #0000ff;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="foo">
  <div class="bar"></div>
</div>


อัปเดตสำหรับ jQuery 3.x:

ด้วย jQuery 3 พฤติกรรมที่อธิบายจะเปลี่ยนไป! องค์ประกอบจะได้รับการพิจารณาหากพวกเขามีกล่องเค้าโครงใด ๆ รวมถึงองค์ประกอบของความกว้างเป็นศูนย์และ / หรือความสูง

JSFiddle พร้อม jQuery 3.0.0-alpha1:

http://jsfiddle.net/pM2q3/7/

รหัส JavaScript เดียวกันจะมีผลลัพธ์นี้:

console.log($('.foo').is(':hidden')); // false
console.log($('.bar').is(':hidden')); // false

90

สิ่งนี้อาจใช้งานได้:

expect($("#message_div").css("display")).toBe("none");

7
นี่ภาษาอะไร / ภาษาถิ่น / ห้องสมุด? ฉันไม่คุ้นเคยกับไวยากรณ์นี้ใน JS ...
nbrooks

74

ตัวอย่าง:

$(document).ready(function() {
  if ($("#checkme:hidden").length) {
    console.log('Hidden');
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="checkme" class="product" style="display:none">
  <span class="itemlist"><!-- Shows Results for Fish --></span> Category:Fish
  <br>Product: Salmon Atlantic
  <br>Specie: Salmo salar
  <br>Form: Steaks
</div>


66

วิธีตรวจสอบว่ามองไม่เห็นฉันใช้หรือไม่!:

if ( !$('#book').is(':visible')) {
    alert('#book is not visible')
}

หรือต่อไปนี้เป็น sam การบันทึก jQuery selector ในตัวแปรเพื่อประสิทธิภาพที่ดีขึ้นเมื่อคุณต้องการมันหลายครั้ง:

var $book = $('#book')

if(!$book.is(':visible')) {
    alert('#book is not visible')
}

1
คุณทราบได้อย่างไรว่าการบันทึกตัวเลือกในตัวแปรนั้นเร็วขึ้นจริงๆ?
Ilia Rostovtsev

3
สวัสดี @Ilia Rostovtsev jsperf.com/caching-jquery-selectorsคุณสามารถทำการทดสอบได้ที่นั่น อย่างไรก็ตามมันดีที่จะเก็บไว้ในแคชเพื่อให้สามารถเข้าถึงได้เร็วขึ้น
Matthias Wegtun

2
สิ่งนี้เหมาะสมถ้าคุณต้องการใช้ตัวแปรเดี่ยวตลอดกระบวนการแทนที่จะเรียกและเรียกวัตถุเดียวกัน
Kenneth Palaganas

60

ใช้การสลับคลาสไม่ใช่การแก้ไขสไตล์ . .

การใช้คลาสที่กำหนดไว้สำหรับองค์ประกอบ "การซ่อน" นั้นง่ายและเป็นหนึ่งในวิธีการที่มีประสิทธิภาพที่สุด การสลับคลาส 'ซ่อน' ด้วยDisplayสไตล์ 'none' จะทำงานได้เร็วกว่าการแก้ไขสไตล์นั้นโดยตรง ผมอธิบายบางนี้สวยได้อย่างทั่วถึงในคำถามกองมากเกินเลี้ยวสององค์ประกอบที่มองเห็น / div


แนวทางปฏิบัติที่ดีที่สุดและการเพิ่มประสิทธิภาพ JavaScript

นี่คือวิดีโอที่ให้แสงสว่างอย่างแท้จริงของ Google Tech Talk โดยวิศวกร front-end ของ Nicholas Zakas:


60

ตัวอย่างของการใช้การตรวจสอบที่มองเห็นสำหรับ adblocker เปิดใช้งาน:

$(document).ready(function(){
  if(!$("#ablockercheck").is(":visible"))
    $("#ablockermsg").text("Please disable adblocker.").show();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="ad-placement" id="ablockercheck"></div>
<div id="ablockermsg" style="display: none"></div>

"ablockercheck" เป็น ID ที่ adblocker บล็อก ดังนั้นการตรวจสอบถ้ามันสามารถมองเห็นได้คุณสามารถตรวจพบว่า adblocker เปิดอยู่


58

หลังจากทั้งหมดไม่มีตัวอย่างที่เหมาะกับฉันดังนั้นฉันจึงเขียนของตัวเอง

การทดสอบ (ไม่รองรับ Internet Explorer filter:alpha):

a) ตรวจสอบว่าเอกสารไม่ถูกซ่อนหรือไม่

b) ตรวจสอบว่าองค์ประกอบมีศูนย์ความกว้าง / ความสูง / ความทึบหรือdisplay:none/ visibility:hiddenในรูปแบบอินไลน์

c) ตรวจสอบว่าศูนย์กลาง (หรือยังเพราะเร็วกว่าการทดสอบทุกพิกเซล / มุม) ขององค์ประกอบจะไม่ถูกซ่อนโดยองค์ประกอบอื่น ๆ (และบรรพบุรุษทั้งหมดเช่น: overflow:hidden/ scroll / องค์ประกอบหนึ่งเหนืออีก) หรือขอบหน้าจอ

d) ตรวจสอบว่าองค์ประกอบมีความกว้าง / ความสูง / ความทึบdisplay:none/ หรือการมองเห็นเป็นศูนย์: ซ่อนอยู่ในรูปแบบที่คำนวณได้ (ในบรรดาบรรพบุรุษทั้งหมด)

ทดสอบแล้ว

Android 4.4 (เบราว์เซอร์ดั้งเดิม / Chrome / Firefox), Firefox (Windows / Mac), Chrome (Windows / Mac), Opera (Windows Presto / Mac WebKit), Internet Explorer (Internet Explorer 5-11 โหมดเอกสาร + Internet Explorer 8 บน เครื่องเสมือน) และ Safari (Windows / Mac / iOS)

var is_visible = (function () {
    var x = window.pageXOffset ? window.pageXOffset + window.innerWidth - 1 : 0,
        y = window.pageYOffset ? window.pageYOffset + window.innerHeight - 1 : 0,
        relative = !!((!x && !y) || !document.elementFromPoint(x, y));
        function inside(child, parent) {
            while(child){
                if (child === parent) return true;
                child = child.parentNode;
            }
        return false;
    };
    return function (elem) {
        if (
            document.hidden ||
            elem.offsetWidth==0 ||
            elem.offsetHeight==0 ||
            elem.style.visibility=='hidden' ||
            elem.style.display=='none' ||
            elem.style.opacity===0
        ) return false;
        var rect = elem.getBoundingClientRect();
        if (relative) {
            if (!inside(document.elementFromPoint(rect.left + elem.offsetWidth/2, rect.top + elem.offsetHeight/2),elem)) return false;
        } else if (
            !inside(document.elementFromPoint(rect.left + elem.offsetWidth/2 + window.pageXOffset, rect.top + elem.offsetHeight/2 + window.pageYOffset), elem) ||
            (
                rect.top + elem.offsetHeight/2 < 0 ||
                rect.left + elem.offsetWidth/2 < 0 ||
                rect.bottom - elem.offsetHeight/2 > (window.innerHeight || document.documentElement.clientHeight) ||
                rect.right - elem.offsetWidth/2 > (window.innerWidth || document.documentElement.clientWidth)
            )
        ) return false;
        if (window.getComputedStyle || elem.currentStyle) {
            var el = elem,
                comp = null;
            while (el) {
                if (el === document) {break;} else if(!el.parentNode) return false;
                comp = window.getComputedStyle ? window.getComputedStyle(el, null) : el.currentStyle;
                if (comp && (comp.visibility=='hidden' || comp.display == 'none' || (typeof comp.opacity !=='undefined' && comp.opacity != 1))) return false;
                el = el.parentNode;
            }
        }
        return true;
    }
})();

วิธีใช้:

is_visible(elem) // boolean

50

คุณต้องตรวจสอบทั้ง ... แสดงเช่นเดียวกับการมองเห็น:

if ($(this).css("display") == "none" || $(this).css("visibility") == "hidden") {
    // The element is not visible
} else {
    // The element is visible
}

หากเราตรวจสอบ$(this).is(":visible")jQuery จะตรวจสอบทั้งสองอย่างโดยอัตโนมัติ


41

บางทีคุณสามารถทำอะไรเช่นนี้

$(document).ready(function() {
   var visible = $('#tElement').is(':visible');

   if(visible) {
      alert("visible");
                    // Code
   }
   else
   {
      alert("hidden");
   }
});
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>

<input type="text" id="tElement" style="display:block;">Firstname</input>


37

เพียงตรวจสอบการมองเห็นโดยการตรวจสอบค่าบูลีนเช่น:

if (this.hidden === false) {
    // Your code
}

ฉันใช้รหัสนี้สำหรับแต่ละฟังก์ชั่น มิฉะนั้นคุณสามารถใช้is(':visible')สำหรับการตรวจสอบการมองเห็นขององค์ประกอบ


34

เพราะ Elements with visibility: hidden or opacity: 0 are considered visible, since they still consume space in the layout (ตามที่อธิบายไว้สำหรับjQuery: เลือกที่มองเห็นได้ ) - เราสามารถตรวจสอบว่าองค์ประกอบคือมันมองเห็นได้ในวิธีนี้:

function isElementReallyHidden (el) {
    return $(el).is(":hidden") || $(el).css("visibility") == "hidden" || $(el).css('opacity') == 0;
}

var booElementReallyShowed = !isElementReallyHidden(someEl);
$(someEl).parents().each(function () {
    if (isElementReallyHidden(this)) {
        booElementReallyShowed = false;
    }
});

32

แต่จะเกิดอะไรขึ้นถ้า CSS ขององค์ประกอบเป็นดังต่อไปนี้

.element{
    position: absolute;left:-9999;    
}

ดังนั้นคำตอบสำหรับคำถาม Stack Overflow วิธีการตรวจสอบว่าองค์ประกอบอยู่นอกหน้าจอควรได้รับการพิจารณาด้วยหรือไม่


30

สามารถสร้างฟังก์ชั่นเพื่อตรวจสอบคุณสมบัติการมองเห็น / การแสดงผลเพื่อวัดว่าองค์ประกอบนั้นแสดงใน UI หรือไม่

function checkUIElementVisible(element) {
    return ((element.css('display') !== 'none') && (element.css('visibility') !== 'hidden'));
}

Fiddle ทำงาน


29

นอกจากนี้ยังเป็นนิพจน์เงื่อนไขแบบไตรภาคเพื่อตรวจสอบสถานะขององค์ประกอบแล้วสลับ:

$('someElement').on('click', function(){ $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); });

4
หรือ y'kno เพียงแค่ได้รับการกำจัดของทั้งเงื่อนไขและพูดว่า$('elementToToggle').toggle('slow');...:)
nbrooks

29
if($('#postcode_div').is(':visible')) {
    if($('#postcode_text').val()=='') {
        $('#spanPost').text('\u00a0');
    } else {
        $('#spanPost').text($('#postcode_text').val());
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.