jquery-ui-hộp thoại - Cách móc vào sự kiện đóng hộp thoại


186

Tôi đang sử dụng jquery-ui-dialog plugin

Tôi đang tìm cách để làm mới trang khi trong một số trường hợp khi hộp thoại được đóng lại.

Có cách nào để chụp một sự kiện gần từ hộp thoại không?

Tôi biết tôi có thể chạy mã khi nhấp vào nút đóng nhưng điều đó không bao gồm việc người dùng đóng bằng thoát hoặc x ở góc trên cùng bên phải.

Câu trả lời:


248

Tôi đã tìm thấy nó!

Bạn có thể bắt sự kiện gần bằng mã sau:

 $('div#popup_content').on('dialogclose', function(event) {
     alert('closed');
 });

Rõ ràng tôi có thể thay thế cảnh báo bằng bất cứ điều gì tôi cần làm.
Chỉnh sửa: Kể từ Jquery 1.7, liên kết () đã trở thành ()


3
typo:. $ ( 'div # popup_content') bind ( 'dialogclose', function (sự kiện)) {...}
CFNinja

1
Điều này là hữu ích nhưng là $('div#popup_content')đúng? Tôi nên thay cái này bằng cái gì, nhớ rằng hộp thoại của tôi được mở như thế nàyjQuery.fn.dialog.open({})
Jake N

Tôi thấy hộp thoại đóng trước và sau đó cảnh báo xuất hiện, nếu đó là tình huống tương tự với mọi người, ai đó có thể giúp tôi để cảnh báo xuất hiện trước và sau đó nhấp vào OK thì cửa sổ sẽ đóng không? Sửa lỗi cho tôi ....
changeme

5
Điều này nên được cập nhật để sử dụng trên () thay vì bind () hiện đã lỗi thời.
RBZ

2
Hãy nhớ rằng nếu Hộp thoại UI UI chưa bao giờ được mở trước đó trên một trang, thì div lớp phủ sẽ không tồn tại trong DOM. Do đó, bạn có thể cân nhắc làm một việc như thế này thay vào đó:$('body').on('dialogclose', '.ui-dialog', function(){...});
thdoan

192

Tôi tin rằng bạn cũng có thể làm điều đó trong khi tạo hộp thoại (được sao chép từ một dự án tôi đã làm):

dialog = $('#dialog').dialog({
    modal: true,
    autoOpen: false,
    width: 700,
    height: 500,
    minWidth: 700,
    minHeight: 500,
    position: ["center", 200],
    close: CloseFunction,
    overlay: {
        opacity: 0.5,
        background: "black"
    }
});

Ghi chú close: CloseFunction


9
Câu trả lời này có vẻ đúng với tôi hơn câu trả lời được chấp nhận. Ngoài ra, tài liệu API chính xác có thể được tìm thấy ở đây: api.jqueryui.com/dialog/#event-close
Chris Gillum

