2011-11-04 25 views
5

Cách đánh bại cửa sổ bật lên của trình duyệt IE và Firefox khi cố gắng đặtResponsePage() từ wicket modalWindow bên dưới. Hộp thoại bật lên yêu cầu câu trả lời cho: "Trang này yêu cầu bạn xác nhận rằng bạn muốn rời khỏi - dữ liệu bạn đã nhập có thể không được lưu."Làm cách nào để đánh bại hộp thoại của trình duyệt khi gọi Wicket setResponsePage() từ cửa sổ phương thức?

AjaxLink signInContainer = new AjaxLink("signInContainer") { 
     @Override 
     public void onClick(AjaxRequestTarget target) { 
      target.appendJavascript("Wicket.Window.unloadConfirmation = false;"); 

      modalWindow.close(target); 
      setResponsePage(SignInPage.class); 
      modalWindow.close(target); 
     } 
    }; 

-Rich

Trả lời

0

EDIT:Đây là một hack, sử dụng thay thế được mô tả trong other answer tôi.

Hãy thử điều này:

public void onClick(AjaxRequestTarget target) { 
    modal.close(target); 
    CharSequence url = urlFor(HomePage.class, new PageParameters("gone=true")); 
    target.appendJavascript("window.location='" + url + "';"); 
} 
+0

Sẽ bypass này Wicket tích hợp trong sơ đồ trang? Liệu có bất kỳ tác dụng phụ tiêu cực nào không? – jbrookover

+0

Điều này sẽ giống như việc mở một trang có thể đánh dấu trang từ liên kết tĩnh hoặc dấu trang của trình duyệt. Tôi không thể thấy nó có thể gây ra vấn đề gì. – tetsuo

+0

Ahh, đúng vậy. Lấy làm tiếc. – jbrookover

0

Tôi tin setResponsePage() nên được kèm theo một số phương pháp khác để cư xử đúng. Ví dụ, tôi thường bao gồm setRedirect(true) khi sử dụng kỹ thuật này. Tôi không chắc tất cả những gì đang xảy ra đằng sau hậu trường ở đó, nhưng có lẽ hãy thử điều đó.

8

target.appendJavascript("Wicket.Window.unloadConfirmation = false;"); không hoạt động vì phải chạy trước modal.show(target);.

Bạn có thể hoặc là thêm vào trước, thay vì append, kịch bản, khi mở cửa sổ:

add(new AjaxLink<Void>("show") { 
    @Override 
    public void onClick(AjaxRequestTarget target) { 
     target.prependJavascript("Wicket.Window.unloadConfirmation = false;"); 
     modal.show(target); 
    } 
}); 

hoặc thêm một hành vi, để thực hiện nó trên onload:

modal.add(new AbstractBehavior() { 
    @Override 
    public void renderHead(IHeaderResponse response) { 
     response.renderOnLoadJavascript("Wicket.Window.unloadConfirmation = false;"); 
    } 
}); 

Tuy nhiên, nó phải được gọi là trước khi mở cửa sổ phương thức, không phải khi điều hướng khỏi trang (setResponsePage()).

+0

Để sử dụng cách tiếp cận thứ hai trong Wicket 6, 'Hành vi' nên được sử dụng thay cho' AbstractBheavior', và vì 'renderOnLoadJavaScript' không tồn tại nữa, người ta sẽ sử dụng' response.render (JavaScriptHeaderItem.forScript ("..." , id)); '. –

+0

'OnDomReadyHeaderItem' – tetsuo

8

Trong wicket 6.x bạn chỉ có thể thiết lập showUnloadConfirmation false:

final ModalWindow modalWindow = new ModalWindow("modalWindow"); 
modalWindow.showUnloadConfirmation(false); 
Các vấn đề liên quan