Подтвердить что ты не робот

Можно ли определить, открыл ли пользователь ссылку на новой вкладке?

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

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

4b9b3361

Ответ 1

Вы можете сделать это следующим образом:

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, но я не знаю, что они могут быть.

Ответ 2

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

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

(если, конечно, вы не открываете всплывающее окно через window.open(url, name, features), который позволяет предварительно установить имя)

<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, и у вас есть ссылки, нацеленные на эти фреймы, в IE7/8 появляется ошибка, при которой пользователь открывает эти ссылки в новой вкладке/окне, новая вкладка/окно будет "inherit" имя iframe, которое было первоначально нацелено (очень ошибка ODD без каких-либо исправлений, ожидаемых)

Ответ 3

Это то, что я использую в 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 сеанса и начать новый сеанс.

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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