Проверка состояния всплывающего окна

#javascript

#javascript

Вопрос:

Когда кто-то запрашивает чат, запись вносится в базу данных. У меня есть скрытый iframe на нашей панели мониторинга, который проверяет базу данных каждые 20 секунд, чтобы увидеть, есть ли чат, и если есть, он запускает всплывающее окно. Даже если всплывающее окно открыто, iframe по-прежнему обновляет всплывающее окно каждые 20 секунд. То, чего я пытаюсь достичь, — это javascript для проверки статуса всплывающего окна. Если оно закрыто, я хочу, чтобы оно снова открылось … если оно открыто, то оно фокусируется на нем… но я не хочу, чтобы всплывающее окно обновлялось .. поскольку у меня есть ajax-скрипт, делающий это..

Вот мой код:

 <script language="javascript" type="text/javascript">
function myOpenWindow(winURL, winName, winFeatures, winObj)
{
     var theWin;
     if (winObj != null)
     {
          if (!winObj.closed)
          {
               winObj.focus();
               return winObj;
          }
     }
     else
     {
          theWin = window.open(winURL, winName, winFeatures);
          return theWin;
     }
} 
</script>
<% IF ChatSessionID <> "" THEN %>
<script language="javascript" type="text/javascript">
var gmyWin = null;
window.onload = function()
{
     var w = 900;
     var h = 500;
     var l = (screen.width-w)/2;
     var t = (screen.height-h)/2;
     var params = 'status=0,resizable=0,scrollbars=0,width='   w   ',height='   h   ',left='   l   ',top='   t;
     gmyWin = myOpenWindow("/chat/chat_window.asp?ChatSession=<%=ChatSessionID%>amp;id=3", "myWin", params, gmyWin)
}
</script>
<% END IF %>
  

Мы будем признательны за любую помощь, которую вы могли бы предоставить..

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

Комментарии:

1. window.closed — это нестандартное свойство, которое может работать, а может и не работать во всех браузерах.

Ответ №1:

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

Редактировать

Ах, вот так — из window.open:

Если окно с именем strWindowName уже существует, то вместо открытия нового окна strUrl загружается в существующее окно. В этом случае возвращаемым значением метода является существующее окно, а strWindowFeatures игнорируется. Предоставление пустой строки для strUrl — это способ получить ссылку на открытое окно по его имени без изменения местоположения окна. Если вы хотите открывать новое окно при каждом вызове window.open(), вам следует использовать специальное значение _blank для strWindowName.

Я полагаю, что в соответствии с вышеупомянутыми спецификациями это может сработать:

 var hChatWindow = window.open("", "ChatWindow", "whatever features"); // url intentionally left blank
// hChatWindow now contains a reference to new, existing or re-opened window
hChatWindow.focus();
if (hChatWindow.location=="about:blank") {                            // not sure; you need to experiment here
    hChatWindow.location = "/chat/chat_window.asp?whatever";
}
  

Демо здесь, источник здесь.

Комментарии:

1. Выглядит логично.. Как бы это вписалось в мою существующую структуру ..? поскольку мои знания javascript довольно шаткие..

2. Я добавил демо-версию. Посмотрите, сможете ли вы заставить его работать в соответствии с вашими потребностями.

3. @Aviral: извини, приятель, я был в процессе редактирования своего поста и испугался, когда SO сказал мне, что сообщение отредактировано. Я добавил URL в window.откройте документацию снова.

4. Этот метод сработал после небольшого экспериментирования. Мне пришлось поместить основной скрипт в родительское окно, чтобы убедиться, что он работает правильно… Большое спасибо за вашу помощь.. Один для вас!

Ответ №2:

Зарегистрируйте обратный вызов на gmyWin.onunload .

Ответ №3:

Вам будет сложно отключить «блокировать всплывающие окна» в большинстве браузеров. Однако, если оно отключено, будет работать следующее.

Главное окно:

 var status = false;

function winOpen(){
    window.open("child.html");
}

function winStatus(){
    alert(status);
}
  

Всплывающее окно:

 window.opener.status = true;

window.onblur = window.focus;

window.onunload = function(){
    window.opener.status = false;
};