Javascript-форум (https://javascript.ru/forum/)
-   Internet Explorer (https://javascript.ru/forum/css-html-internet-explorer/)
-   -   События window.onfocus и window.onblur в ИЕ (https://javascript.ru/forum/css-html-internet-explorer/15696-sobytiya-window-onfocus-i-window-onblur-v-ie.html)

FINoM 10.03.2011 01:24

События window.onfocus и window.onblur в ИЕ
 
Сделал очень простое приложение, работающее ивентами нажатия на клавиши. Известно, что события будут работать только когда окно браузера находится в фокусе. Для того чтоб пользователю было понятно, находится ли окно в фокусе, я просто меняю фон боди:
window.onfocus = function(){
				alert('focus');
				document.body.style.backgroundColor = '#fff';
			}
			window.onblur = function(){
				alert('blur');
				document.body.style.backgroundColor = '#ccc';
			}
В рабочем скрипте алертов конечно же нету.
Скрипт работает прекрасно везде, кроме ИЕ. В нормальных браузерах при потере фокуса выдается сообщение 'blur', при получении фокуса выдается 'focus' (К.О.). ИЕ 8 при потере фокуса ничегошеньки не показывает, но при получении выдаются оба сообщения в таком порядке: 'focus', 'blur' (и цвет боди остается серым). Что за №;"!*?

Gvozd 10.03.2011 01:35

Цитата:

Сообщение от FINoM
В рабочем скрипте алертов конечно же нету.

ну, так уберите их.
из-за алертов, в нормальных браузерах скрипт не работает нормально
и, в ИЕ, он без алертов работает правильно.
укажите для начала хотя бы версию ИЕ

FINoM 10.03.2011 02:50

Алертов еще не было, проблема уже существовала. Для убедительности снова убрал алерты, та же фигня.
Цитата:

Сообщение от Gvozd
укажите для начала хотя бы версию ИЕ

IE8 под Win7

Gvozd 10.03.2011 02:56

Цитата:

Сообщение от FINoM
IE8 под Win7

IE8 под XP работает нормально
завтра проверю IE8 под Win7

FINoM 10.03.2011 03:21

Цитата:

Сообщение от Gvozd
завтра проверю IE8 под Win7

Ок, спасибо.

Gvozd 10.03.2011 21:43

проверил
все отлично работает, если закоментировать alert-ы

poorking 11.03.2011 00:29

FINoM,
у меня возникала проблема с key событиями в IE, в IE (только на 8 проверял) они вешаются не на window, а на window.document, прошу прощения если выступил в роли К.О. Просто подумал что вы проверяете на клавишах, может по этому не получается.
Интересная идея, если вы так реализовываете отлючение управления, я обработчики удалял

UPD IE8 под Win7 у меня тоже не работает даже без алертов, абсолютно такая же ситуация, но если просто вызывать при загрузке window.focus() то все срабатывает нормально

FINoM 11.03.2011 01:25

Цитата:

Сообщение от Gvozd
все отлично работает, если закоментировать alert-ы

Проверь плиз здесь: http://dev.odessite.com.ua/ag/stopwatch/

poorking 11.03.2011 02:44

FINoM,
Ваша страничка также не работает у меня под win7x64 HP ie8, автоматические обновления, уж не знаю что еще может внести отличия в эти ie


Заодно расскажу какое я провел наблюдение.
И при упоминании IE имеется ввиду мой IE8 (раз, как выяснилось, работает отлично от вашего:blink: ) А возможно, и не только IE, вдруг у меня с системой что-то.

При загрузке страницы файрфокс и IE автоматом делают window.focus(), если самому позвать window.focus(), хром, сафари и опера все равно не сделают.

IE при блуре ничего не делает, но при фокусе делает фокус и тут же блур, но не всегда, когда раз 10 тыкнешь в окно, на рабочий стол, в окно и т.д., то начинает работать нормально :blink:

Сафари при фокусе делает фокус 2 раза.

Если в обработчиках onfocus и onbur вызывать window.focus() и window.blur() соответственно, первой строкой кода, то происходят вообще странные вещи, хотя и код будет выглядеть не менее странно. В файрфоксе, опере, хроме и сафари все работает так же, в IE эта строка выполняется, но судя по результату, после того как произойдет то, что он делает без этой строки, то бишь при фокусе произойдет фокус-блур-фокус, при блуре наоборот. Если нужно только менять стили, то можно так сделать, во всех этих браузерах выглядит правильно, но если нужно что то кроме этого делать, то естественно не подходит, т.к. обработчики выполняются по несколько раз в некоторых случаях

Тестировал на этом
<!DOCTYPE html>
<script type ="text/javascript">
	window.onload = function(){	
		var i = 0;
		var blurc = document.getElementById("blurc");
		var focusc = document.getElementById("focusc");
	
		//var win = window/* @cc_on.document */;
		//var body = document.documentElement || document.body;
		
		window.onblur = function(){			
			//window.blur();
			document.body.style.backgroundColor = "red";
			
			blurc.innerHTML += "был blur"+ ++i +"!<br />";
			
			return false;
		}
		
		window.onfocus = function(){
			//window.focus();
			document.body.style.backgroundColor = "green";
			
			focusc.innerHTML += "был focus"+ ++i +"!<br />";
			return false;
		}
		
		//window.focus();
	}
	
	
</script>
<style type = "text/css">
	.col{
		display: inline-block;
		vertical-align: top;
	}
</style>

<div class = "col" id = "focusc"></div>
<div class = "col" id = "blurc"></div>

Возможно я тут ошибку допустил, конечно.

Gvozd 11.03.2011 04:01

Цитата:

Сообщение от FINoM
Проверь плиз здесь: http://dev.odessite.com.ua/ag/stopwatch/

а эта ссылка у меня не пашет как надо, и под XP
вывод: проблема в другом


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