如何在JSF之前执行Javascript<;h:commandLink>;是否执行操作?

如何在JSF之前执行Javascript<;h:commandLink>;是否执行操作?,javascript,jsf,Javascript,Jsf,如果您有一个JSF(它使用事件的onclick来提交当前表单),您如何在执行操作之前执行JavaScript(例如请求删除确认? <h:commandLink id="myCommandLink" action="#{myPageCode.doDelete}"> <h:outputText value="#{msgs.deleteText}" /> </h:commandLink> <script type="text/javascript"&g

如果您有一个JSF
(它使用
事件的
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>
if(document.getElementById){ var commandLink=document.getElementById(“”); if(commandLink&&commandLink.onclick){ var commandLinkOnclick=commandLink.onclick; commandLink.onclick=函数(){ var result=confirm('您真的想吗?'); 如果(结果){ 返回commandLinkOnclick(); } 返回false; } } }

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

您仍然可以使用onclick。JSF(参见编码行为)描述了链接应该如何处理它。以下是重要部分(它为onclick呈现的内容):


因此,您的函数不会被传递给事件对象(这在跨浏览器中是不可靠的),但返回true/false将缩短提交过程。

在JSF 1.2中,您可以指定onclick事件

此外,其他库(如或)也实现了“onclick”处理程序

那么,您需要做的只是:

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


注意:您不能只执行
返回确认(…)
,因为这将阻止onClick事件中的其余JavaScript发生,这将有效地阻止您的操作发生,无论用户返回什么

如果希望在发布表单之前执行某些操作,例如,为了确认,请尝试在提交时执行表单事件。比如:

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?');"
将此代码用于jsf 1.1。

这对我很有用:

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


我无法将onclick属性添加到。我收到以下错误:org.apache.jasper.compiler.CompileException:/MyPage.jsp(164,4)Attribute onclick invalid根据指定的TLD,我还看到许多其他人在论坛上请求类似的解决方案。我无法向其添加onclick属性。我收到以下错误:org.apache.jasper.compiler.compileeException:/MyPage.jsp(164,4)Attribute onclick invalid根据指定的TLD,我还看到许多其他人在论坛上请求类似的解决方案。@grant wagner,我意识到现在已经很多年了,但您当时使用的实现可能已经中断,可以简化为
onclick=“return confirm('rease?”)”
。没有必要检查布尔值以返回布尔值。直接返回即可。Primefaces中有没有一种简单的方法可以用
实现上述功能?有趣的是
如果有经验的开发人员在下面的所有帖子中都建议使用
结构。。更有趣的是,我从他们身上学到了:)@BalázsMáriaNémeth你能给我解释一下他们为什么不是吗?这个问题是关于JSF的,相关的问题不是。区别在于,在javascript代码之后,在本例中,我们仍然希望触发服务器操作,但在相关问题中,这纯粹是客户端问题。我已将此问题标记为重新打开。虽然这两个问题的答案都是取消“onclick”属性,但由于目标副本没有说明它也适用于JSF,因此重定向到该页面的用户会感到困惑。
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;
    }
} 
<h:commandButton title="#{bundle.NewPatient}" action="#{identifController.prepareCreate}"  
                                             id="newibutton" 
                                             onclick="if(confirm('#{bundle.NewPatient}?'))return true; else return false;" 
                                             value="#{bundle.NewPatient}"/>