Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对打开的选项卡数量的限制_Javascript_Jsp_Web_Struts2_Browser Tab - Fatal编程技术网

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);
    }
    
  • 将其发送回操作

    //将ID添加到表单中(作为隐藏字段),
    //因此,它将在下次提交时发回。
    $('').attr('类型','隐藏')
    .attr('name','tabId')
    .attr('value',tabId)
    .附录(“形式”);
    });
    
    ,可能是BaseAction中的setter,由其他操作扩展,并由
    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秒一次),它会向一个操作发送一个
    保持活动状态
    信号,以刷新元素的有效性。如果卡舌关闭,信号将不再发送