在执行JSF操作之前如何执行Javascript?

时间:2020-03-05 18:56:19  来源:igfitidea点击:

如果我们有JSF<h:commandLink>(它使用<a>onclick事件提交当前表单),那么如何在执行之前执行JavaScript(例如要求删除确认)正在执行的动作?

解决方案

回答

<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>

其他Javascript动作(如验证表单输入等)可以通过将对confirm()的调用替换为对另一个函数的调用来执行。

回答

我们仍然可以使用onclick。 JSF渲染工具包规范(请参阅编码行为)描述了链接应如何处理它。这是重要的部分(它为onclick呈现的内容):

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

因此,函数将不会传递给事件对象(无论如何,这不是可靠的跨浏览器),但是返回true / false将缩短提交。

回答

在JSF 1.2中,我们可以指定onclick事件。

另外,其他库(例如MyFaces或者IceFaces)也实现了" onclick"处理程序。

然后,我们需要做的就是:

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

注意:我们不能只是执行return return(()),因为这将阻止onClick事件中其余的JavaScript发生,无论用户返回什么内容,都将有效阻止操作!

回答

如果要在发布表单之前执行某些操作(例如,进行确认),请尝试表单事件onSubmit。就像是:

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

回答

这对我没用

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

但这确实

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

回答

可以这样简化

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