วิธีตรวจสอบว่าโมดอล bootstrap เปิดอยู่หรือไม่ฉันจึงสามารถใช้ jquery validate ได้


111

ฉันจำเป็นต้องทำการตรวจสอบความถูกต้องก็ต่อเมื่อโมดอลเปิดอยู่เพราะถ้าฉันเปิดแล้วฉันก็ปิดมันและฉันกดปุ่มที่เปิดโมดอลมันใช้ไม่ได้เพราะกำลังทำการตรวจสอบ jquery แต่ไม่ใช่ แสดงเนื่องจากโมดอลถูกปิด

ดังนั้นฉันต้องการโฆษณา jquery หากโมดอลเปิดอยู่เพื่อให้ฉันตรวจสอบความถูกต้องเป็นไปได้หรือไม่

<script>
$(document).ready(function(){

var validator =$('#form1').validate(
 {
  ignore: "",
  rules: {

usu_login: {
  required: true
},
usu_password: {
  required: true
},
usu_email: {
  required: true
},
usu_nombre1: {
  required: true
},
usu_apellido1: {
  required: true
},
usu_fecha_nac: {
  required: true
},
usu_cedula: {
  required: true
},
usu_telefono1: {
  required: true
},
rol_id: {
  required: true
},
dependencia_id: {
  required: true
},
  },

  highlight: function(element) {
$(element).closest('.grupo').addClass('has-error');
        if($(".tab-content").find("div.tab-pane.active:has(div.has-error)").length == 0)
        {
            $(".tab-content").find("div.tab-pane:hidden:has(div.has-error)").each(function(index, tab)
            {
                var id = $(tab).attr("id");

                $('a[href="#' + id + '"]').tab('show');
            });
        }
  },
  unhighlight: function(element) {
$(element).closest('.grupo').removeClass('has-error');
  }
 });

}); // end document.ready

</script>

คำตอบ:


183

เพื่อหลีกเลี่ยงเงื่อนไขการแข่งขันที่ @GregPettit กล่าวถึงคุณสามารถใช้:

($("element").data('bs.modal') || {})._isShown    // Bootstrap 4
($("element").data('bs.modal') || {}).isShown     // Bootstrap <= 3

ตามที่กล่าวไว้ในทวิตเตอร์ Bootstrap Modal - IsShown

เมื่อกิริยายังไม่ได้เปิด.data('bs.modal')ผลตอบแทนundefinedจึง|| {}- ซึ่งจะทำให้isShownข้อมูล (falsy) undefinedมูลค่า หากคุณเคร่งครัดคุณสามารถทำได้($("element").data('bs.modal') || {isShown: false}).isShown


2
มีปัญหากับสิ่งนี้หากโมดอลไม่ได้เปิดคุณจะได้รับ "ไม่ได้กำหนด" จาก $ ("element") data ('bs.modal')
Flezcano

._isShown ได้ผลสำหรับฉันฉันใช้ bootstrap 4 alpha
Iftikar Urrhman Khan

8
ใน Bootstrap 4 ก็ไม่ได้_isShown isShown
elquimista

ฉันแค่ตรวจสอบว่าโมดอลมีคลาส 'แสดง' (bootstrap 4) - ใช้งานได้ตามที่ฉันต้องการหรือไม่ การตรวจสอบ _isShown ดีขึ้นหรือไม่?
trainoasis

คุณช่วยแบ่งปันวิธีแก้ปัญหาใน typescript ได้ไหม
สุรจิตต์บิสวาส

81

คุณสามารถใช้ได้

$('#myModal').hasClass('in');

Bootstrap เพิ่มinคลาสเมื่อโมดอลเปิดอยู่และลบออกเมื่อปิด


4
สิ่งนี้กลายเป็นเรื่องที่เปราะบางเล็กน้อยกับตัวเลือกการจางและการคลิกอย่างรวดเร็วหรือการเรียกใช้โมดอลผ่านการโทร Ajax การหน่วงเวลาในการจางสามารถสร้างเงื่อนไขการแข่งขันได้ ถึงกระนั้นวิธีที่มีประโยชน์ในการเชื่อมต่อเมื่อเนื้อหาเป็นแบบคงที่และโมเดลจะปรากฏขึ้นระหว่างการโต้ตอบกับผู้ใช้เท่านั้น!
Greg Pettit

วิธีที่ปลอดภัยและแน่นอนที่สุดในการหลีกเลี่ยงสภาวะการแข่งขันในโมดอล Bootstrap คือสมัครรับข้อมูลshown.bs.modalหรือhidden.bs.modalกิจกรรม ด้วยวิธีนี้เมื่อรหัสเหตุการณ์ของคุณได้รับการควบคุมคุณจะตายแน่ ๆ ว่ากล่องโต้ตอบไม่อยู่ในสถานะงอน
Eric Lloyd

มันถูกต้องใน Bootstrap เวอร์ชัน 4 หรือไม่?
Mahdi Alkhatib

1
@MahdiAlkhatib ไม่สิ่งนี้ใช้ไม่ได้ใน Bootstrap 4 คุณสามารถแทนที่'in'ด้วย'show'Bootstrap 4 ได้
Philip Stratford

61

คุณยังสามารถใช้ jQuery ได้โดยตรง

$('#myModal').is(':visible');

1
เช่นเดียวกับเมื่อคำตอบนั้นง่าย หากใช้ ajax ฉันจะใช้สิ่งนี้ใน onbefore และตรวจสอบและส่งคืนเท็จวิธีนี้จะป้องกันการโทรไปยังเซิร์ฟเวอร์หลายครั้ง ขอบคุณ!
eaglei22

คำตอบที่ยอมรับกลับไม่ได้กำหนดหรือเป็นโมฆะ สิ่งนี้ทำงานได้อย่างไม่มีที่ติ ขอบคุณ!
อเล็กซ์

8

ตรวจสอบว่าโมดอลเปิดอยู่หรือไม่

$('.modal:visible').length && $('body').hasClass('modal-open')

เพื่อแนบตัวฟังเหตุการณ์

$(document).on('show.bs.modal', '.modal', function () {
    // run your validation... ( or shown.bs.modal )
});

6

Bootstrap 2, 3 Check คือโมดอลที่เปิดอยู่ในหน้า:

if($('.modal.in').length)

เวอร์ชั่นที่รองรับBootstrap 2, 3, 4+

if($('.modal.in, .modal.show').length)

เฉพาะBootstrap 4+

if($('.modal.show').length)

3
ฉันใช้ Bootstrap 4.1.3และเพิ่มshowคลาสแทนin.
Arif Hussain

4
$("element").data('bs.modal').isShown

จะไม่ทำงานหากไม่ได้แสดงโมดอลมาก่อน คุณจะต้องเพิ่มเงื่อนไขเพิ่มเติม:

$("element").data('bs.modal')

ดังนั้นคำตอบโดยคำนึงถึงการปรากฏตัวครั้งแรก:

if ($("element").data('bs.modal') && $("element").data('bs.modal').isShown){
... 
}



0

ทำไมสิ่งที่ซับซ้อนในเมื่อมันสามารถทำได้ด้วย jQuery ง่ายๆดังต่อไปนี้

$('#myModal').on('shown.bs.modal', function (e) {
    console.log('myModal is shown');
    // Your actual function here
})
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.