ข้อความแจ้งเตือน Twitter Bootstrap ปิดแล้วเปิดอีกครั้ง


103

ฉันมีปัญหากับข้อความแจ้งเตือน มันแสดงขึ้นตามปกติและฉันสามารถปิดได้เมื่อผู้ใช้กดx(ปิด) แต่เมื่อผู้ใช้พยายามที่จะแสดงอีกครั้ง (เช่นคลิกที่เหตุการณ์ปุ่ม) มันจะไม่แสดง (ยิ่งไปกว่านั้นถ้าฉันพิมพ์ข้อความแจ้งเตือนนี้ไปที่คอนโซลมันจะเท่ากับ[]) รหัสของฉันอยู่ที่นี่:

 <div class="alert" style="display: none">
   <a class="close" data-dismiss="alert">×</a>
   <strong>Warning!</strong> Best check yo self, you're not looking too good.
 </div>

และเหตุการณ์:

 $(".alert").show();

ปล! ฉันต้องการแสดงข้อความแจ้งเตือนหลังจากเหตุการณ์บางอย่างเกิดขึ้นเท่านั้น (เช่นคลิกปุ่ม) หรือว่าฉันทำอะไรผิด?

คำตอบ:


180

การปิดข้อมูลจะลบองค์ประกอบอย่างสมบูรณ์ ใช้วิธี. hide () ของ jQuery แทน

วิธีแก้ไขด่วน:

ใช้ inline javascript เพื่อซ่อนองค์ประกอบ onclick ดังนี้:

<div class="alert" style="display: none"> 
    <a class="close" onclick="$('.alert').hide()">×</a>  
    <strong>Warning!</strong> Best check yo self, you're not looking too good.  
</div>

<a href="#" onclick="$('alert').show()">show</a>

http://jsfiddle.net/cQNFL/

อย่างไรก็ตามควรใช้เฉพาะในกรณีที่คุณขี้เกียจ (ซึ่งไม่ใช่เรื่องดีหากคุณต้องการแอปที่ดูแลรักษาได้)

วิธีการทำอย่างถูกต้อง:

สร้างแอตทริบิวต์ข้อมูลใหม่สำหรับซ่อนองค์ประกอบ

Javascript:

$(function(){
    $("[data-hide]").on("click", function(){
        $("." + $(this).attr("data-hide")).hide()
        // -or-, see below
        // $(this).closest("." + $(this).attr("data-hide")).hide()
    })
})

จากนั้นเปลี่ยนการปิดข้อมูลเป็นการซ่อนข้อมูลในมาร์กอัป ตัวอย่างที่ jsfiddle

$("." + $(this).attr("data-hide")).hide()

สิ่งนี้จะซ่อนองค์ประกอบทั้งหมดที่มีคลาสที่ระบุไว้ใน data-hide กล่าวคือdata-hide="alert"จะซ่อนองค์ประกอบทั้งหมดด้วยคลาสการแจ้งเตือน

Xeon06ให้ทางเลือกอื่น:

$(this).closest("." + $(this).attr("data-hide")).hide()

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

คำจำกัดความของ. closest จากjquery doc :

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


4
เฮ้! เกี่ยวกับคำตอบที่ถูกต้องของคุณ สิ่งนี้จะซ่อนทุกองค์ประกอบที่มีคลาสเดียวกัน (กล่าวคือalert) ในหน้า วิธีแก้ปัญหาคือการแทนที่เนื้อหาของการโทรกลับด้วยบรรทัดนี้$(this).closest("." + $(this).attr("data-hide")).hide();ซึ่งจะส่งผลต่อองค์ประกอบหลักที่ใกล้เคียงที่สุดเท่านั้นเนื่องจากโดยทั่วไปปุ่มปิดจะอยู่ในการแจ้งเตือนที่มีผล
Alex Turpin

1
อันที่จริงฉันไม่ได้คิดจะทำให้มันเป็นไปอย่างนั้น อย่างไรก็ตามนั่นจะลบความเรียบง่ายของโซลูชันนี้ออกไปเล็กน้อย ฉันจะเพิ่มเป็นความคิดเห็นในโค้ดที่มีอยู่ ขอบคุณ!
Henrik Karlsson

