2010-11-10 27 views
13

Trong ứng dụng web JSF 1.2 của tôi, tôi có một trang có số <h:commandButton> gọi phương thức hành động trên bean sao lưu. Hành động này sẽ khiến dữ liệu bị xóa/thay thế trong cơ sở dữ liệu, vì vậy tôi muốn tránh bất kỳ tình huống nào mà người dùng vô tình nhấp vào nút lệnh.JSF - Làm cách nào để triển khai JavaScript "Bạn có chắc chắn không?" nhắc cho <h: commandButton>

Tôi muốn thực hiện đơn giản "Bạn có chắc chắn không?" nhắc với tùy chọn "Có/Không" hoặc "OK/Hủy" bằng JavaScript. Tôi không tuyệt vời với JavaScript và tôi chưa bao giờ trộn JavaScript với JSF trước đây. Bất cứ ai có thể cung cấp một đoạn mã để cho tôi thấy làm thế nào để thực hiện điều này?

Đây là mảnh của trang JSP của tôi, nơi tôi công bố vào nút lệnh:

<h:commandButton 
    id="commandButtonAcceptDraft" 
    title="#{bundle.tooltipAcceptDraft}" 
    action="#{controller.actionReplaceCurrentReportWithDraft}" 
    image="/images/checkmark.gif"> 
</h:commandButton> 

SOLUTION:

Các giải pháp được cung cấp bởi BalusC chỉ làm việc tốt. Tôi cũng muốn đề cập đến việc dễ dàng sử dụng văn bản từ một gói tài nguyên dưới dạng văn bản nhắc. Trên trang của tôi, tôi tải các gói tài nguyên với một yếu tố như thế này:

<f:loadBundle basename="com.jimtough.resource.LocalizationResources" var="bundle" /> 

Các <f:loadBundle> phải bên <f:view> của bạn. Sau đó, tôi thêm mã do BalusC cung cấp vào phần tử nút lệnh của tôi nhưng thay thế một chuỗi từ gói tài nguyên của tôi cho 'Bạn có chắc chắn không?' văn bản, như thế này:

<h:commandButton 
    id="commandButtonAcceptDraft" 
    title="#{bundle.tooltipAcceptDraft}" 
    action="#{controller.actionReplaceCurrentReportWithDraft}" 
    image="/images/checkmark.gif" 
    onclick="return confirm('#{bundle.confirmationTextAcceptDraft}')"> 
</h:commandButton> 

Các dòng trong tập tin tài nguyên tiếng Anh của tôi (chỉ là một tập tin văn bản đơn giản với các cặp khóa/giá trị) trông như thế này:

# text displayed in user prompt when calling confirm() 
confirmationTextAcceptDraft=This will overwrite the current report and cannot be undone. Are you sure? 

Trả lời

26

Sử dụng chức năng JavaScript confirm(). Nó trả về giá trị boolean. Nếu nó trả về false, thì hành động mặc định của nút sẽ bị chặn, nếu không nó sẽ được tiếp tục.

<h:commandButton onclick="return confirm('Are you sure?')" /> 

Vì nó đã trả boolean, có hoàn toàn không cần phải quấn nó xung quanh trong một if một gợi ý câu trả lời khác.

+0

Giải pháp @CoolBeans là chính xác trong trường hợp của tôi vì nếu không thì hành động sẽ tải lại trang.Tôi đang sử dụng MyFaces và BootsFaces – MitchBroadhead

+0

@MitchBroadhead Sau đó, thư viện JSF hoặc thư viện thành phần được đề cập tạo thuộc tính onclick theo cách không chính xác. Chỉ cần nhìn vào đầu ra HTML được tạo ra và báo cáo vấn đề cho nhà phát triển có trách nhiệm. – BalusC

+1

tôi đã gửi một lỗi tại BootsFaces và Stephan đã khắc phục sự cố ngay bây giờ – MitchBroadhead

1

Tôi không chắc chắn những gì sự kiện bạn sẽ phải lắng nghe (onclick tôi sẽ giả định) như tôi đã không bao giờ được sử dụng JSF. Nói một cách tự nhiên, điều này sẽ hoạt động.

var element = document.getElementById('commandButtonAcceptDraft'); 

element.onclick = function(e){ 
    return confirm('Are you sure etc...'); 
}; 
+1

Nếu bạn muốn sử dụng javascript để getElementById, thì tôi tin rằng bạn sẽ cần phải bao gồm tên biểu mẫu. Trong JSF, ID thực tế của phần tử sẽ giống như 'formName: commandButtonAcceptDraft' – bmeding

3

Bạn có thể thêm javascript vào nút onclick của nút.

<h:commandButton 
    id="commandButtonAcceptDraft" 
    title="#{bundle.tooltipAcceptDraft}" 
    action="#{controller.actionReplaceCurrentReportWithDraft}" 
    onclick="return confirm('Are you sure?')" 
    image="/images/checkmark.gif"> 
</h:commandButton> 
+0

có lợi thế để thêm các sự kiện của bạn vào một kịch bản bên ngoài thay vì nội tuyến. Điều này không có tác dụng, nhưng sẽ không dễ dàng chỉnh sửa nếu bạn cần thêm nó vào một số lượng lớn các mục, hoặc cần phải thay đổi tin nhắn trong tương lai. – zzzzBov

2

Điều này sẽ hiệu quả. Lý tưởng nhất là nó phải ở trong một tập lệnh java.

<h:commandButton 
    id="commandButtonAcceptDraft" 
    title="#{bundle.tooltipAcceptDraft}" 
    action="#{controller.actionReplaceCurrentReportWithDraft}" 
    image="/images/checkmark.gif" 
    onclick="if (!confirm('Are you sure?')) return false"> 
</h:commandButton> 
+1

Đây là giải pháp đúng trong trường hợp của tôi. Giải pháp @BalusC khiến tải lại trang bằng MyFaces và BootsFaces. Không chắc chắn lý do tại sao. – MitchBroadhead

Các vấn đề liên quan