Twitter bootstrap phương thức từ xa hiển thị cùng một nội dung mỗi lần


263

Tôi đang sử dụng Twitter bootstrap, tôi đã chỉ định một phương thức

<div class="modal hide" id="modal-item">

    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal">x</button>
        <h3>Update Item</h3>
    </div>

    <form action="http://www.website.com/update" method="POST" class="form-horizontal">

    <div class="modal-body">
        Loading content...
    </div>

    <div class="modal-footer">
        <a href="#" class="btn" data-dismiss="modal">Close</a>
        <button class="btn btn-primary" type="submit">Update Item</button>
    </div>

    </form>

</div>

Và các liên kết

<a href="http://www.website.com/item/1" data-target="#modal-item" data-toggle="modal">Edit 1</a>
<a href="http://www.website.com/item/2" data-target="#modal-item" data-toggle="modal">Edit 2</a>
<a href="http://www.website.com/item/3" data-target="#modal-item" data-toggle="modal">Edit 2</a>

Khi tôi nhấp vào bất kỳ liên kết nào trong lần đầu tiên này, tôi thấy nội dung chính xác, nhưng khi tôi nhấp vào các liên kết khác, nó sẽ hiển thị cùng một nội dung được tải lần đầu tiên, nó không cập nhật nội dung.

Tôi muốn nó được cập nhật mỗi lần nhấp.

PS: Tôi có thể dễ dàng làm cho nó hoạt động thông qua chức năng jQuery tùy chỉnh, nhưng tôi muốn biết liệu nó có khả thi với chức năng từ xa phương thức Bootstrap không, vì nó đủ dễ và tôi đoán tôi chỉ đang làm phức tạp mọi thứ.


Sửa tương tự, nhưng được sửa đổi cho Bootstrap 3. Bootstrap 3 giới thiệu các không gian tên. plnkr.co/edit/HWSgSw?p=preview
Jeff H

5
Lưu ý rằng các remoteModals không được dùng nữa kể từ Bootstrap v3.2.1 và sẽ biến mất trong v4.
cvrebert

Câu trả lời:


447

Vấn đề là hai lần.

Đầu tiên , một khi một đối tượng Modal được khởi tạo, nó sẽ liên tục được gắn vào phần tử được chỉ định bởi data-targetvà các lệnh gọi tiếp theo để hiển thị rằng phương thức sẽ chỉ gọi toggle()nó, nhưng sẽ không cập nhật các giá trị trong options. Vì vậy, mặc dù các hrefthuộc tính khác nhau trên các liên kết khác nhau của bạn, khi phương thức được bật, giá trị remotekhông được cập nhật. Đối với hầu hết các tùy chọn, người ta có thể khắc phục điều này bằng cách chỉnh sửa trực tiếp đối tượng. Ví dụ:

$('#myModal').data('bs.modal').options.remote = "http://website.com/item/7";

Tuy nhiên, điều đó sẽ không hoạt động trong trường hợp này, bởi vì ...

Thứ hai , plugin Modal được thiết kế để tải tài nguyên từ xa trong hàm tạo của đối tượng Modal, điều này không may có nghĩa là ngay cả khi thay đổi được thực hiện options.remote, nó sẽ không bao giờ được tải lại .

Một biện pháp khắc phục đơn giản là tiêu diệt đối tượng Modal trước khi bật / tắt. Một lựa chọn là chỉ tiêu diệt nó sau khi nó kết thúc ẩn:

$('body').on('hidden.bs.modal', '.modal', function () {
  $(this).removeData('bs.modal');
});

Lưu ý: Điều chỉnh các bộ chọn nếu cần. Đây là khái quát nhất.

Plunker

Hoặc bạn có thể thử đưa ra một sơ đồ phức tạp hơn để làm một cái gì đó như kiểm tra xem liên kết khởi chạy phương thức có khác với kế hoạch trước hay không. Nếu có, phá hủy; nếu không, thì không cần tải lại.


1
@VladimirStarkov Xin lỗi về điều đó - dường như tôi đã quên hidelớp trên phương thức, vì vậy nếu cửa sổ của bạn quá nhỏ, phương thức có thể đã chặn các sự kiện chuột trên các nút. Vì một số lý do, JSFiddle.net thực sự tồi tệ sáng nay (đã có 504 cố gắng cập nhật), vì vậy tôi chỉ làm lại ví dụ trên plnkr.co, điều này tốt hơn cho AJAX.
merv