1
ใหม่สำหรับสิ่งนี้ .. คุณจะกำหนด '$ (function () {.. ' ได้
ที่ไหน

1
ทุกที่ในไฟล์ JavaScript หรือในแท็ก <script> ที่นี่ </script>
Henrik Karlsson

1
ถ้าคุณจะใช้ $ (document) .on ('click', '[data-hide]', function () {/ * * /}) คำตอบของคุณจะสมบูรณ์แบบ;)
shock_gone_wild

26

ฉันเพิ่งใช้ตัวแปร model เพื่อแสดง / ซ่อนกล่องโต้ตอบและลบไฟล์ data-dismiss="alert"

ตัวอย่าง:

<div data-ng-show="vm.result == 'error'" class="alert alert-danger alert-dismissable">
    <button type="button" class="close" data-ng-click="vm.result = null" aria-hidden="true">&times;</button>
    <strong>Error  !  </strong>{{vm.exception}}
</div>

ได้ผลสำหรับฉันและหยุดความต้องการที่จะออกไปที่ jquery


1
วิธีแก้ปัญหาที่ง่าย / ดีกว่าคำตอบที่ได้รับการโหวตสูงมาก!
Abs

ทางออกที่ดีกว่ามากในความคิดของฉัน
devqon

ฉันชอบความคิดของคุณ
Kumaresan Perumal

15

ฉันคิดว่าแนวทางที่ดีในการแก้ปัญหานี้คือการใช้ประโยชน์จากclose.bs.alertประเภทเหตุการณ์ของ Bootstrap เพื่อซ่อนการแจ้งเตือนแทนที่จะลบออก สาเหตุที่ Bootstrap เปิดเผยเหตุการณ์ประเภทนี้เพื่อให้คุณสามารถเขียนทับพฤติกรรมเริ่มต้นของการลบการแจ้งเตือนออกจาก DOM

$('.alert').on('close.bs.alert', function (e) {
    e.preventDefault();
    $(this).addClass('hidden');
});

5

หากคุณใช้ไลบรารี MVVM เช่น knockout.js (ซึ่งฉันขอแนะนำเป็นอย่างยิ่ง) คุณสามารถทำได้อย่างหมดจดมากขึ้น:

<div class="alert alert-info alert-dismissible" data-bind="visible:showAlert">
   <button type="button" class="close" data-bind="click:function(){showAlert(false);}>
        <span aria-hidden="true">&times;</span>
        <span class="sr-only">Close</span>
   </button>
   Warning! Better check yourself, you're not looking too good.
</div>

http://jsfiddle.net/bce9gsav/5/


data-bind="click:function(){showAlert(false);}เป็นตัวอย่างที่สมบูรณ์แบบของเสือกจาวาสคริปต์ซึ่งอยู่ไกลจากการทำความสะอาด ฉันไม่แนะนำอย่างยิ่งให้ทำตามแนวทางนี้
ลีโอ

@ ลีโอเสือกด้วยวิธีไหน?
Ohad Schneider

ขัดขวางในทุก ๆ ทาง คุณกำลัง "ฝัง" พฤติกรรมในโครงสร้าง html / มาร์กอัปของคุณ ลองนึกภาพว่าคุณต้องเปลี่ยนพฤติกรรมนั้น ... คุณจะต้องเปลี่ยนกี่หน้าและองค์ประกอบ html? อย่าเข้าใจฉันผิดมันยังคงตอบคำถามที่ถามและนั่นคือเหตุผลที่ฉันจะไม่ลงคะแนน แต่นี่ยังห่างไกลจากวิธีแก้ปัญหาที่ "สะอาดกว่า"
ลีโอ

ไม่มีสิ่งที่ฉันจริงว่าคือการแยกการใช้งานของความกังวล มุมมองของคุณ (html) ไม่ควรมี javascript ใด ๆ ผลกระทบเชิงลบอาจมีมากในทีมนักพัฒนา นี่คือคำถามที่ดี (และคำตอบ) เกี่ยวกับสิ่งที่น่าพิศวงและค่อนข้างขัดแย้งdata-bindแอตทริบิวต์stackoverflow.com/questions/13451414/unobtrusive-knockout
สิงห์

