Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 06.01.2013, 07:53
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

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>

Последний раз редактировалось dmitry111, 06.01.2013 в 20:25.
Ответить с цитированием
  #22 (permalink)  
Старый 06.01.2013, 19:40
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

док тайп е?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #23 (permalink)  
Старый 06.01.2013, 20:08
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

Сообщение от nerv_
док тайп е?
<!DOCTYPE HTML>
Ответить с цитированием
  #24 (permalink)  
Старый 17.01.2013, 08:51
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

Баг в 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 она анимированная

Последний раз редактировалось dmitry111, 17.01.2013 в 09:31.
Ответить с цитированием
  #25 (permalink)  
Старый 17.01.2013, 19:58
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от dmitry111
ie8 не хочет работать с which при событии onclick
ну так его (which) и нет в IE8 Когда-то написал такую штуку,
e.which = e.button !== 2 ? e.button >> 2 : 2;

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

Я тебе честно скажу: создал тему, чтобы запостить баг.
Но, немного поковырявшись в проблеме, понял, что дело не в браузере
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 17.01.2013 в 20:00.
Ответить с цитированием
  #26 (permalink)  
Старый 17.01.2013, 20:05
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

Сообщение от nerv_
ну так его (which) и нет в IE8 Когда-то написал такую штуку,
да нет, но я же там использовал фикс:

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


и с фиксом не работает
Ответить с цитированием
  #27 (permalink)  
Старый 17.01.2013, 20:13
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от dmitry111
и с фиксом не работает
значит фикс неверный. Открой IE, отладчик и посмотри. Все в твоих руках
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #28 (permalink)  
Старый 17.01.2013, 20:24
Аватар для dmitry111
Профессор
Отправить личное сообщение для dmitry111 Посмотреть профиль Найти все сообщения от dmitry111
 
Регистрация: 26.03.2012
Сообщений: 823

nerv_,

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

Проблема именно в onclick. Возможно в старых ie для этого события специально не предусмотрен e.which (e.button)
Ответить с цитированием
  #29 (permalink)  
Старый 06.02.2013, 22:12
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

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

Вроде правильно описал баг. Фичей не могу это назвать, бесит.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #30 (permalink)  
Старый 07.02.2013, 02:34
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Кстати, немного не в тему, но вижу что и 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-ей. Сорри если сорвал давно сорванные уже покровы.

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

Последний раз редактировалось danik.js, 07.02.2013 в 02:36.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрипт определения мобильных браузеров remkas Элементы интерфейса 0 25.10.2012 15:47
history браузеров d-kaktus Javascript под браузер 1 12.01.2012 00:31
Баги в форме добавления nemo Серверные языки и технологии 0 18.07.2010 13:35
Баги в сниппетах ответов Илья Кантор Сайт Javascript.ru 31 11.06.2009 17:58
feature request: FAQ hogart Сайт Javascript.ru 4 30.01.2009 11:53