我有一个带有启动页面的应用程序需要确定已打开的内容,因此它不会重新打开已在另一个新选项卡中打开的内容。在Firefox中,我能够通过使用window.sessionStorage存储打开的页面标题来完成这项工作,然后使用带有以下代码的window.opener从列表中删除标题。
Gecko Session Storage Info Page
if (window.sessionStorage) {
if (window.sessionStorage.getItem(code)) {
return; // page already open
}
else {
window.sessionStorage.setItem(code, code);
window.open("Sheet.aspx", "_blank");
}
}
在打开的页面上:
function signalPageExit() {
if (window.opener.sessionStorage) {
window.opener.sessionStorage.removeItem(
document.getElementById("runcode").childNodes[0].textContent);
}
这在IE中不起作用所以我决定使用cookie策略,但是动态启动的页面上的代码从未成功删除过,因此一旦它们被打开,页面就无法从启动页面重新打开启动直到cookie过期。
我的第二次尝试是在不存在时定义我自己的sessionStorage。看起来像这样:
function setStoreItem(name, val) {
this.storage[name] = val;
}
function getStoreItem(name) {
return(this.storage[name]);
}
function removeStoreItem(name) {
this.storage[name] = null;
}
function sesStorage() {
this.storage = new storageData();
this.setItem = setStoreItem;
this.getItem = getStoreItem;
this.removeItem = removeStoreItem;
}
// storage object type declaration
function storageData() {
}
// IE 7 and others
else {
window.sessionStorage = new sesStorage();
window.sessionStorage.setItem(code, code);
window.open("Sheet.aspx", "_blank");
}
但似乎真正的会话存储是特殊的,窗口的这个普通对象并没有在回发中保持活跃,因此当我的发布页面回发时,创建的页面标题列表被删除了。
所以现在我正在寻找一种方法来完成这项工作。我有一个名为scoresheets.aspx的启动页面,它根据用户请求创建动态页面。这些页面共享大量的javascript代码,可以对其进行修改以使其正常工作。
我不想在用户尝试重新打开它们时刷新已启动的页面,但如果有某种方法可以检测已打开页面的标题或某种其他方式使用window.opener与相同的持久性进行通信sessionStorage,我很乐意使用它。
答案 0 :(得分:3)
Eric Garside的jStore plugin为几个客户端存储引擎提供了基于jquery的api。
答案 1 :(得分:-1)
您应该使用该Cookie策略,并在窗口(标签)关闭时将这些Cookie设置为过期。这应该适用于各种浏览器。