問題描述
網頁上有一些鏈接.
右鍵單擊有在新選項卡中打開鏈接"選項(瀏覽器選項).
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 存儲(sessionStorage
和 localStorage
)現在所有瀏覽器都支持.
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模板網!