Можно ли определить, открыл ли пользователь ссылку в новой вкладке? - PullRequest
30 голосов
/ 12 мая 2009

Если пользователь находится на вашем веб-сайте и открывает новую ссылку (также на ваш веб-сайт) в новой вкладке, можно ли отличить ее от пользователя, который просто щелкает ссылку обычно? Это может быть в javascript, на сервере, что угодно.

Я предполагаю, что ответ в том, что вы не можете сделать это, но я хотел перепроверить.

Ответы [ 7 ]

33 голосов
/ 12 мая 2009

Вы можете сделать это примерно так:

if (history.length == 1) {  // Um, needs to be 0 for IE, 1 for Firefox
    // This is a new window or a new tab.
}

Могут быть и другие способы для history.length быть 1, но я не знаю, какими они могут быть.

11 голосов
/ 12 мая 2009

В дополнение к history.length в JavaScript вы можете прочитать / написать имя окна.

Таким образом, если вы проверите, имеет ли оно имя onload ..., оно должно быть пустым при самой первой загрузке ... если затем вы установите его в "foo" ... при каждой последующей загрузке в этом окне ... свойство window.name будет возвращать "foo" ... если вы не откроете ссылку в новой вкладке / окне ... в этом новом окне не должно быть задано имя.

(если, конечно, вы не открываете всплывающее окно с помощью window.open (URL, имя, функции); которое позволяет предварительно установить имя)

<script>
 if(window.name == ''){
   //first load (or Nth load in a new Tab/Window)
   if(!SOME_VALUE_SET_FOR_2ND_TO_NTH_LOADS){
     //set name so we can catch new Tab/Window
     window.name = 'myWinName';
   } else {
     //we have a new Tab/Window (or something funky)
     alert('What?! One window not cool enough for ya?\n' +
       'Calling the InterWeb Police!');
   }
 } else if(window.name == 'myWinName'){
   //2nd-Nth load
   document.title = 'All is well... we think';
 }
</script>

Предостережения:

  • Если ваша страница изначально загружена в окне / фрейме, у которого уже есть имя ... все будет странно
  • Если на вашей странице есть (именованные) iframes, и у вас есть ссылки, предназначенные для этих iframes, в IE7 / 8 есть ошибка, из-за которой, когда пользователь открывает эти ссылки в новой вкладке / окне, новая вкладка / окно будет " унаследовать "имя iframe, который был изначально нацелен (очень большая ошибка ODD, исправления не ожидается)
6 голосов
/ 03 декабря 2012

Это то, что я использую в ASP.NET MVC, чтобы запретить аутентифицированным пользователям открывать несколько вкладок:

<script language="javascript" type="text/javascript">
    @if(Request.IsAuthenticated)
    {
        <text>
        if (window.name != 'singleWindow') {
            window.location.href = "Content/ErrorPages/SingleTab.htm";
        } 
        </text>
    }
    else
    {
        <text>
        window.name = "singleWindow";
        </text>
    }
</script>

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

Две проблемы:

  • не работает, если JavaScript отключен
  • если по ошибке пользователь закрывает исходную вкладку, а затем вставляет какую-то другую ссылку на мой сайт в адресную строку, пользователь всегда получит страницу с ошибкой. Чтобы дать пользователю возможность восстановиться, я включил ссылку «Выйти» на странице SingleTab.htm, чтобы пользователь мог уничтожить свой файл cookie сеанса и начать новый сеанс.
3 голосов
/ 12 мая 2009

Свойство window.opener в JavaScript будет указывать на окно, открывшее новое окно. Однако он не различает новое окно и новую вкладку. Вкладки не являются частью официальной спецификации W3C, поэтому прямой поддержки для них нет.

2 голосов
/ 12 мая 2009

Краткий ответ: нет. Длинный ответ таков: если вы выполняете вызов ajaxy со своих страниц к серверным методам, это может сохранить открытость окон (вызванную в течение короткого периода времени). Это был бы небрежный, ненадежный беспорядок, и вы не могли бы различить новое окно или вкладку в этом отношении.

0 голосов
/ 12 мая 2009

Это поведение клиента, поэтому я думаю, что вы могли бы что-то сделать с javascript, например, проверить историю браузера, но это неоднозначно между новой вкладкой и новыми окнами.

Кроме того, не во всех браузерах есть вкладки, и не все браузеры имеют одинаковое значение для вкладки (в некоторых это разные процессы, в других - нет).

Но зачем вам это проверять? Это действительно имеет значение, если ваше приложение выполняется в новой вкладке или нет? Я так не думаю ...

0 голосов
/ 12 мая 2009

Я действительно так не думаю. Насколько мне известно, наиболее близким является отслеживание событий нажатия клавиш и щелчка мыши, чтобы попытаться сопоставить действия с общими методами открытия ссылок на новых вкладках. (т. е. если они удерживают Command, когда щелкают или щелкают по среднему значению, это, вероятно, новая вкладка). Это не будет надежным, так как любая из этих привязок может быть изменена.

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