我的所有链接都通过一个查找参数 menuId 的操作(当然是必须显示的菜单的 id)。
从这个动作中,在返回响应之前,我设置了一个要调用的 javascript 函数:
setBackMenuId(menuId,sometext)
MenuId 是 id,sometext 是该菜单的名称,因此浏览器日志历史记录更好。
function setBackMenuId(id,subtekst) {
window.location.hash = "menuId="+id;
document.title = subtekst;
selectedHash = document.location.hash;
if(intervalHashSearch == '') {
initializeHashSearch();
}
}
然后,其他需要的js函数:
function publishLinkTarget() {
var param = window.location.hash;
if(param) {
if(param.indexOf("menuId") > 0) {
var id = param.split("=", 2);
if(id[1]) {
setCookie('backMenuId',id[1],1,false);
setTimeout('publishLayoutContent()', 100);
}
}
}
}
var selectedHash = '';
var intervalHashSearch = '';
function initializeHashSearch() {
intervalHashSearch = window.setInterval('checkHash()', 500);
}
function stopHashSearch() {
window.clearInterval(intervalHashSearch);
intervalHashSearch = '';
}
function checkHash() {
var currentHash = document.location.hash;
if(selectedHash != currentHash) {
selectedHash = currentHash;
publishLinkTarget();
}
}
function publishLayoutContent() {
dojo.event.topic.publish("layoutContentTarget");
}
如果你看它你会发现,它首先被称为'setBackMenuId',它将哈希和参数添加到地址栏并更改标题,然后记住这个哈希,因此间隔哈希搜索可以找出差异。然后它初始化这个哈希搜索。
'checkHash' 运行 500 毫秒,并检查哈希是否已更改(这意味着,按下后退按钮,而不是单击新链接(setBackMenuId 设置 selectedHash)。如果为真(按下后退/前进按钮)函数'调用publishLinkTarget',它从hash中读取参数,如果没问题,首先我设置一个cookie,这样我就可以从HttpServletRequest中读取它并找出哪个菜单id链接。如果我在这里意味着我还必须发布使用“publishLayoutContent”制作的内容。
在动作类中(这是MenuAction,方法视图,与发布的相同)只有这一点很重要:
Integer menuId = null;
if(request.getParameter("menuId") != null) {
menuId = Integer.valueOf(request.getParameter("menuId"));
} else {
menuId = getIntCookie("hiddenMenuId");
}
因此,如果我没有从参数中获取菜单 ID(单击链接),我会从 cookie(后退/前进按钮)中获取。
和具有此目标的 JSP:
<s:url var="layoutContentUrl" action="Menu-view" namespace="/public" />
<sx:div showLoadingText="false" indicator="ajaxIndicator"
id="layout-content" href="%{layoutContentUrl}" theme="ajax"
listenTopics="layoutContentTarget" preload="false"
afterNotifyTopics="/ajaxAfter">
</sx:div>
注意:如果您通过一个参数连接所有内容,这是一种特殊情况,但可以使用发布其他目标的其他参数轻松扩展它。我将尝试使其足够通用以在某处发布它,但这(我猜)还有很长的路要走:)
如果您有任何问题,请发布。