ไม่อนุญาตให้ปิดหน้าต่าง modal Twitter Bootstrap


549

ฉันกำลังสร้างหน้าต่างโมดัลโดยใช้ Twitter Bootstrap พฤติกรรมเริ่มต้นคือถ้าคุณคลิกนอกพื้นที่ modal คำกริยาจะปิดโดยอัตโนมัติ ฉันต้องการปิดการใช้งานนั่นคือไม่ปิดหน้าต่าง modal เมื่อคลิกนอก modal

มีคนแบ่งปันรหัส jQuery เพื่อทำสิ่งนี้ได้ไหม


1
คุณอาจมีเหตุผลที่ถูกต้องสมบูรณ์ในการทำเช่นนี้ (และมีแนวโน้มอื่น ๆ อีกมากมาย) อย่างไรก็ตามเป็นเรื่องที่น่าสังเกตว่าโดยทั่วไปการพิจารณา UX จะแนะนำในเรื่องนี้ - ผู้ใช้ส่วนใหญ่คาดหวังว่าการคลิกที่ modal จะนำเนื้อหา "ด้านล่าง" ไปยังส่วน "ด้านหน้า"
เทรเวอร์

32
@Trevor ที่ชอบตรงข้ามของคำกริยา
Rawling

11
จะทำอย่างไรหากมีหน้าเว็บที่พื้นหลังที่สามารถเปิดใช้งานเฉพาะในกรณีที่ผู้ใช้เข้าสู่ระบบก่อน โดยการคลิกที่ปุ่มตกลง Modal ผู้ใช้จะถูกนำไปที่หน้าเข้าสู่ระบบ หากผู้ใช้สามารถคลิกออกได้หมายความว่าผู้ใช้ข้ามหน้าล็อกอินและเพียงเข้าสู่หน้าเว็บโดยไม่ต้องลงชื่อเข้าใช้ All Hell Break Loose
jumper rbk

5
@ เทรเวอร์ฉันไม่เห็นหลักฐานใด ๆ เลยที่สนับสนุนข้อเรียกร้องของคุณ
1252748

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

คำตอบ:


692

ผมเชื่อว่าคุณต้องการที่จะตั้งค่าฉากหลังจะคงที่ หากคุณต้องการหลีกเลี่ยงการปิดหน้าต่างเมื่อใช้Escกุญแจคุณจะต้องตั้งค่าอื่น

ตัวอย่าง:

<a data-controls-modal="your_div_id"
   data-backdrop="static"
   data-keyboard="false"
   href="#">

หรือถ้าคุณใช้ JavaScript:

$('#myModal').modal({
  backdrop: 'static',
  keyboard: false
});

7
@ user1296175 รหัสสุดท้ายของคุณคืออะไร ฉันต้องการทำเช่นเดียวกัน
AlphaMale

