gpt4 book ai didi

javascript - 打开的标签数量限制

转载 作者:行者123 更新时间:2023-11-29 10:40:10 24 4
gpt4 key购买 nike

网页上有一些链接。

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

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

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

最佳答案

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

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

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

为此,您可以使用 HTML5 sessionStorage .
注意:Web 存储(sessionStoragelocalStorage)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中生成一个唯一的token,并将其放入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);
    }
  • 将其发送回 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() 读取,或者在拦截器中更好

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

    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在您的收藏中(如果您一段时间不使用选项卡, session 将过期,因此必须在收藏中使用 token )
  • 否则,放一个javascript AJAX timer在您的页面中(例如,每 30 秒),向操作发送一个 keep-alive 信号以刷新元素的有效性。如果选项卡关闭,则不再发送信号。

关于javascript - 打开的标签数量限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30726627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com