3
còn một vấn đề khác: cơ thể .modal vẫn sẽ có văn bản trong đó, vì vậy tôi đã thêm: <CODE> $ ('# myModal .modal-body'). text ("Đang tải ...") </ CODE> trong trình lắng nghe sự kiện ẩn
rbp

5
bs.modaltrong $(this).removeData('bs.modal')từng làm việc cho tôi với Bootstrap 3
jvannistelrooy

2
Mã làm việc đầy đủ cho Boostrap 3 là$('body').on('hidden.bs.modal', '.modal', function () { $(this).removeData('bs.modal'); });
Barshe Fondacci

1
Tôi cũng sẽ kiểm tra xem phương thức bị ẩn có được tải từ nguồn từ xa không, để không phá vỡ các phương thức có nội dung tĩnh: var modalData = $(this).data('bs.modal'); if (modalData && modalData.options.remote)...
Wojtek Kruszewski

171

Đối với bootstrap 3 bạn nên sử dụng:

$('body').on('hidden.bs.modal', '.modal', function () {
    $(this).removeData('bs.modal');
});

17
Anh hùng của tôi Yêu những thay đổi không có giấy tờ.
Jorin

2
Điều này đã giúp rất nhiều. Bootstrap 3 không tương thích ngược và hầu hết nội dung trên SO (hoặc các diễn đàn khác) là về BS <3, việc thử các giải pháp đó thực sự lãng phí rất nhiều thời gian.
Swapnil

7
Không hoàn hảo: nó hiển thị ngắn gọn nội dung cũ trước nội dung mới.
Laurent

3
Nếu bạn muốn làm trống phương thức bằng ví dụ trên, bạn có thể thêm dòng sau vào trước hoặc sau remoteDatadòng:$(this).empty()
jgillman

11
Bạn không nên sử dụng $(this).empty(). Các remotetùy chọn tải dữ liệu từ xa vào lồng <div class="modal-content">yếu tố. Sử dụng $('.modal-content', this).empty();thay thế.
Gavin

50

Đối với Bootstrap 3.1, bạn sẽ muốn xóa dữ liệu và làm trống modal-contenttoàn bộ hộp thoại (3.0) để tránh nhấp nháy trong khi chờ tải nội dung từ xa.

$(document).on("hidden.bs.modal", function (e) {
    $(e.target).removeData("bs.modal").find(".modal-content").empty();
});

Nếu bạn đang sử dụng các phương thức không phải từ xa thì dĩ nhiên đoạn mã trên sẽ xóa nội dung của chúng sau khi đóng (xấu). Bạn có thể cần thêm một cái gì đó vào các phương thức đó (như một .local-modallớp) để chúng không bị ảnh hưởng. Sau đó sửa đổi mã trên thành:

$(document).on("hidden.bs.modal", ".modal:not(.local-modal)", function (e) {
    $(e.target).removeData("bs.modal").find(".modal-content").empty();
});

Trên các trang từ xa, đảm bảo bạn không tải các thư viện bootstrap hoặc jquery. Nó sẽ giết bất kỳ tài liệu tham khảo nào và để lại cho bạn một phương thức trống.
Bankzilla

Điều này đã không làm việc cho tôi. Đây là mã của tôi đang hoạt động: $ (tài liệu) .on ("hidden.bs.modal", ".modal", function (e) {if (! $ (E.target) .is (". Local-modal ")) {$ (e.target) .removeData (" bs.modal "). find (". modal-content "). blank ();}});
Kevin

Khi tôi sử dụng, $(e.target).removeData("bs.modal").find(".modal-content").empty();nó giống như phương thức của tôi bằng cách nào đó bị ẩn đi và chỉ có lớp phủ màu xám xuất hiện.
Axel

30

Cảm ơn mẹ. Tôi đã bắt đầu mày mò xung quanh boostrap.js nhưng câu trả lời của bạn là một cách giải quyết nhanh chóng và rõ ràng. Đây là những gì tôi đã sử dụng trong mã của tôi.

$('#modal-item').on('hidden', function() {
    $(this).removeData('modal');
});

21

Câu trả lời được chấp nhận không phù hợp với tôi, vì vậy tôi đã sử dụng JavaScript để thực hiện.

