Заметки о вёрстке сайтов  ·  Александр Шуркаев об HTML, CSS и JavaScript (скрипты, справочники и примеры по сайтостроению)
Путь: Заметки о вёрстке сайтов  >  JavaScript  >  25

Открыл окно? Теперь закрой, дует.

19 декабря 2002 г.

Как правильно, юзабильно открывать popup-окна я уже писал. Теперь остановимся на том, как же их лучше всего закрывать.

Как правильно, юзабильно открывать popup-окна я уже писал. Теперь остановимся на том, как же их лучше всего закрывать.

Разумеется, пользователю не представляет труда просто закрыть окно, нажав на соответствующую кнопку вверху окна или же сочетанием клавиш Alt-F4 (для Windows систем). Однако чаще всего, в угоду пользователям, разработчики указывают на странице некую ссылку «закрыть окно».

Обычно, если новое окно было открыто с помощью JavaScript'а, пишется просто:

<a href="javascript:self.close()">закрыть окно</a>

Но тем самым мы нарушаем несколько условий — ссылки должны работать с отключённым JavaScript'ом и не должны сбивать с толку, если в текущее окно пользователь попал, например, с поисковой машины, минуя «родителя».

Поэтому я применяю обычно другой метод. Прежде всего, саму ссылку я называю, как правило, «вернуться в раздел» или же указываю в какой именно раздел (например, «вернуться в раздел „услуги“»).

В HTML коде ссылка выглядит так:

<a href="/services/" onClick="return g(this.href)">вернуться в&nbsp;раздел</a>

Как видите, при клике на ссылку вызывается функция g(this.href). Вот как она выглядит:

function g(url){
  if (opener){
    if (opener.closed)
      window.open(url, "");
    else if (opener.location.href.search(url) == -1)
      opener.location.href = url;
    self.close();
    return false;
  }
  return true;
}

Функция проверяет несколько условий. Во-первых, существует ли родительское окно (opener). Другими словами, было ли окно открыто через JavaScript или же обычным способом.

После этого, если родитель жив-здоров, смотрим, не закрыт ли он (opener.closed). Если да, то мы открываем ссылку в простом новом окне (window.open(url, "")). Ежели родитель открыт, мы делаем ещё одну проверку — не поменял ли он свой адрес, т. е. не переходил ли пользователь на другую страницу (opener.location.href.search(url) == -1).

В итоге, после всех вложенных проверок, мы закрываем дочернее окно (self.close()) и возвращаем false, если всё-таки окно было открыто JavaScript'ом, или же возвращаем true, и позволяем ссылке на раздел открыться в текущем окне.

Спасибо за внимание.

Хитовые статьи про разработку сайтов

Рассылка новостей и новых статей

Сообщения будут приходить пару раз в неделю, не чаще

Объявления

LiveInternet