คุณคิดว่า "JavaScript" คืออะไร? จะเกิดอะไรขึ้นถ้ามีเพียงชื่อของวิธีการที่จะเรียกใช้? มันเป็นความจริงที่เรียกมันด้วยพารามิเตอร์ (เท็จ) ที่ทำให้มันดูน่ารำคาญในสายตาของคุณหรือไม่?
Ohad Schneider

2

ดังนั้นหากคุณต้องการโซลูชันที่สามารถรับมือกับเพจ html แบบไดนามิกดังที่คุณได้รวมไว้แล้วคุณควรใช้ jQuery's live เพื่อตั้งค่าตัวจัดการกับองค์ประกอบทั้งหมดที่มีอยู่ในขณะนี้และในอนาคตในโดมหรือถูกลบออก

ฉันใช้

$(document).on("click", "[data-hide-closest]", function(e) {
  e.preventDefault();
  var $this = $(this);
  $this.closest($this.attr("data-hide-closest")).hide();
});
.alert-success {
    background-color: #dff0d8;
    border-color: #d6e9c6;
    color: #3c763d;
}
.alert {
    border: 1px solid transparent;
    border-radius: 4px;
    margin-bottom: 20px;
    padding: 15px;
}
.close {
    color: #000;
    float: right;
    font-size: 21px;
    font-weight: bold;
    line-height: 1;
    opacity: 0.2;
    text-shadow: 0 1px 0 #fff;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="alert alert-success">
  <a class="close" data-hide-closest=".alert">×</a>
  <strong>Success!</strong> Your entries were saved.
</div>



1

ฉันพบปัญหานี้เช่นกันและปัญหาในการแฮ็กปุ่มปิดก็คือฉันยังต้องการเข้าถึงเหตุการณ์การแจ้งเตือนการปิด bootstrap มาตรฐาน

วิธีแก้ปัญหาของฉันคือการเขียนปลั๊กอิน jquery ขนาดเล็กที่ปรับแต่งได้ซึ่งจะฉีดการแจ้งเตือน Bootstrap 3 ที่สร้างขึ้นอย่างถูกต้อง (มีหรือไม่มีปุ่มปิดตามที่คุณต้องการ) โดยไม่ยุ่งยากและช่วยให้คุณสร้างใหม่ได้อย่างง่ายดายหลังจากปิดกล่อง

ดูhttps://github.com/davesag/jquery-bs3Alertสำหรับการใช้งานการทดสอบและตัวอย่าง


1

ฉันเห็นด้วยกับคำตอบที่โพสต์โดย Henrik Karlsson และแก้ไขโดย Martin Prikryl ฉันมีคำแนะนำหนึ่งข้อโดยพิจารณาจากการช่วยสำหรับการเข้าถึง ฉันจะเพิ่ม. attr ("aria-hidden", "true") ต่อท้ายเพื่อให้ดูเหมือนว่า:

$(this).closest("." + $(this).attr("data-hide")).attr("aria-hidden", "true");

2
จำเป็นจริงหรือ? jQuerys .hide ฟังก์ชั่นตั้งค่าการแสดงผล: ไม่มีโปรแกรมอ่านหน้าจอไม่ควรฉลาดพอที่จะจำได้ว่าซ่อนอยู่หรือไม่?
Henrik Karlsson

1

โซลูชันข้างต้นทั้งหมดใช้ไลบรารีภายนอกทั้งเชิงมุมหรือ jQuery และ Bootstrap เวอร์ชันเก่า ดังนั้นนี่คือทางออกที่ชาร์ลส์ Wyke สมิ ธ ในJavaScript บริสุทธิ์นำไปใช้กับเงินทุน 4 ใช่ Bootstrap ต้องการ jQuery สำหรับโมดอลและโค้ดการแจ้งเตือนของตัวเอง แต่ไม่ใช่ทุกคนที่จะเขียนโค้ดของตนเองด้วย jQuery อีกต่อไป

นี่คือ html ของการแจ้งเตือน:

<div id="myAlert" style="display: none;" 
    class="alert alert-success alert-dismissible fade show">
    <button type="button" class="close" data-hide="alert">&times;</button>
    <strong>Success!</strong> You did it!
</div>

โปรดทราบว่าการแจ้งเตือนครั้งแรกจะถูกซ่อน ( style="display: none;") และแทนของมาตรฐานที่เราได้ใช้ที่นี่data-dismiss="alert"data-hide="alert"

นี่คือ JavaScript เพื่อแสดงการแจ้งเตือนและแทนที่ปุ่มปิด:

var myAlert = document.getElementById('myAlert');
// Show the alert box
myAlert.style.display = 'block';
// Override Bootstrap's standard close action
myAlert.querySelector('button[data-hide]').addEventListener('click', function() {
    myAlert.style.display = 'none';
});

หากคุณต้องการซ่อนหรือแสดงการแจ้งเตือนทางโปรแกรมอื่น ๆ ในรหัสเพียงทำ หรือmyAlert.style.display = 'none';myAlert.style.display = 'block';


0

ปัญหาเกิดจากการใช้style="display:none"คุณควรซ่อนการแจ้งเตือนด้วย Javascript หรืออย่างน้อยที่สุดเมื่อแสดงให้ลบแอตทริบิวต์ style


2
ไม่จริงปัญหาคือการลบข้อมูลลบองค์ประกอบ
Henrik Karlsson

0

จากคำตอบอื่น ๆ และการเปลี่ยนการปิดข้อมูลเป็นการซ่อนข้อมูลตัวอย่างนี้จะจัดการกับการเปิดการแจ้งเตือนจากลิงก์และอนุญาตให้เปิดและปิดการแจ้งเตือนซ้ำ ๆ

$('a.show_alert').click(function() {
    var $theAlert = $('.my_alert'); /* class on the alert */
    $theAlert.css('display','block');
   // set up the close event when the alert opens
   $theAlert.find('a[data-hide]').click(function() {
     $(this).parent().hide(); /* hide the alert */
   });
});

0

ฉันได้ลองทุกวิธีแล้ววิธีที่ดีที่สุดสำหรับฉันคือการใช้คลาส bootstrap ในตัว .fadeและ.in

ตัวอย่าง:

<div class="alert alert-danger fade <?php echo ($show) ? 'in' : '' ?>" role="alert">...</div>

หมายเหตุ: ใน jQuery ให้ addClass ('in') เพื่อแสดงการแจ้งเตือน removeClass ('in') เพื่อซ่อน

ข้อเท็จจริงที่น่าสนใจ: ใช้ได้กับทุกองค์ประกอบ ไม่ใช่แค่การแจ้งเตือน


0

นี่คือวิธีแก้ปัญหาตามคำตอบของHenrik Karlssonแต่มีการกระตุ้นเหตุการณ์ที่เหมาะสม(ขึ้นอยู่กับแหล่งที่มาของ Bootstrap ):

$(function(){
    $('[data-hide]').on('click', function ___alert_hide(e) {
        var $this = $(this)
        var selector = $this.attr('data-target')
        if (!selector) {
            selector = $this.attr('href')
            selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
        }

        var $parent = $(selector === '#' ? [] : selector)

        if (!$parent.length) {
            $parent = $this.closest('.alert')
        }

        $parent.trigger(e = $.Event('close.bs.alert'))

        if (e.isDefaultPrevented()) return

        $parent.hide()

        $parent.trigger($.Event('closed.bs.alert'))
    })
});

คำตอบส่วนใหญ่สำหรับฉันเป็นหมายเหตุ


0

ไม่สามารถทำได้ง่ายๆโดยการเพิ่ม div "container" เพิ่มเติมและเพิ่ม div การแจ้งเตือนที่ถูกลบกลับเข้าไปในแต่ละครั้ง ดูเหมือนว่าจะทำงานให้ฉัน?

HTML

<div id="alert_container"></div>

JS

 $("#alert_container").html('<div id="alert"></div>');          
 $("#alert").addClass("alert alert-info  alert-dismissible");
 $("#alert").html('<a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a><strong>Info!</strong>message');
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.