4
ขอบคุณ @nobita เพิ่ม data-backdrop = "static" ทำเคล็ดลับ! เอกสารบูตของ Twitter ไม่ดี :(
บลูสมิ ธ

2
ตรวจสอบคำตอบจาก @@ Varun Chatterji และรวมสิ่งนี้ไว้ในคำนิยามคำกริยาของคุณ
Leandro

1
ปิดการใช้งานการคลิกด้านนอกสำหรับโมดัลทั้งหมดที่มีบรรทัดเดียวของ js: $ .fn.modal.Constructor.DEFAULTS.backdrop = 'static';
Lukas Liesis

1
สำหรับผู้ใช้เชิงมุม: var modalInstance = $ modal.open ({templateUrl: 'modalTemplate.html', คอนโทรลเลอร์: 'modalController', ฉากหลัง: 'คงที่',});
Alexandr

310

เพียงแค่ตั้งค่าคุณสมบัติการbackdrop'static'

$('#myModal').modal({
  backdrop: 'static',
  keyboard: true
})

คุณอาจต้องการตั้งค่าkeyboardคุณสมบัติเป็นfalseเพราะจะช่วยป้องกันไม่ให้ถูกปิดโดยกดปุ่มEscบนแป้นพิมพ์

$('#myModal').modal({
  backdrop: 'static',
  keyboard: false
})

myModal คือ ID ของ div ที่มีเนื้อหาเป็นกิริยาช่วยของคุณ


6
ใช่นี่คือคำตอบที่สะอาดและง่ายที่สุด (เพราะจะหลีกเลี่ยงการเพิ่มแอตทริบิวต์ข้อมูล) สำหรับการอ้างอิงbackdropและkeyboardมีการกล่าวถึงที่นี่ในเอกสารประกอบภายใต้หัวข้อตัวเลือก
Jesse Dupuy

คุณลักษณะของข้อมูลเป็นสิ่งที่ต้องหลีกเลี่ยงหรือไม่? กรุณาให้คำแนะนำเกี่ยวกับเรื่องนี้

@GopalAggarwal: ขึ้นอยู่กับวิธีการตั้งค่ากิริยา หากคุณเชื่อมโยงคำกริยากับแท็กจุดยึดหลายรายการการใช้แอตทริบิวต์ data อาจสมเหตุสมผล แต่เมื่อมีเพียงหนึ่ง modal ต่อแท็กฉันจะไปกับพารามิเตอร์สคริปต์ที่ทุกพฤติกรรมสามารถมองเห็นได้ในที่เดียว
Nirmal

7
นอกจากนี้เพื่อหลีกเลี่ยงการแสดงกิริยาทันทีผ่านการแสดง: เท็จ
ClearCloud8

214

นอกจากนี้คุณยังสามารถรวมแอตทริบิวต์เหล่านี้ในการกำหนดคำกริยาเอง

<div class="modal hide fade" data-keyboard="false" data-backdrop="static">

4
ใช่นี่คือคำตอบที่สะอาดและง่ายที่สุด (เนื่องจากทำงานได้โดยการเพิ่มแอตทริบิวต์ข้อมูล) สำหรับการอ้างอิงฉากหลังและแป้นพิมพ์มีการกล่าวถึงที่นี่ในเอกสารประกอบภายใต้หัวข้อตัวเลือก
floww

หากคุณเปิดตัวเป็นกิริยาช่วยในการโหลดหน้านี้เป็นวิธีที่ดีที่สุดในการลบตัวเลือกการปิดอื่น ๆ
ซานต้า

46

หากคุณได้เริ่มต้นหน้าต่างโมดัลแล้วคุณอาจต้องการรีเซ็ตตัวเลือกด้วย$('#myModal').removeData("modal").modal({backdrop: 'static', keyboard: false})เพื่อให้แน่ใจว่าจะใช้ตัวเลือกใหม่


1
สิ่งนี้ช่วยฉันออก หลังจากตั้งค่า "Backdrop: 'static'" ผู้ใช้ยังคงสามารถปิด modal ได้ด้วยคลิกเดียว ดูเหมือนว่าจะเป็นข้อผิดพลาด แต่นี่เป็นการหลอกลวง!
โอมาร์

7
สำหรับตอนนี้: $ ('# modal'). removeData ('bs.modal'). modal ({ฉากหลัง: 'คงที่', แป้นพิมพ์: false});
D3VELOPER

34

แทนที่เหตุการณ์ 'ซ่อน' Bootstrap ของกล่องโต้ตอบและหยุดพฤติกรรมเริ่มต้น (เพื่อกำจัดกล่องโต้ตอบ)

โปรดดูข้อมูลโค้ดด้านล่าง:

   $('#yourDialogID').on('hide.bs.modal', function(e) {

       e.preventDefault();
   });

มันทำงานได้ดีในกรณีของเรา


2
ถ้าเช่นนั้นจะเปลี่ยนกลับอย่างไร
sertaconay

3
เพียงแค่สง่างาม ขอบคุณ :) และ @sertaconay เพียงแค่สร้างตัวแปรบูลีน (ตัวอย่าง) ซึ่งจะถูกตรวจสอบเพื่อตัดสินใจว่าคุณต้องการที่จะป้องกันการเริ่มต้น
นิมโร Yonatan Ben-Nes

