我想在按下一个按钮进入JSF页面时使用JQuery对话框以确认操作执行(在我的情况下确认删除行)。 我发现这个JQuery代码运行得很好:
<html>
<head>
<title>jQuery UI Example Page</title>
<link type="text/css" href="css/custom-theme/jquery-ui-1.8.18.custom.css" rel="stylesheet" />
<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.18.custom.min.js"></script>
<script type="text/javascript">
$(function(){
// Accordion
$("#accordion").accordion({ header: "h3" });
// Tabs
$('#tabs').tabs();
// Dialog
$('#dialog').dialog({
autoOpen: false,
width: 600,
buttons: {
"Ok": function() {
$(this).dialog("close");
},
"Cancel": function() {
$(this).dialog("close");
}
}
});
// Dialog Link
$('#dialog_link').click(function(){
$('#dialog').dialog('open');
return false;
});
// Datepicker
$('#datepicker').datepicker({
inline: true
});
// Slider
$('#slider').slider({
range: true,
values: [17, 67]
});
// Progressbar
$("#progressbar").progressbar({
value: 20
});
//hover states on the static widgets
$('#dialog_link, ul#icons li').hover(
function() { $(this).addClass('ui-state-hover'); },
function() { $(this).removeClass('ui-state-hover'); }
);
});
</script>
<style type="text/css">
/*demo page css*/
body{ font: 62.5% "Trebuchet MS", sans-serif; margin: 50px;}
.demoHeaders { margin-top: 2em; }
#dialog_link {padding: .4em 1em .4em 20px;text-decoration: none;position: relative;}
#dialog_link span.ui-icon {margin: 0 5px 0 0;position: absolute;left: .2em;top: 50%;margin-top: -8px;}
ul#icons {margin: 0; padding: 0;}
ul#icons li {margin: 2px; position: relative; padding: 4px 0; cursor: pointer; float: left; list-style: none;}
ul#icons span.ui-icon {float: left; margin: 0 4px;}
</style>
</head>
<body>
<!-- Dialog NOTE: Dialog is not generated by UI in this demo so it can be visually styled in themeroller-->
<h2 class="demoHeaders">Dialog</h2>
<p><a href="#" id="dialog_link" class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-newwin"></span>Open Dialog</a></p>
<!-- ui-dialog -->
<div id="dialog" title="Dialog Title">
<p>Dialog Test</p>
</div>
</body>
</html>
问题是我需要从此按钮调用对话框到Java Server Faces页面:
<h:commandButton value="Delete" action="#{bean.deleteid}" >
<f:ajax render="@form" execute="@form"></f:ajax>
</h:commandButton>
请您帮助我实施此示例吗?
答案 0 :(得分:4)
这是我使用的方法
您需要两个按钮
第一个将被隐藏,并且将在确认对话框中单击Yes
进行调用,此隐藏按钮将是调用服务器端方法的按钮,并将执行render
使用f:ajax
<h:commandButton id="myHiddenButtonID" value="DeleteHiddenButton" action="#{bean.deleteid}" style="display:none">
<f:ajax render="@form" ></f:ajax>
</h:commandButton>
现在按下将打开对话框的按钮,此按钮也会将表单提交给服务器execute="@form"
(例如,如果您有选择列)
<h:commandButton value="Delete">
<f:ajax execute="@form" onevent="openDialogFunc()"></f:ajax>
</h:commandButton>
现在执行js函数
function openDialogFunc(data){
if (data.status === 'success') {
$('#dialog').dialog({
autoOpen: false,
width: 600,
buttons: {
"Ok": function() {
$("#myHiddenButtonID").click();
$(this).dialog("close");
},
"Cancel": function() {
$(this).dialog("close");
}
}
});
}
}
请注意,只有在单击“确定”对话框按钮后,才会执行隐藏按钮$("#myHiddenButtonID").click();
,否则不会发生任何事情......
但我强烈建议您使用h:head
代替head
和<h:panelGroup
代替div ...请查看我之前的示例... jQuery Dialog in JSF
答案 1 :(得分:3)
如果您必须在点击命令按钮时调用它,请使用onclick
事件
<h:commandButton value="Delete" action="#{bean.deleteid}" onclick="return myjavascriptmethod">
<f:ajax render="@form" execute="@form"></f:ajax>
</h:commandButton>
然后在对话框中,您可以检查确认条件,点击Okay发送事件。
根据评论编辑:
当你不想使用div时,我只使用了一个面板Grid,你可以这样做:
XHTML
<h:panelGrid id="panelGridAsDialogTest" style="display:none;">
<h:outputLabel value="I Am a dialog test" />
</h:panelGrid>
var alreadyValidated = false;
function testJQueryDialog(buttonReference){
if(!alreadyValidated) {
$('#panelGridAsDialogTest').dialog({
autoOpen: true,
width: 600,
buttons: {
"Ok": function(event) {
$(this).dialog("close");
alreadyValidated = true;
jQuery(buttonReference).trigger("click");
},
"Cancel": function(event) {
event.preventDefault();
$(this).dialog("close");
}
}
});
}
return alreadyValidated;
}
如果你想坚持使用div但是让你的代码工作,你可以使用上面给出的相同的javascript,并用div id替换id。
答案 2 :(得分:2)
更简单的方法是不使用jquery dailog进行确认消息,只需使用 onclick 中的普通javascript确认框,无需重新发明轮子:
<h:commandButton value="Delete" action="#{bean.deleteid}" onclick="return confirm('Are you sure you want to delete this?')">
<f:ajax render="@form" execute="@form"></f:ajax>
</h:commandButton>
您必须添加返回,否则jsf会忽略用户从确认框中选择的内容,因此如果用户说点击取消,则仍会执行删除功能。