ユーザーが新しいタブを開くことを制限することはできません。
(これは、ボタンもアドレスバーもないが、バックスペースやその他のイベントに応答する古いポップアップを思い出させます)
ただし、アプリに 3 番目のタブを開こうとする試みを認識させ、エラー メッセージなどの別の結果を読み込むことができます。次に例を示します。
開いているタブの最大数に達しました。同時に使用するタブは 2 つまでにしてください。close this tab
これを行うには、HTML5 sessionStorageを使用できます。
注: Web ストレージ(sessionStorage
およびlocalStorage
)は、現在、すべてのブラウザーでサポートされています。
セッションストレージ
これは、ページ セッション中に使用できるストレージ領域を保持するグローバル オブジェクト ( sessionStorage
) です。ページ セッションは、ブラウザーが開いている限り持続し、ページのリロードや復元後も存続します。新しいタブまたはウィンドウでページを開くと、新しいセッションが開始されます。
その後、次のことができます
sessionStorage に存在しない場合は、JSP で一意のトークンを生成し、それを 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);
}
アクションに送り返す
// 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 のセッターに、他のアクションによって拡張され、Interceptorprepare()
によって読み取られます。
すでに 2 つの要素が含まれていないことを確認するコレクションに入れます。それ以外の場合は、グローバルにマップする必要があるエラー結果を返します。
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();
}
}
次に、次のいずれかによって、タブが閉じられたとき (1 つのスロットを解放するため) を認識する方法を見つける必要があります。