1
ตัวเลือกเฉพาะที่นี่ที่ทำงานหลังจากที่เป็นกิริยาช่วย opend
Ask_io

2
นี่เป็นโซลูชั่นที่สมบูรณ์แบบหากคุณต้องการควบคุมได้ดีขึ้นเมื่อปิดการใช้งานและเมื่อไม่ใช้งาน
คิวรอส

33

ใช่คุณสามารถทำสิ่งนี้ได้:

<div id="myModal"  tabindex="-1" role="dialog"
     aria-labelledby="myModalLabel"
     aria-hidden="true"
     data-backdrop="static"  data-keyboard="false">

นี่เหมาะสำหรับกรณีที่มีการประกาศคำกริยาใน html และเปิดเฉพาะผ่าน javascript - นั่นคือไม่มีลิงก์ไปยัง ขอบคุณ!
hgolov

22

ชนิดของคำตอบที่ชอบ @ AymKdn แต่สิ่งนี้จะช่วยให้คุณสามารถเปลี่ยนตัวเลือกได้โดยไม่ต้องเริ่มต้น modal อีกครั้ง

$('#myModal').data('modal').options.keyboard = false;

หรือถ้าคุณต้องทำหลาย ๆ ตัวเลือก JavaScript withมีประโยชน์ที่นี่!

with ($('#myModal').data("modal").options) {
    backdrop = 'static';
    keyboard = false;
}

หากโมดัลเปิดอยู่แล้วตัวเลือกเหล่านี้จะมีผลเฉพาะในครั้งต่อไปที่โมดัลเปิด


stackoverflow.com/questions/16030448/…แต่ฉันไม่ชอบวิธีการแก้ปัญหานี้แม้ว่า
Victor

14

เพียงเพิ่มสองสิ่งนี้

data-backdrop="static" 
data-keyboard="false"

มันจะมีลักษณะเช่นนี้ในขณะนี้

<div class="modal fade bs-example-modal-sm" id="myModal" data-backdrop="static" data-keyboard="false" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">

มันจะปิดการใช้งานปุ่มหลบหนีและคลิกที่ใดก็ได้และซ่อน


คำแนะนำนี้ให้ไว้เมื่อหลายปีก่อน
mickmackusa

11

คุณสามารถปิดการทำงานแบบคลิกเพื่อปิดของพื้นหลังและทำให้ค่านี้เป็นค่าเริ่มต้นสำหรับ modal ทั้งหมดของคุณโดยการเพิ่ม JavaScript นี้ในหน้าของคุณ (ตรวจสอบให้แน่ใจว่ามันถูกเรียกใช้หลังจากโหลด jQuery และ Bootstrap JS):

$(function() {
    $.fn.modal.Constructor.DEFAULTS.backdrop = 'static';
});

6

ดังที่ D3VELOPER พูดว่ารหัสต่อไปนี้สามารถแก้ไขได้:

$('#modal').removeData('bs.modal').modal({backdrop: 'static', keyboard: false});

ฉันใช้ jquery & bootstrap แล้วก็ใช้removeData('modal')ไม่ได้


4

สิ่งที่ดีที่สุดที่ฉันพบคือเพิ่มรหัสนี้ในลิงค์

<!-- Link -->
<a href="#mdl" role="button"  data-backdrop="static" data-keyboard="false" data-toggle="modal" id_team="" ></a>
<-- Div -->
<div id="mdl" class="modal hide fade" tabindex="-1" role="dialog" data-keyboard="false" data-backdrop="static"></div>

2

ในกรณีที่มีใครบางคนมาที่นี่จาก Google พยายามหาวิธีที่จะป้องกันไม่ให้ใครบางคนปิดการเป็นกิริยาช่วยอย่าลืมว่ายังมีปุ่มปิดที่ด้านบนขวาของคำกริยาที่ต้องลบออก

ฉันใช้ CSS เพื่อซ่อน:

#Modal .modal-header button.close {
    visibility: hidden;
}

