2008-09-16 28 views
11

Nếu bạn có JSF <h:commandLink> (sử dụng sự kiện onclick của số <a> để gửi biểu mẫu hiện tại), làm cách nào để bạn thực thi JavaScript (chẳng hạn như yêu cầu xác nhận xóa) trước khi thực hiện hành động?Làm cách nào để thực thi Javascript trước khi thực hiện hành động JSF <h: commandLink>?

+1

liên quan: http://stackoverflow.com/questions/4571488/confirmation-on-submit – BalusC

+0

@ BalázsMáriaNémeth Xin giải thích cho tôi làm thế nào họ không? – EJP

Trả lời

7
<h:commandLink id="myCommandLink" action="#{myPageCode.doDelete}"> 
    <h:outputText value="#{msgs.deleteText}" /> 
</h:commandLink> 
<script type="text/javascript"> 
if (document.getElementById) { 
    var commandLink = document.getElementById('<c:out value="${myPageCode.myCommandLinkClientId}" />'); 
    if (commandLink && commandLink.onclick) { 
     var commandLinkOnclick = commandLink.onclick; 
     commandLink.onclick = function() { 
      var result = confirm('Do you really want to <c:out value="${msgs.deleteText}" />?'); 
      if (result) { 
       return commandLinkOnclick(); 
      } 
      return false; 
     } 
    } 
} 
</script> 

hành động javascript khác (như xác nhận hình thức đầu vào vv) có thể được thực hiện bằng cách thay thế các cuộc gọi đến confirm() với một cuộc gọi đến một hàm khác.

1

Bạn vẫn có thể sử dụng onclick. JSF render kit specification (xem Hành vi mã hóa) mô tả cách liên kết nên xử lý nó. Đây là một phần quan trọng (những gì nó ám cho onclick):

var a=function(){/*your onclick*/}; var b=function(){/*JSF onclick*/}; return (a()==false) ? false : b(); 

Vì vậy, chức năng của bạn sẽ không được thông qua các đối tượng sự kiện (mà không phải là trình duyệt chéo đáng tin cậy anyway), nhưng trở về đúng/sai sẽ ngắn mạch nộp hồ sơ.

+0

Tôi không thể thêm thuộc tính onclick vào . Tôi nhận được lỗi sau: org.apache.jasper.compiler.CompileException: /MyPage.jsp(164,4) Thuộc tính onclick không hợp lệ theo TLD được chỉ định Tôi cũng đã thấy một số người khác trên diễn đàn yêu cầu giải pháp như thế này. –

0

Trong JSF 1.2, bạn có thể chỉ định các sự kiện onclick.

Ngoài ra, các thư viện khác như MyFaces hoặc IceFaces triển khai trình xử lý "onclick".

gì bạn cần phải làm sau đó chỉ đơn giản là:

<h:commandLink action="#{bean.action}" onclick="if(confirm('Are you sure?')) return false;" /> 

Lưu ý: bạn có thể không chỉ làm return confirm(...) vì điều này sẽ ngăn chặn các phần còn lại của JavaScript trong sự kiện onClick xảy ra, mà sẽ có hiệu quả ngăn chặn hành động của bạn xảy ra bất kể người dùng đã trả lại gì!

0

Nếu bạn muốn thực hiện điều gì đó trước khi biểu mẫu được đăng, để xác nhận ví dụ, hãy thử sự kiện biểu mẫu trênSubmit. Một cái gì đó như:

myform.onsubmit = function(){confirm("really really sure?")}; 
0

này không bao giờ làm việc cho tôi,

onclick="if(confirm('Are you sure?')) return false;" /> 

nhưng điều này đã làm

onclick="if(confirm(\"Are you sure?\"))return true; else return false;" 
+0

Tôi không thể thêm thuộc tính onclick vào . Tôi nhận được lỗi sau: org.apache.jasper.compiler.CompileException:/MyPage.jsp (164,4) Thuộc tính onclick không hợp lệ theo TLD được chỉ định Tôi cũng đã thấy một số người khác trên diễn đàn yêu cầu giải pháp như thế này. –

+0

@ grant-wagner, tôi nhận ra rằng rất nhiều năm nay nhưng có lẽ việc triển khai bạn đã sử dụng vào thời điểm đó đã bị phá vỡ – akostadinov

14

có thể được đơn giản hóa như thế này

onclick="return confirm('Are you sure?');" 
+0

buồn cười mà các cấu trúc 'if' được đề xuất trong tất cả các bài viết dưới đây bởi các nhà phát triển với một số kinh nghiệm .. 'm học từ họ :) – akostadinov

0
var deleteClick; 
var mess="xxx"; 
function assignDeleteClick(link) { 
    if (link.onclick == confirmDelete) { 
     return; 
    } 
    deleteClick = link.onclick; 
    link.onclick = confirmDelete; 
} 


function confirmDelete() { 
    var ans = confirm(mess); 
    if (ans == true) { 
     return deleteClick(); 
    } else { 
     return false; 
    } 
} 

sử dụng mã này cho jsf 1.1.

7

này đã làm việc cho tôi:

<h:commandButton title="#{bundle.NewPatient}" action="#{identifController.prepareCreate}" 
              id="newibutton" 
              onclick="if(confirm('#{bundle.NewPatient}?'))return true; else return false;" 
              value="#{bundle.NewPatient}"/> 
+10

Điều đó có thể được đơn giản hóa là 'onclick =" return confirm (' Bạn có chắc chắn? ') "'. Không cần kiểm tra giá trị boolean để trả về giá trị boolean. Chỉ cần trả lại trực tiếp. – BalusC

+0

Có cách nào dễ dàng trong Primefaces để triển khai thực hiện ở trên bằng cách sử dụng '' thay thế không? – Robert

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