<a href="/foo" class="modal-link">
<a href="/bar" class="modal-link">

<script>
$(function() {
    $(".modal-link").click(function(event) {
        event.preventDefault()
        $('#myModal').removeData("modal")
        $('#myModal').modal({remote: $(this).attr("href")})
    })
})

14

Điều này hoạt động với Bootstrap 3 FYI

$('#myModal').on('hidden.bs.modal', function () {
  $(this).removeData('bs.modal');
});

7

Dự án của tôi được xây dựng trong Yii và sử dụng plugin Bootstrap-Yii, vì vậy câu trả lời này chỉ có liên quan nếu bạn đang sử dụng Yii.

Bản sửa lỗi trên đã hoạt động nhưng chỉ sau lần đầu tiên phương thức được hiển thị. Lần đầu tiên nó đến trống rỗng. Tôi nghĩ đó là bởi vì sau khi tôi bắt đầu mã Yii gọi hàm ẩn của phương thức do đó xóa các biến khởi tạo của tôi.

Tôi thấy rằng việc thực hiện cuộc gọi removeData ngay lập tức trước khi mã khởi chạy phương thức đã thực hiện thủ thuật. Vì vậy, mã của tôi được cấu trúc như thế này ...

$ ("#myModal").removeData ('modal');
$ ('#myModal').modal ({remote : 'path_to_remote'});

5

Trong Bootstrap 3.2.0, sự kiện "bật" phải có trên tài liệu và bạn phải làm trống phương thức:

$(document).on("hidden.bs.modal", function (e) {
    $(e.target).removeData("bs.modal").find(".modal-content").empty();
});

Trong Bootstrap 3.1.0, sự kiện "bật" có thể nằm trên thân máy:

$('body').on('hidden.bs.modal', '.modal', function () {
    $(this).removeData('bs.modal');
});

Giải pháp 3.2 là điều duy nhất phù hợp với tôi trong Bootstrap 3.1 - sử dụng phương pháp tiếp cận cơ thể, một số sự kiện của tôi về phương thức trở nên không được chú ý.
StuartQ

3

Tại sao không làm cho nó chung chung hơn với BS 3? Chỉ cần sử dụng "[cái gì đó] phương thức" làm ID của DIV phương thức.

$("div[id$='modal']").on('hidden.bs.modal',
    function () {
        $(this).removeData('bs.modal');
    }
);

2

Chỉ có lựa chọn làm việc cho tôi là:

$('body').on('hidden.bs.modal', '#modalBox', function () {
    $(this).remove();
});

Tôi sử dụng Bootstrap 3 và tôi có một chức năng gọi là popup('popup content') nối thêm hộp modal html.


2
đây là điều duy nhất phù hợp với tôi với BS 3.3.6. cũng sử dụng mẫu tay lái. Tôi đề nghị sử dụng tài liệu thay vì cơ thể tuy nhiên.
dbinott

1

Thêm $ (này) .html (''); để xóa dữ liệu hiển thị là tốt, và nó hoạt động khá tốt


1

Nếu một URL từ xa được cung cấp, nội dung sẽ được tải một lần thông qua phương thức tải của jQuery và được đưa vào div .modal-content. Nếu bạn đang sử dụng api dữ liệu, bạn có thể sử dụng thuộc tính href để chỉ định nguồn từ xa. Một ví dụ về điều này được hiển thị dưới đây

$.ajaxSetup ({
    // Disable caching of AJAX responses
    cache: false
});

1

Tôi đã thêm một cái gì đó như thế này, bởi vì nội dung cũ hơn được hiển thị cho đến khi nội dung mới xuất hiện, với .html ('') bên trong .modal-content sẽ xóa HTML bên trong, hy vọng nó sẽ giúp

$('#myModal').on('hidden.bs.modal', function () {
   $('#myModal').removeData('bs.modal');
   $('#myModal').find('.modal-content').html('');
});

Đây là câu trả lời đơn giản nhất mà tôi đã tìm thấy. Không có gì phức tạp về câu trả lời, vài dòng mã và dễ hiểu. Làm việc hoàn hảo lần đầu tiên với sự lộn xộn với nó.
Tarquin

0

Tôi đã viết một đoạn mã đơn giản xử lý việc làm mới phương thức. Về cơ bản, nó lưu trữ liên kết được nhấp trong dữ liệu của phương thức và kiểm tra xem đó có phải là liên kết đã được nhấp, xóa hay không dữ liệu phương thức.

