网页上有一些链接。
右键单击可以选择“在新标签页中打开链接”(浏览器选项)。
我想限制用户不要打开两个标签? 我怎么能这样做?
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<ul>
<li><a href="http://localhost:8080/struts_tab/abcForm1.action" oncontextmenu="return false;"><span>First Click[Right Click disabled]</span></a></li>
<li><a href="http://localhost:8080/struts_tab/defForm2.action"><span>Second clieck[Not more than 2 tabs]</span></a></li>
</ul>
</body>
</html>
答案 0 :(得分:3)
您无法限制用户从打开新标签页 (这让我想起没有按钮,没有地址栏,但仍然响应退格和其他事件的旧弹出窗口)
然而,您可以使您的应用识别尝试打开第三个标签,并加载不同的结果,例如错误消息,例如:
达到最大打开标签限制。请同时使用不超过两个选项卡。 关闭此标签
为此,您可以使用HTML5 sessionStorage
注意:网络存储(sessionStorage
和localStorage
)is supported on every browser如今。
的sessionStorage
这是维护存储区域的全局对象(
sessionStorage
) 在页面会话期间可用。页面会话 只要浏览器处于打开状态并且在页面上存活,就会持续一段时间 重新加载和恢复。 在新标签页或新窗口中打开页面会导致 要启动的新会议。
然后你可以
如果在sessionStorage中不存在,则在JSP中生成一个唯一的令牌,并将其放在sessionStorage中,
$(function(){
// Read the ID. If it's null, this is a new tab:
// generate the ID and store it for later.
var tabId = sessionStorage.getItem("tabId");
if (tabId == null){
tabId = Math.random();
sessionStorage.putItem("tabId",tabId);
}
将其发回行动
// Add the ID to the form (as hidden field),
// so it will be posted back in next submission.
$('<input>').attr('type' , 'hidden')
.attr('name' , 'tabId')
.attr('value' , tabId)
.appendTo('form');
});
,也许是BaseAction中的setter,其他动作的extendend,prepare()
读取,或拦截器中更好;
将它放入一个集合中,检查它是否已经包含两个元素,否则返回应该全局映射的错误结果:
public String intercept(ActionInvocation actionInvocation) throws Exception {
Action action = (Action) actionInvocation.getAction();
if(action instanceof LimitedTabsAware){ //interface to identify special actions
ActionContext context = actionInvocation.getInvocationContext();
Map<String, String[]> request = ((HttpServletRequest)
context.get(StrutsStatics.HTTP_REQUEST)).getParameterMap();
if (request.containsKey("tabId")){
String tabId = (String) request.get("tabId")[0];
List<String> openTabs = context.getSession().get("OPEN_TABS_KEY");
if (openTabs.contains(tabId)){
return actionInvocation.invoke();
} else if (openTabs.size()>=2){
return "tabLimitExceeded"; // global result
} else {
openTabs.add(tabId);
context.getSession().put("OPEN_TABS_KEY", openTabs);
return actionInvocation.invoke();
}
} else {
throw new IllegalArgumentException("There is no tabId in this request.");
}
} else {
return actionInvocation.invoke();
}
}
然后,您应该找到一种方法来识别标签何时关闭(释放一个广告位),或者:
keep-alive
信号发送到动作以刷新元素的有效性。如果标签关闭,则不再发送信号。