Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   FAQ Баги браузеров. (https://javascript.ru/forum/offtopic/33616-faq-bagi-brauzerov.html)

dmitry111 06.01.2013 07:53

ie8 не хочет работать с which при событии onclick

Вот этот :
fixEvent = function (e) {
    e = e || window.event;

    if (!e.which && e.button) {
        e.which = e.button & 1 ? 1 : ( e.button & 2 ? 3 : (e.button & 4 ? 2 : 0) );
    }
    return e;
}

.. или этот пример:
function fixWhich(e) {
  if (!e.which && e.button) { // если which нет, но есть button...
    if (e.button & 1) e.which = 1;      // левая кнопка
    else if (e.button & 4) e.which = 2; // средняя кнопка
    else if (e.button & 2) e.which = 3; // правая кнопка
  }
}


не работают в IE8

e.which при нажатие на левую клавишу выдает undefined, на правую - не реагирует никак


Зато e.button при нажатие на левую клавишу выдает 0 !



Пример:

<!DOCTYPE HTML>
<html>
  <head> </head>
  <body>
    
    <input type="button" id="a" value="сработает в ie8">
    <input type="button" id="b" value="не сработает в ie8">

    <script>
      var a = document.getElementById("a"),
          b = document.getElementById("b"),
          fixEvent = function (e) {
			e = e || window.event;
			if (!e.which && e.button) {
				e.which = e.button & 1 ? 1 : ( e.button & 2 ? 3 : (e.button & 4 ? 2 : 0) );
			}
            return e;
          };
      
		a.onmousedown = function (e) {
			e = fixEvent(e);
        
			if (e.which !== 1) {
				return;
            }
        
			alert("привет мир");
		}
      
		b.onclick = function (e) {
			e = fixEvent(e);
        
			if (e.which !== 1) {
				return; // e.which в ie8 на левую клавишу мыши выдаст undefined
            }
        
			alert("привет мир");
		}
    </script>

  </body>
</html>

nerv_ 06.01.2013 19:40

док тайп е?

dmitry111 06.01.2013 20:08

Цитата:

Сообщение от nerv_
док тайп е?

<!DOCTYPE HTML>

dmitry111 17.01.2013 08:51

Баг в Firefox (v18.0 , os x) c CSS-свойствами:

Некорректно работает transition когда:
- появляется правило у элемента, которое нельзя сделать переходным
- элемент имеет position:fixed..

Пример:
Есть группа элементов со свойством transition.
body, #a, #b, #x, #y {
	-webkit-transition: all .1s;
	-ms-transition: all .1s;
	-o-transition: all .1s;
	-moz-transition: all .1s;
	transition: all .1s;
}

Некоторые из этих элементов имеют position: fixed (это одна из причин бага)!

Эти элементы, получают класс со свойствами, которые можно плавно изменить (margin, left).
Но одновременно с этим body получает свойство overflow c значением hidden (св-во может быть любое, главное - которое нельзя плавно изменить)


Результат: плавный переход не срабатывает в firefox


Решение проблемы:
1. Можно задать небольшой интервал для назначения неизменяемого св-ва для body:
window.setTimeout(function () {
    document.body.style.overflow = "hidden";
}, 1);


2. Убрать у элементов, которые участвуют в плавном переходе, position: fixed


Суть бага мне еще до конца не ясна((

Демо бага http://test.hnoe.ru/
В левой части браузера вкладка, во всех браузерах кроме firefox она анимированная

nerv_ 17.01.2013 19:58

Цитата:

Сообщение от dmitry111
ie8 не хочет работать с which при событии onclick

ну так его (which) и нет в IE8 :) Когда-то написал такую штуку,
e.which = e.button !== 2 ? e.button >> 2 : 2;

но сейчас уже не уверен, что она работает...

Я тебе честно скажу: создал тему, чтобы запостить баг.
Но, немного поковырявшись в проблеме, понял, что дело не в браузере :no:

dmitry111 17.01.2013 20:05

Цитата:

Сообщение от nerv_
ну так его (which) и нет в IE8 Когда-то написал такую штуку,

да нет, но я же там использовал фикс:

if (!e.which && e.button) {
    e.which = e.button & 1 ? 1 : ( e.button & 2 ? 3 : (e.button & 4 ? 2 : 0) );
}


и с фиксом не работает

nerv_ 17.01.2013 20:13

Цитата:

Сообщение от dmitry111
и с фиксом не работает

значит фикс неверный. Открой IE, отладчик и посмотри. Все в твоих руках :)

dmitry111 17.01.2013 20:24

nerv_,

фикс верный, проверял в отладчике, и тем более он работает с mousedown!

Проблема именно в onclick. Возможно в старых ie для этого события специально не предусмотрен e.which (e.button)

Gozar 06.02.2013 22:12

FF18 неправильно обрабатывает у блока text-align:left(устанавливает его в justify) если у списка элементов внутри блока есть :first-letter.

Вроде правильно описал баг. Фичей не могу это назвать, бесит.

danik.js 07.02.2013 02:34

Кстати, немного не в тему, но вижу что и dmitry111, и nerv_, предложили какие то непонятные решения для определения e.button.
Вот что используется в одной библиотечке (это фикс значения e.button):
if (e.preventDefault) {
    return e.button;
}
// old IE
else {
    return {1:0, 2:2, 4:1}[e.button];
}


Помоему очень наглядно и лично я поразился простоте и необычности решения. Думаю этот прием можно кое-где где использовать для замены if-ов и switch-ей. Сорри если сорвал давно сорванные уже покровы.

Да, я вкурсе, идея использовать объект в роли ассоциативного массива не очень нова, но вот использовать объект без объявления перменной в таком вот виде не всегда в голову прийдет.


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