var handleModal = function()
{
    $('.triggeringLink').click(function(event) {
        var $logsModal = $('#logsModal');
        var $triggeringLink = $logsModal.data('triggeringLink');

        event.preventDefault();

        if ($logsModal.data('modal') != undefined
            && $triggeringLink != undefined
            && !$triggeringLink.is($(this))
        ) {
            $logsModal.removeData('modal');
        }

        $logsModal.data('triggeringLink', $(this));

        $logsModal.modal({ remote: $(this).attr('href') });
        $logsModal.modal('show');
    });
};

0

Đối với Bootstrap 3, trong modal.js tôi đã thay đổi:

$(document)
  .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })
  .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open'); })

đến

$(document)
  .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })
  .on('hidden.bs.modal', '.modal', function () { 
    $(this).removeData('bs.modal').empty()
    $(document.body).removeClass('modal-open')
  })

(thêm khoảng cách thêm cho rõ ràng)

Điều này ngăn chặn mọi flash không mong muốn của nội dung phương thức cũ bằng cách gọi khoảng trống () trên bộ chứa phương thức cũng như xóa dữ liệu.


0
        $('#myModal').on('hidden.bs.modal', function () {
            $(this).removeData('modal');
        });

Cái này làm việc cho tôi


0

Cách tiếp cận khác này hoạt động tốt cho tôi:

$("#myModal").on("show.bs.modal", function(e) {
    var link = $(e.relatedTarget);
    $(this).find(".modal-body").load(link.attr("href"));
});

0
$('body').on('hidden.bs.modal', '.modal', function () {
       $("#mention Id here what you showed inside modal body").empty()
});

Phần tử html nào bạn muốn để trống như (div, span bất cứ điều gì).


0

Cái này hoạt động với tôi:

phương thức

<div class="modal fade" id="searchKaryawan" tabindex="-1" role="dialog" aria-labelledby="SearchKaryawanLabel" aria-hidden="true"> <div class="modal-dialog">
<div class="modal-content">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
    <h4 class="modal-title" id="SearchKaryawanLabel">Cari Karyawan</h4>
  </div>
  <div class="modal-body">
    <input type="hidden" name="location">
    <input name="cariNama" type="text" class="form-control" onkeyup="if (this.value.length > 3) cariNikNama();" />
    <div class="links-area" id="links-area"></div>
  </div>
  <div class="modal-footer">
  </div>
</div> </div></div>

kịch bản

<script type="text/javascript">$('body').on('hidden.bs.modal', '.modal', function () {  $(".links-area").empty() }); </script>

khu vực liên kết là khu vực tôi đặt dữ liệu và cần xóa


0

Phiên bản mở rộng của câu trả lời được chấp nhận bởi @merv. Nó cũng kiểm tra xem phương thức bị ẩn có được tải từ nguồn từ xa không và xóa nội dung cũ để ngăn không cho nó nhấp nháy.

$(document).on('hidden.bs.modal', '.modal', function () {
  var modalData = $(this).data('bs.modal');

  // Destroy modal if has remote source – don't want to destroy modals with static content.
  if (modalData && modalData.options.remote) {
    // Destroy component. Next time new component is created and loads fresh content
    $(this).removeData('bs.modal');
    // Also clear loaded content, otherwise it would flash before new one is loaded.
    $(this).find(".modal-content").empty();
  }
});

https://gist.github.com/WojtekKruszewski/ae86d7fb59879715ae1e6dd623f743c5


-1

Đã thử nghiệm trên phiên bản Bootstrap 3.3.2

  $('#myModal').on('hide.bs.modal', function() {
    $(this).removeData();
  });

1
Đây là một giải pháp khủng khiếp. Gọi .removeData()không có tham số sẽ báo cho jquery xóa tất cả dữ liệu được đính kèm với phần tử đó. Theo như vấn đề của OP có liên quan, .removeData('bs.modal')hoặc .removeData('modal')sẽ đủ và rất an toàn.
Julian Paolo Dayag

-4

Chúc may mắn với điều này:

$('#myModal').on('hidden.bs.modal', function () {
    location.reload();
});

2
cái này là vô dụng tải lại trang không phải là giải pháp.
dbinott
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.