Javascript 对打开的选项卡数量的限制
网页上有一些链接 右键单击有“在新选项卡中打开链接”选项(浏览器选项) 我想限制用户不打开超过两个选项卡? 我该怎么做Javascript 对打开的选项卡数量的限制,javascript,jsp,web,struts2,browser-tab,Javascript,Jsp,Web,Struts2,Browser 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/loo
<%@ 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>
在此处插入标题
您不能限制用户打开新选项卡。(这让我想起了以前的弹出窗口,没有按钮,没有地址栏,但仍然对退格和其他事件做出响应) 但是,您可以让应用程序识别打开第三个选项卡的尝试,并加载不同的结果,如错误消息,例如: 已达到最大打开选项卡限制。请同时使用不超过两个选项卡。关闭此选项卡 为此,您可以使用。
注意:Web存储(
会话存储
和本地存储
)
会话存储
这是一个维护存储区域的全局对象(sessionStorage
)
这在页面会话期间可用。页面会话
只要浏览器处于打开状态并在整个页面上继续存在,该状态就会持续
重新加载和恢复在新选项卡或窗口中打开页面将导致
要启动的新会话
那你可以
- 如果sessionStorage中不存在,则在JSP中生成一个唯一的令牌,并将其放入sessionStorage中
$(函数(){ //读取ID。如果为空,则这是一个新选项卡: //生成ID并将其存储以备将来使用。 var tabId=sessionStorage.getItem(“tabId”); if(tabId==null){ tabId=Math.random(); sessionStorage.putItem(“tabId”,tabId); }
- 将其发送回操作
,可能是BaseAction中的setter,由其他操作扩展,并由//将ID添加到表单中(作为隐藏字段), //因此,它将在下次提交时发回。 $('').attr('类型','隐藏') .attr('name','tabId') .attr('value',tabId) .附录(“形式”); });
读取,或者在拦截器中更好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(); } }
publicstringintercept(ActionInvocation-ActionInvocation)引发异常{ Action Action=(Action)actionInvocation.getAction(); if(action instanceof limitedTabAware){//用于标识特殊操作的接口 ActionContext=actionInvocation.getInvocationContext(); 映射请求=((HttpServletRequest) get(strutstatics.HTTP_REQUEST)).getParameterMap(); if(request.containsKey(“tabId”){ String tabId=(String)request.get(“tabId”)[0]; List openTabs=context.getSession().get(“OPEN_TABS_KEY”); if(openTabs.contains(tabId)){ 返回actionInvocation.invoke(); }else if(openTabs.size()>=2){ 返回“tablimitexeceded”;//全局结果 }否则{ openTabs.add(tabId); context.getSession().put(“OPEN\u TABS\u KEY”,openTabs); 返回actionInvocation.invoke(); } }否则{ 抛出新的IllegalArgumentException(“此请求中没有tabId”); } }否则{ 返回actionInvocation.invoke(); } }
- 在集合中(如果一段时间内不使用选项卡,会话将过期,因此必须在集合中使用令牌)
- 否则,在页面中放入一个(例如,每30秒一次),它会向一个操作发送一个
信号,以刷新元素的有效性。如果卡舌关闭,信号将不再发送保持活动状态