Как я могу проверить наличие открытого URL в другом окне? - PullRequest
5 голосов
/ 09 февраля 2009

Это продолжение моего последнего вопроса Открыть окно, если окно еще не существует По сути, я сейчас держу список всех ссылок на окна, которые были открыты страницей, и разрешаю их открывать, только если они еще не открыты. Затем меня поразила потенциальная проблема - конечно, пользователь может закрыть исходное окно и открыть его снова, потеряв при этом список ссылок на окна.

Возможно ли зацикливаться на окнах, открытых в браузере, проверяя определенный URL?

Edit: После множества полезных комментариев здесь (и по другому вопросу), вот окончательный код для запуска приложения. По сути, он пытается получить местоположение открытого окна с соответствующим именем. Если это вызывает исключение (из-за проблемы конфиденциальности), то приложение считается загруженным. Если это «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 ]

4 голосов
/ 09 февраля 2009

Нет, это будет проблема безопасности / конфиденциальности.


Так как другие открыли хранилище состояния владения / cookie: это работает только в том случае, если вы являетесь тем же документом, который открыл окно, т. Е. В случае, когда пользователь закрывает окно и открывает снова, эти ссылки действительно теряются и даже если вы сохраните их, у вас не будет разрешения закрыть их)

2 голосов
/ 09 февраля 2009

Если вы дали каждому окну уникальное имя окна (второй аргумент window.open), повторный вызов window.open с тем же именем окна откроет окно, если оно закрыто, или вернет ссылку на существующее окно без открытие нового окна.

2 голосов
/ 09 февраля 2009

В JavaScript вы можете получить только ссылки на текущее окно и любые окна, которые вы открываете с помощью window.open.

Вы можете проверить winRef.closed, чтобы увидеть, закрыл ли пользователь окно. Я не уверен, хорошо ли это работает во всех браузерах или нет.

0 голосов
/ 09 февраля 2009

@ 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>
0 голосов
/ 09 февраля 2009

Установить массив и увеличивать его ссылками на окна при их открытии ...

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);
}

С наилучшими пожеланиями ...

0 голосов
/ 09 февраля 2009

Вы могли бы сделать это с печеньями , но ... если вы спросите меня, вы не сделаете это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...