<i id='BDBjW'><tr id='BDBjW'><dt id='BDBjW'><q id='BDBjW'><span id='BDBjW'><b id='BDBjW'><form id='BDBjW'><ins id='BDBjW'></ins><ul id='BDBjW'></ul><sub id='BDBjW'></sub></form><legend id='BDBjW'></legend><bdo id='BDBjW'><pre id='BDBjW'><center id='BDBjW'></center></pre></bdo></b><th id='BDBjW'></th></span></q></dt></tr></i><div id='BDBjW'><tfoot id='BDBjW'></tfoot><dl id='BDBjW'><fieldset id='BDBjW'></fieldset></dl></div>
    1. <tfoot id='BDBjW'></tfoot>

      <legend id='BDBjW'><style id='BDBjW'><dir id='BDBjW'><q id='BDBjW'></q></dir></style></legend>
        <bdo id='BDBjW'></bdo><ul id='BDBjW'></ul>

      <small id='BDBjW'></small><noframes id='BDBjW'>

    2. 打开标签的数量限制

      时间:2023-10-12
      <tfoot id='rEBJu'></tfoot>

      <small id='rEBJu'></small><noframes id='rEBJu'>

          <legend id='rEBJu'><style id='rEBJu'><dir id='rEBJu'><q id='rEBJu'></q></dir></style></legend>
          • <i id='rEBJu'><tr id='rEBJu'><dt id='rEBJu'><q id='rEBJu'><span id='rEBJu'><b id='rEBJu'><form id='rEBJu'><ins id='rEBJu'></ins><ul id='rEBJu'></ul><sub id='rEBJu'></sub></form><legend id='rEBJu'></legend><bdo id='rEBJu'><pre id='rEBJu'><center id='rEBJu'></center></pre></bdo></b><th id='rEBJu'></th></span></q></dt></tr></i><div id='rEBJu'><tfoot id='rEBJu'></tfoot><dl id='rEBJu'><fieldset id='rEBJu'></fieldset></dl></div>
              <tbody id='rEBJu'></tbody>
                <bdo id='rEBJu'></bdo><ul id='rEBJu'></ul>
                本文介绍了打开标签的数量限制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                问题描述

                网页上有一些链接.

                右键单击有在新选项卡中打开链接"选项(浏览器选项).

                On right click there is option of 'open link in new tab'(browser option).

                我想限制用户不要打开两个以上的标签?我该怎么做?

                I want to restrict user for not opening more that two tabs? How can i do this?

                <%@ 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>
                

                推荐答案

                您不能限制用户打开新标签页.
                (这让我想起了没有按钮,没有地址栏,但仍然响应退格和其他事件的旧弹出窗口)

                You can't restrict the user from opening a new tab.
                (This reminds me the old pop-ups with no buttons, no address bar, but still responding to backspace and other events)

                但是,您可以让您的应用识别打开第三个标签页的尝试,并加载不同的结果(例如错误消息),例如:

                You can however make your app recognize the attempt of opening a third tab, and load a different result like an error message, for example:

                已达到最大打开标签限制.请同时使用不超过两个选项卡.关闭此标签

                Maximum open tabs limit reached. Please use no more than two tabs concurrently. close this tab

                为此,您可以使用 HTML5 sessionStorage.
                注意:Web 存储(sessionStoragelocalStorage)现在所有浏览器都支持.

                To do this, you can use HTML5 sessionStorage.
                Note: Web Storage (sessionStorage and localStorage) is supported on every browser nowadays.

                这是一个全局对象(sessionStorage),维护一个存储区域在页面会话期间可用.页面会话只要浏览器打开并在页面上存活,就会持续重新加载和恢复.在新标签页或窗口中打开页面会导致将启动一个新会话.

                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中生成一个唯一的token,放到sessionStorage中,

                • if not present in sessionStorage, generate an unique token in JSP, and put it in 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);
                    }
                

              • 将其发送回操作

              • send it back to the action

                    // 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() 读取,或者 在拦截器中更好

                , maybe to a setter in a BaseAction, extendend by the other actions, and read by prepare(), or much better in an Interceptor;

                把它放在一个集合中,检查它是否已经包含两个元素,否则返回错误结果,应该全局映射:

                put it in a collection checking that it doesn't contain already two elements, otherwise return the error result, that should be mapped globally:

                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();
                    }
                }
                

              • 然后您应该找到一种方法来识别选项卡何时关闭(以释放一个插槽),方法是:

                Then you should find a way to recognize when a tab get closed (to free one slot), by either:

                • 优化集合中元素的有效期(如果您有一段时间不使用标签,会话过期,所以必须做集合中的令牌)
                • 否则,在您的页面中放置一个 javascript AJAX 计时器(例如,每 30 秒),发送一个 keep-alive 向动作发出信号以刷新元素的有效性.如果选项卡关闭,则不再发送信号.
                • timizing the period of validity of the elements in your collection (if you don't use a tab for some time, the session expires, and so must do the token in the collection)
                • otherwise, putting a javascript AJAX timer in your page (eg. every 30 seconds), that send a keep-alive signal to an action to refresh the validity of the element. If the tab get closed, the signal is not sent anymore.

                这篇关于打开标签的数量限制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                上一篇:如何使用 jquery 验证插件验证名称中带有点的输入 下一篇:如何在 Struts2 中获取特定的未选中复选框

                相关文章

                最新文章

                  <tfoot id='vNLar'></tfoot>

                  • <bdo id='vNLar'></bdo><ul id='vNLar'></ul>
                1. <small id='vNLar'></small><noframes id='vNLar'>

                2. <legend id='vNLar'><style id='vNLar'><dir id='vNLar'><q id='vNLar'></q></dir></style></legend>
                  <i id='vNLar'><tr id='vNLar'><dt id='vNLar'><q id='vNLar'><span id='vNLar'><b id='vNLar'><form id='vNLar'><ins id='vNLar'></ins><ul id='vNLar'></ul><sub id='vNLar'></sub></form><legend id='vNLar'></legend><bdo id='vNLar'><pre id='vNLar'><center id='vNLar'></center></pre></bdo></b><th id='vNLar'></th></span></q></dt></tr></i><div id='vNLar'><tfoot id='vNLar'></tfoot><dl id='vNLar'><fieldset id='vNLar'></fieldset></dl></div>