Como posso executar Javascript antes que uma ação JSF <h:commandLink> seja executada?[duplicado]
-
09-06-2019 - |
Pergunta
Essa pergunta já tem resposta aqui:
- Confirmação ao enviar 1 resposta
Se você tem um JSF <h:commandLink>
(que usa o onclick
evento de um <a>
para enviar o formulário atual), como você executa o JavaScript (como solicitar a confirmação de exclusão) antes da ação ser executada?
Solução 2
<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>
Outras ações Javascript (como validação de entrada de formulário, etc.) podem ser executadas substituindo a chamada para confirm()
com uma chamada para outra função.
Outras dicas
Pode ser simplificado assim
onclick="return confirm('Are you sure?');"
Isso funcionou para mim:
<h:commandButton title="#{bundle.NewPatient}" action="#{identifController.prepareCreate}"
id="newibutton"
onclick="if(confirm('#{bundle.NewPatient}?'))return true; else return false;"
value="#{bundle.NewPatient}"/>
Você ainda pode usar onclick.O JSF especificação do kit de renderização (consulte Comportamento de codificação) descreve como o link deve lidar com isso.Aqui está a parte importante (o que é renderizado para onclick):
var a=function(){/*your onclick*/}; var b=function(){/*JSF onclick*/}; return (a()==false) ? false : b();
Portanto, sua função não receberá o objeto de evento (que de qualquer maneira não é confiável entre navegadores), mas retornar verdadeiro/falso causará um curto-circuito no envio.
No JSF 1.2 você pode especificar eventos onclick.
Além disso, outras bibliotecas, como Meus rostos ou Faces de Gelo implemente o manipulador "onclick".
O que você precisa fazer é simplesmente:
<h:commandLink action="#{bean.action}" onclick="if(confirm('Are you sure?')) return false;" />
Observação:você não pode simplesmente fazer return confirm(...)
pois isso bloqueará a ocorrência do restante do JavaScript no evento onClick, o que efetivamente impediria que sua ação acontecesse, não importa o que o usuário retornasse!
Se você quiser executar algo antes do formulário ser postado, para confirmação por exemplo, tente o evento de formulário onSubmit.Algo como:
myform.onsubmit = function(){confirm("really really sure?")};
Isso nunca funcionou para mim,
onclick="if(confirm('Are you sure?')) return false;" />
mas isso fez
onclick="if(confirm(\"Are you sure?\"))return true; else return false;"
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;
}
}
use este código para jsf 1.1.