2
Jake N - Bạn thực sự cần phải viết một chức năng có thể truy cập vào hộp thoại có tên 'Đóng chức năng' để làm việc này, ví dụ ngay phía trên bạn có thể viết var CloseFunction = function() { //Do your custom closing stuff here };
Adam Diament

Đây là một tùy chọn nhưng tại thời điểm mã đang được sử dụng ở những nơi khác nhau. Câu trả lời được chọn hoạt động khi bạn muốn thêm các hành vi khác nhau trong các ngữ cảnh khác nhau và sử dụng lại mã tạo hộp thoại để có được tiêu chuẩn hóa.
NectarSoft

Bạn có overlayhai lần. Điều đó không cần thiết phải không?
radbyx

1
Điều này hoạt động và chắc chắn là một câu trả lời cần thiết và hữu ích ở đây, nhưng nó cũng chạy mã CloseFunction bất cứ khi nào hộp thoại được đóng bằng bất kỳ phương tiện nào, không chỉ khi đóng bằng X hoặc một cái gì đó. Vì vậy, nếu bạn muốn chạy một số mã nhất định khi hộp thoại được đóng bằng nút X hoặc nút Hủy, nhưng không phải khi nó bị đóng bởi một thứ khác xảy ra (như trong trường hợp của tôi khi một đầu vào được gửi được xác thực là chính xác), thì điều này sẽ không công việc.
mikato

31
$("#dialog").dialog({
    autoOpen: false,
    resizable: false,
    width: 400,
    height: 140,
    modal: true, 
    buttons: {
        "SUBMIT": function() { 
        $("form").submit();
    }, 
        "CANCEL": function() { 
        $(this).dialog("close");
    } 
    },
    close: function() {
      alert('close');
    }
});

21
$( "#dialogueForm" ).dialog({
              autoOpen: false,
              height: "auto",
              width: "auto",
              modal: true,
                my: "center",
                at: "center",
                of: window,
              close : function(){
                  // functionality goes here
              }  
              });

thuộc tính "đóng" của hộp thoại cung cấp cho sự kiện gần giống nhau.


16

Bạn cũng có thể thử cái này

$("#dialog").dialog({
            autoOpen: false,
            resizable: true,
            height: 400,
            width: 150,
            position: 'center',
            title: 'Term Sheet',
            beforeClose: function(event, ui) { 
               console.log('Event Fire');
            },
            modal: true,
            buttons: {
                "Submit": function () {
                    $(this).dialog("close");
                },
                "Cancel": function () {
                    $(this).dialog("close");
                }
            }
        });

10

Đây là những gì làm việc cho tôi...

$('#dialog').live("dialogclose", function(){
   //code to run on dialog close
});

8

Kể từ jQuery 1.7, phương thức .on () là phương thức ưa thích để đính kèm các trình xử lý sự kiện vào tài liệu.

Bởi vì không ai thực sự tạo ra một câu trả lời với việc sử dụng. on()thay vì bind()tôi quyết định tạo ra một.

$('div#dialog').on('dialogclose', function(event) {
     //custom logic fired after dialog is closed.  
});

6

thêm tùy chọn 'đóng' như dưới mẫu và làm những gì bạn muốn chức năng nội tuyến

close: function(e){
    //do something
}

4

Nếu tôi hiểu loại cửa sổ mà bạn đang nói đến, sẽ không $ (cửa sổ) .unload () (cho cửa sổ hộp thoại) có cung cấp cho bạn cái móc bạn cần không?

(Và nếu tôi hiểu nhầm và bạn đang nói về một hộp thoại được tạo thông qua CSS chứ không phải cửa sổ trình duyệt bật lên, thì tất cả các cách đóng cửa sổ đó là các yếu tố bạn có thể đăng ký xử lý nhấp chuột.)

Chỉnh sửa: Ah, tôi thấy bây giờ bạn đang nói về các hộp thoại jquery-ui, được thực hiện thông qua CSS. Bạn có thể móc X đóng cửa sổ bằng cách đăng ký trình xử lý nhấp chuột cho phần tử với lớp ui-hộp thoại-titlebar-close .

Hữu ích hơn, có lẽ, là cho bạn biết làm thế nào để tìm ra điều đó một cách nhanh chóng. Trong khi hiển thị hộp thoại, chỉ cần mở FireBug và Kiểm tra các yếu tố có thể đóng cửa sổ. Bạn sẽ ngay lập tức thấy cách chúng được xác định và cung cấp cho bạn những gì bạn cần để đăng ký trình xử lý nhấp chuột.

Vì vậy, để trả lời trực tiếp câu hỏi của bạn, tôi tin rằng câu trả lời thực sự là "không" - không có sự kiện gần gũi nào bạn có thể câu, nhưng "có" - bạn có thể móc tất cả các cách để đóng hộp thoại khá dễ dàng và nhận được bạn muốn gì.


Này andy. Tôi thích thú với hộp thoại từ jquery-ui được tạo thông qua css và javascript. Từ việc nhìn vào mã tôi nghĩ rằng có một cái móc ở đó cho tôi nhưng tôi không biết làm thế nào để lấy nó.
Brownie

2

Bạn có thể thử đoạn mã sau để chụp sự kiện kết thúc cho bất kỳ mục nào: trang, hộp thoại, v.v.

$("#dialog").live('pagehide', function(event, ui) {
      $(this).hide();
});

1
Chỉ cần sử dụng .on () - thay vì .live () hoặc .bind ()
cssyphus
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.