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