โปรดทราบว่าการใช้ "display: none;" ถูกเขียนทับเมื่อสร้างโมดัลดังนั้นอย่าใช้สิ่งนั้น


คุณไม่สามารถเพิ่งลบปุ่มออกจาก modal-header ได้หรือไม่?
foop

บางครั้งมันมีประโยชน์ในการใช้ CSS แทนการแก้ไข HTML
ดึง

2

หากคุณต้องการปิดใช้งานbackdrop click closingคุณสมบัติตามเงื่อนไข คุณสามารถใช้บรรทัดต่อไปนี้เพื่อตั้งค่าbackdropตัวเลือกเป็นstaticในระหว่างรันไทม์

Bootstrap v3.xx

jQuery('#MyModal').data('bs.modal').options.backdrop = 'static';

Bootstrap v2.xx

jQuery('#MyModal').data('modal').options.backdrop = 'static';

สิ่งนี้จะป้องกันโมเดลที่สร้างอินสแตนซ์แล้วโดยbackdropตั้งค่าตัวเลือกเป็นfalse( พฤติกรรมเริ่มต้น ) จากการปิด


2

คุณสามารถตั้งค่าการทำงานเริ่มต้นของป๊อปอัป modal โดยใช้บรรทัดด้านล่างของรหัส:

 $.fn.modal.prototype.constructor.Constructor.DEFAULTS.backdrop = 'static';

เช่น +1 วิธีนี้ฉันไม่ต้องการตัวเลือกนั้นสำหรับ modals ทั้งหมด
tsohr

2

การทำเช่นนั้นง่ายมากในปัจจุบัน เพียงเพิ่ม:

data-backdrop="static" data-keyboard="false" 

ในตัวแบ่งโมดอลของคุณ


คำแนะนำนี้มีให้เมื่อหลายปีก่อนในหน้าเดียวกันนี้
mickmackusa

1

นี่เป็นอีกทางเลือกหนึ่งที่พวกคุณบางคนอาจมองหา

ปัญหาของฉันคล้ายกันกล่อง modal กำลังปิดในขณะที่ iframe ที่ฉันมีอยู่กำลังโหลดดังนั้นฉันต้องปิดการใช้งานการเลิกใช้ modal จนกว่า Iframe จะโหลดเสร็จแล้วจึงเปิดใช้งานอีกครั้ง

โซลูชันที่นำเสนอที่นี่ไม่ทำงาน 100%

วิธีแก้ปัญหาของฉันคือ:

showLocationModal = function(loc){

    var is_loading = true;

    if(is_loading === true) {

        is_loading  = false;
        var $modal   = $('#locationModal');

        $modal.modal({show:true});

        // prevent Modal to close before the iframe is loaded
        $modal.on("hide", function (e) {
            if(is_loading !== true) {
                e.preventDefault();
                return false
            }
        });

        // populate Modal
        $modal.find('.modal-body iframe').hide().attr('src', location.link).load(function(){

            is_loading = true;
     });
}};

ดังนั้นฉันจึงป้องกันไม่ให้ Modal ปิดด้วย:

$modal.on("hide", function (e) {
    if(is_loading !== true) {
        e.preventDefault();
        return false
    }
});

แต่ด้วย is_loading var ที่จะเปิดใช้งานการปิดอีกครั้งหลังจากโหลด Iframe แล้ว


1
<button type="button" class="btn btn-info btn-md" id="myBtn3">Static 
Modal</button>

<!-- Modal -->
<div class="modal fade" id="myModal3" role="dialog">
<div class="modal-dialog">
  <!-- Modal content-->
  <div class="modal-content">
    <div class="modal-header">
      <button type="button" class="close" data-dismiss="modal">×</button>
      <h4 class="modal-title">Static Backdrop</h4>
    </div>
    <div class="modal-body">
      <p>You cannot click outside of this modal to close it.</p>
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-default" data-
      dismiss="modal">Close</button>
    </div>
   </div>
  </div>
</div>
   <script>
    $("#myBtn3").click(function(){
     $("#myModal3").modal({backdrop: "static"});
    });
   });
  </script>

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