Обнаружение закрытой вкладки в базовом приложении

Есть ли способ в jQuery, чтобы я мог обнаружить закрытую вкладку в моем базовом приложении и заставить ее обновить страницу?

Я построил систему продажи билетов. Когда вы нажимаете на билет, он использует target="_blank", чтобы открыть билет в новой вкладке. Когда вы обновляете заявку (и только когда вы это делаете), а затем нажимаете ссылку «Закрыть вкладку», я бы хотел, чтобы основное приложение (предыдущая вкладка) распознавало это событие и автоматически обновляло страницу.

Я знаю, что могу использовать window.open(), а затем обнаруживать закрытый дескриптор в цикле, но это неэлегантно, потому что в IE иногда он не открывается в новой вкладке, а вместо этого открывает новое окно. С target="_blank", кажется, я вижу, что IE открывает новую вкладку. Я предпочитаю вкладки.


person Volomike    schedule 06.07.2012    source источник
comment
Разве мы не можем использовать для этого обратный ajax, например комету?   -  person bhuvin    schedule 06.07.2012


Ответы (2)


Если вы используете window.open, вы также можете использовать window.opener и window.onbeforeunload. Единственным недостатком является то, что вы не получаете вкладки. Но таким образом вам не нужен цикл.

Так, например:

главный экран:

  • событие клика: window.open(/* открыть окно */);

экран билета:

  • Событие загрузки: вы привязываете перезагрузку, когда onbeforeunload срабатывает на window.opener
person jeffreydev    schedule 06.07.2012
comment
Да, я знал об этом, но, как я уже упоминал, это было неэлегантно и нежелательно, потому что не использовало вкладки. Хотел бы я знать что-то, что последовательно работает с вкладками. - person Volomike; 08.07.2012

Итак, у нас есть родительская вкладка с таблицей билетов, а затем дочерняя вкладка, где у нас есть фактический билет. Однако это не совсем отношения родитель/потомок, потому что я использую клики target="_blank" вместо событий window.open().

Исправление хлипкое, но работает. Изменения нужно только добавить на вкладку «родительская». Во-первых, добавьте глобальное логическое значение gbRefreshStale в Javascript на страницу и установите его значение равным 0 следующим образом:

var gbRefreshStale = 0;

Во-вторых, при каждом клике target="_blank" перехватывайте с помощью jQuery так:

$('A[target=_blank]').click(function(){
  setTimeout('gbRefreshStale=1;clearTimeout();',500);
  return true;
});

Затем, в-третьих, вам понадобится это событие mouseenter для заголовка страницы:

$('#header').mouseenter(function(){ 
  // assuming you called your banner/header as #header
  if (gbRefreshStale) {
    gbRefreshStale = 0;
    location.href = location.href;
  }
});

Эффект здесь заключается в том, что для заявки открывается новая вкладка, но если кто-то закроет эту вкладку и проведет мышью по заголовку (что он, вероятно, сделает, поскольку только что закрыл дочернюю вкладку), родительская вкладка обновится. Это также работает, если открыто и закрыто несколько вкладок, и эта система предотвращает циклическое обновление родительской вкладки. Тайм-аут необходим, потому что в противном случае чья-то мышь может пересечь раздел #header родителя до того, как эта вкладка откроется.

person Volomike    schedule 08.07.2012