Как я могу проверить наличие открытого URL в другом окне?
Это продолжение моего последнего вопроса. Откройте окно, если окно еще не существует. По сути, я сейчас держу список всех ссылок на окна, которые были открыты страницей, и разрешаю их открывать, только если они еще не открыт. Затем меня поразила потенциальная проблема - конечно, пользователь может закрыть исходное окно и открыть его снова, потеряв при этом список ссылок на окна.
Можно ли циклически просматривать окна, открытые в браузере, проверяя определенный URL?
Изменить: После множества полезных комментариев здесь (и по другому вопросу), вот окончательный код для запуска приложения. По сути, он пытается получить местоположение открытого окна с соответствующим именем. Если это вызывает исключение (из-за проблемы конфиденциальности), то приложение считается загруженным. Если это "about:blank", то это новое окно. Это работает на Firefox, IE7 и Google Chrome. Это грязно...
var g_urlarray = [];
Array.prototype.has = function(value) {
var i;
for (var i in this) {
if (i === value) {
return true;
}
}
return false;
};
function launchApplication(l_url, l_windowName)
{
var l_width = screen.availWidth;
var l_height = screen.availHeight;
var winRef;
var l_params = 'status=1' +
',resizable=1' +
',scrollbars=1' +
',width=' + l_width +
',height=' + l_height +
',left=0' +
',top=0';
if (g_urlarray.has(l_url)) {
winRef = g_urlarray[l_url];
}
if (winRef == null || winRef.closed) {
winRef = window.open('', l_windowName, l_params);
var l_openNew = 0;
try {
if (winRef.location == 'about:blank') {
l_openNew = 1;
}
}
catch (e) {
l_openNew = 0;
}
if (l_openNew === 1)
{
winRef.location = l_url;
winRef.moveTo(0,0);
winRef.resizeTo(l_width, l_height);
}
g_urlarray[l_url] = winRef;
}
}
6 ответов
@annakata (и даже если вы сохраните их, у вас не будет разрешения закрыть их)
Не правда. Если у вас есть имя окна, вы можете использовать window.open, чтобы восстановить ссылку на окно, даже если открыватель был закрыт и снова открыт. Например:
<script>
function winOpen(url){
return window.open(url,getWinName(url));
}
function winClose(url){
var win = window.open("",getWinName(url));
win.close();
}
function getWinName(url){
return "win" + url.replace(/[^A-Za-z0-9\-\_]*/g,"");
}
</script>
<a href="#" onclick="winOpen('http://google.com');return false;">Click me first</a>, close and open this window, then
<a href="#" onclick="winClose('http://google.com');return false;">click me to close the other window</a>
Нет, это будет проблема безопасности / конфиденциальности.
Так как другие открыли хранилище состояния владения /cookie: это работает только в том случае, если вы также являетесь тем же документом, который открыл окно, т. Е. В сценарии, когда пользователь закрывает окно и открывает снова, эти ссылки действительно теряются (и даже если вы сохранили их, у вас не будет разрешения закрыть их больше)
Если вы дали каждому окну уникальное имя окна (второй аргумент window.open), повторный вызов window.open с тем же именем окна либо откроет окно, если оно закрыто, либо вернет ссылку на существующее окно без открытия нового окно.
В JavaScript вы можете получить только ссылки на текущее окно и любые окна, которые вы открываете window.open
,
Вы можете проверить winRef.closed
чтобы увидеть, закрыл ли пользователь окно. Я не уверен, хорошо ли это работает во всех браузерах или нет.
Вы могли бы сделать это с помощью куки, но... если вы спросите меня, вы не будете делать это.
Настройте массив и увеличьте его ссылками на окна при их открытии...
var wins = new Array();
function openWindow(url) {
wins.push(window.open(url));
}
Затем, когда вы захотите проверить состояние окон, вы можете просмотреть их, как показано ниже, и удалить окна, которые не открылись...
function updateWindowArray() {
for(var i = 0, l = wins.length; i < l; i++) {
if(wins[i] == null || wins[i].closed)
arrayRemove(wins, i, i + 1);
}
}
function arrayRemove(array, from, to) {
var rest = array.slice((to || from) + 1 || array.length);
array.length = from < 0 ? array.length + from : from;
return array.push.apply(array, rest);
}
С наилучшими пожеланиями...