我正在使用带有Dojo插件的Struts 2.1.6,整个应用程序都有ajax链接(sx:a)。
是否有人成功实现了后退按钮功能并链接到某些内容?
有没有人有经验如何实施?我打算实施(如果没有好的解决方案)这样的事情:
或者我应该改变整个应用程序来使用jQuery插件? jQuery是否有很好的后退按钮和链接在ajax页面上的解决方案?
答案 0 :(得分:1)
我可以想到两个简单的方法:
<s:form action="actionName">
<input type="hidden" value="<s:property value="someProperty"/>" name="someProperty"/>
<input type="hidden" value="<s:property value="someProperty2"/>" name="someProperty2"/>
<s:submit value="Back" />
</s:form>
或
<s:url name="backURL" action="actionName">
<s:param name="someProperty" value="someProperty"/>
<s:param name="someProperty2" value="someProperty2"/>
</s:url>
<a href="<s:property value="#backURL"/>">Back</a>
如果您已有查询字符串参数:
<a href="#" onclick="javascript.window=document.referrer;">Back</a>
或
<input type="button" value="Back" onclick="javascript.window=document.referrer;"/>
答案 1 :(得分:1)
我尝试使用带有dojo的Struts 2并实现后退按钮。你已经超越了Struts 2的ajax实现。他们主要使用和编写它来编写简单快速的ajax函数调用,并不太适合更广泛的用途。另外当你做s:head theme ='ajax'标签; struts将导入你可能需要的每个ajax js文件,这会导致加载时间。
我建议1.学习dojo并使用独立于struts 2的库。或者2.获取jQuery,我能够实现相对简单的后退按钮功能(更多的是struts 2 theme ='ajax')。
答案 2 :(得分:0)
不知道Struts,但你看过dojo.undo(0.4.3)吗?
答案 3 :(得分:0)
我的所有链接都会通过一个动作来查找参数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',它将哈希和参数添加到地址栏并更改标题,然后记住这个哈希值,因此间隔哈希搜索可以找出差异。然后它初始化这个哈希搜索。
在动作类(这是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>
注意:如果您通过一个参数连接了所有内容,这是一种特殊情况,但可以使用发布其他目标的其他参数轻松扩展。我将尝试使它足够通用以在某处发布它,但这是(我猜)还有很长的路要走:))
如果您有任何疑问,请发布。