Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как узнать на вкладке ли пользователь? (https://javascript.ru/forum/misc/42138-kak-uznat-na-vkladke-li-polzovatel.html)

natureproj 14.10.2013 17:24

как узнать на вкладке ли пользователь? *(РЕШЕНО!)
 
Доброго времени суток, такой вопрос:
Как узнать, находится ли пользователь на данной странице, вкладке. Менять код самой странице нельзя при том, только через JS .
пробую так:
window.onblur = function () {
document.title='документ неактивен';
}
window.onfocus = function () {
document.title='документ снова активен';
}
onblur работает отлично, а onfocus активизируется только в том случае, если кликнуть по сайту.
Пожалуйста, помогите в проблемкой. Всем ответившим +

BETEPAH 14.10.2013 17:40

У меня вот так работает:
// Проверка активна ли в настоящий момент вкладка браузера
var isActive = true;
function onBlur() { // окно теряет фокус
	isActive = false;
// что-то делаем
}
function onFocus() {// окно получает фокус
	isActive = true;
// что-то делаем
}
if (/*@cc_on!@*/false) { // для Internet Explorer
	document.onfocusin = onFocus;
	document.onfocusout = onBlur;
} else {
	window.onfocus = onFocus;
	window.onblur = onBlur;
}

natureproj 14.10.2013 19:18

И что? То же самое! Активируется только после клика

natureproj 14.10.2013 19:20

а некоторым сайтам и клика мало! Обязательно, чтобы с другой вкладки переключение было. А если напрямую перейти и лазить по сайту, то будет не активно!
Может как-то отследить движение мыши на поле сайта? (обязательно чтобы страницу сайта не меняя!)

BETEPAH 14.10.2013 19:26

Цитата:

Сообщение от natureproj
а некоторым сайтам и клика мало!

каким таким некоторым сайтам? Меня терзают смутные сомнения :)
Цитата:

Сообщение от natureproj
Обязательно, чтобы с другой вкладки переключение было. А если напрямую и лазить по сайту, то будет не активно!

А если напрямую и лазить по сайту, то для этого я и сделал параметр isActive, который показывает активна ли вкладка в текущий момент.
Код, который я привел, работает на реальном проекте уже более года. При получении вкладкой фокуса (без кликов по странице) скрипт отрабатывает своё дело (в моем случае - это чат - выключается звук сообщений и перемещается указатель последнего прочитанного сообщения)

danik.js 14.10.2013 19:42

Есть же page visibility API, правда только в относительно новых браузерах.

natureproj 14.10.2013 23:13

Цитата:

Сообщение от danik.js (Сообщение 276446)
Есть же page visibility API, правда только в относительно новых браузерах.

Там нужно библиотеку подключить. Чтобы в моём случае это сделать, то придется на каждый сайт, на который заходит пользователь, добавлять в код страницы подключение библиотеки. Не совсем подходит


Ветеран, толи я что-то не понимаю, но при открытии страницы запускается функция onBlur() и соответственно isActive = false;
Далее я это использовать не могу

BETEPAH 15.10.2013 08:38

Цитата:

Сообщение от natureproj
Ветеран, толи я что-то не понимаю, но при открытии страницы запускается функция onBlur()

Странные у вас страницы. С какой стати им при открытии запускать onBlur? Толи вы что-то не понимаете.
Цитата:

Сообщение от natureproj
Далее я это использовать не могу

ОКей. Айм со сорри.

danik.js 15.10.2013 09:36

Цитата:

Сообщение от natureproj
Там нужно библиотеку подключить

Какую?

natureproj 15.10.2013 14:50

Цитата:

Сообщение от BETEPAH (Сообщение 276503)
Странные у вас страницы. С какой стати им при открытии запускать onBlur? Толи вы что-то не понимаете.

ОКей. Айм со сорри.

Да, сейчас проверил - гуд работает. В пролый раз почему-то онБлур сразу запускалась. Спасибо за помощь

Но теперь такая проблема: при открытии страницы в новой вкладке, время на ней начинает считаться. А этого быть не должно. Как отследить, что страница была открыта именно в новой вкладке и по факту её еще не открывали для просмотра?

natureproj 22.10.2013 02:05

Но теперь такая проблема: при открытии страницы в новой вкладке, время на ней начинает считаться. А этого быть не должно. Как отследить, что страница была открыта именно в новой вкладке и по факту её еще не открывали для просмотра?

BETEPAH 22.10.2013 10:58

Цитата:

Сообщение от natureproj
время на ней начинает считаться

какое такое время? Может давайте не на кофейной гуще гадать, а на неправильно работающем коде? Ссылку можно?

natureproj 22.10.2013 14:25

Вот весь код:
var isActive = true;

function onBlur() { // окно теряет фокус
    isActive = false;
	chrome.runtime.sendMessage({site:sait,time:localStorage[sait]});
	localStorage[sait] = '0';	
}
function onFocus() {// окно получает фокус
    isActive = true;
}
    window.onbeforeunload = onBlur;
    window.onfocus = onFocus;
    window.onblur = onBlur;
	function sec() //выполняется каждую секунду
	{ 
	    if (isActive)//если страница активна
	    {
			localStorage[sait] =  parseInt(localStorage[sait],10) +1;
		}
	}			 	
var sait=location.hostname;
localStorage[sait] = '0';
	setInterval(sec, 1000);// использовать функцию

natureproj 22.10.2013 14:28

Скрипт считает время, проведенное на сайте. По начальным условиям isActive = true; По этому и начинается сразу отсчет, даже если страница открыта в новой складке. Если по умолчанию сделать isActive = false; то время не будет считаться, ока не кликнешь на саму страницу, а это тоже не подходит

danik.js 22.10.2013 14:54

У упоротых, простите, упорных людей порой такое бывает - задача становится нерешаемой из-за придуманных проблем.

natureproj 22.10.2013 16:43

Я не понял, где придуманная проблема?

danik.js 22.10.2013 17:26

Цитата:

Сообщение от natureproj
Там нужно библиотеку подключить.

Цитата:

Сообщение от natureproj
Не совсем подходит

Цитата:

Сообщение от danik.js
Какую?

Ну тебе видней то, правда? Тыж профи.

natureproj 22.10.2013 20:29

бля, реально. Просто открыл почитать про page visibility API и на хабре нашел, что нужно библиотеку подрубать. Сейчас покопал, ввел строчку
if(document.webkitVisibilityState == 'visible')//если страница активна
	    {
			localStorage[sait] =  parseInt(localStorage[sait],10) +1;
		}

И все проблемы решились=)
На видео тоже время стало считаться!
Спасибо за помощь


Часовой пояс GMT +3, время: 17:10.