打开的标签数量限制
Restriction on number of opened tabs
网页上有一些链接。
右键单击有'open link in new tab'选项(浏览器选项)。
我想限制用户不打开两个以上的标签页?
我该怎么做?
<%@ 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>
您不能限制用户打开 新标签页。
(这让我想起了旧的 pop-ups,没有按钮,没有地址栏,但仍然响应退格键和其他事件)
但是,您可以让您的应用程序 识别打开第三个选项卡的尝试,并加载不同的结果,例如错误消息,例如:
Maximum open tabs limit reached. Please use no more than two tabs concurrently. close this tab
为此,您可以使用 HTML5 sessionStorage。
注意:Web 存储(sessionStorage
和 localStorage
)is supported on every browser 如今。
sessionStorage
This is a global object (sessionStorage
) that maintains a storage area
that's available for the duration of the page session. A page session
lasts for as long as the browser is open and survives over page
reloads and restores. Opening a page in a new tab or window will cause
a new session to be initiated.
那你可以
如果 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,由其他动作扩展,并由 prepare()
读取,或者 在拦截器中更好;
将其放入 collection 检查它是否已经包含两个元素,否则 return 错误结果,应该全局映射:
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();
}
}
然后你应该找到一种方法来识别标签何时关闭(释放一个插槽),方法是:
- timizing the period of validity of the elements 在您的 collection 中(如果您一段时间不使用标签,session 会过期,因此必须在 collection)
- 否则,在您的页面中放置一个 javascript AJAX timer(例如,每 30 秒一次),即发送一个
keep-alive
信号到一个操作以刷新元素的有效性。如果选项卡关闭,则不再发送信号。
网页上有一些链接。
右键单击有'open link in new tab'选项(浏览器选项)。
我想限制用户不打开两个以上的标签页? 我该怎么做?
<%@ 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>
您不能限制用户打开 新标签页。
(这让我想起了旧的 pop-ups,没有按钮,没有地址栏,但仍然响应退格键和其他事件)
但是,您可以让您的应用程序 识别打开第三个选项卡的尝试,并加载不同的结果,例如错误消息,例如:
Maximum open tabs limit reached. Please use no more than two tabs concurrently. close this tab
为此,您可以使用 HTML5 sessionStorage。
注意:Web 存储(sessionStorage
和 localStorage
)is supported on every browser 如今。
sessionStorage
This is a global object (
sessionStorage
) that maintains a storage area that's available for the duration of the page session. A page session lasts for as long as the browser is open and survives over page reloads and restores. Opening a page in a new tab or window will cause a new session to be initiated.
那你可以
如果 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,由其他动作扩展,并由
prepare()
读取,或者 在拦截器中更好;将其放入 collection 检查它是否已经包含两个元素,否则 return 错误结果,应该全局映射:
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(); } }
然后你应该找到一种方法来识别标签何时关闭(释放一个插槽),方法是:
- timizing the period of validity of the elements 在您的 collection 中(如果您一段时间不使用标签,session 会过期,因此必须在 collection)
- 否则,在您的页面中放置一个 javascript AJAX timer(例如,每 30 秒一次),即发送一个
keep-alive
信号到一个操作以刷新元素的有效性。如果选项卡关闭,则不再发送信号。