Javascript-форум (https://javascript.ru/forum/)
-   Opera, Safari и др. (https://javascript.ru/forum/css-html-browser/)
-   -   Баг в Опере (select и onclick) (https://javascript.ru/forum/css-html-browser/34927-bag-v-opere-select-i-onclick.html)

Dimox 24.01.2013 20:43

Баг в Опере (select и onclick)
 
Обнаружил следующий баг в Опере (версия 12.12 на Windows 7 x64): если с клавиатуры менять select, то почему-то срабатывает событие onclick.

Живой пример можно увидеть здесь.

Реально ли как-то обойти этот баг?

devote 24.01.2013 21:02

странно, по твоей ссылке что ты дал, так и происходит, но этого нет например здесь:
Нажмите на клавиатуре стрелку вверх или вниз.<br /><br />

<select name="" id="select">
	<option value="">11111111111</option>
	<option value="">22222222222</option>
	<option value="" selected>33333333333</option>
	<option value="">44444444444</option>
	<option value="">55555555555</option>
</select>
<script type="text/javascript">
document.getElementById('select').focus();
document.onclick = function(e) {
    alert('Сработало событие onclick при изменении селекта!');
}
</script>

И так же не удалось это воспроизвести локально на компе.

Видимо на сайте http://codepen.io/ что-то явно модифицируется в коде.

devote 24.01.2013 21:06

и тут не воспроизводится: http://learn.javascript.ru/play/VSqSjc

Deff 24.01.2013 21:13

:) Если кликнуть на элементы рядом - тож срабатывает - чот замудрено

И фокус там как то лишний для чистоты эксперимента

devote 24.01.2013 21:17

Цитата:

Сообщение от Deff
Если кликнуть на элементы рядом - тож срабатывает - чот замудрено

ну оно и должно сработать, мы же событие на документ вешаем. В этом плане все Ок.

Цитата:

Сообщение от Deff
И фокус там как то лишний для чистоты эксперимента

это что бы после обновления страницы не ставить фокус к селекту. Что бы можно было сразу юзать стрелки. В этом и есть вся соль.

Но лично мне не удалось это воспроизвести локально. Это скорее не баг оперы, а баг той песочницы

Dimox 24.01.2013 21:31

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

Цитата:

и тут не воспроизводится: http://learn.javascript.ru/play/VSqSjc
У меня воспроизвелось.

Получается, что че-то не так в моей Опере.

Deff 24.01.2013 21:31

Цитата:

Сообщение от devote
не удалось это воспроизвести локально


http://hostjs-mybb2011.narod.ru/Dimox.htm

У меня срабатывает в Опере
Срабатывает если даж если document.getElementById('select').focus(); убрать и выставить фокус по таб и нажать вверх=вниз

Dimox 24.01.2013 21:37

Отключил все юзер-скрипты и расширения и перезагрузил Оперу - все равно бажит.

devote 24.01.2013 21:43

ну хз.. у меня не воспроизводится, вот Опера у меня ну и система:

Хотя опера пишет платформа win32

Deff 24.01.2013 21:52

devote,
У меня 32 ХP2 http://s3.uploads.ru/NmCFS.jpg

Dimox 24.01.2013 22:06

devote, у меня абсолютно то же данные. Win32 - это разрядность самой Оперы, а не Винды.

Deff, реально как-то обойти этот баг?

Deff 24.01.2013 22:07

Dimox,
Ну костыль мон приделать - ток смысл - может иначе построить ?

Dimox 24.01.2013 22:11

По-другому никак, document.onclick обязательно нужен.

Deff 24.01.2013 22:29

<!DOCTYPE HTML>
<html>
  <head> 
<style>
body{
 width:100%;
}
</style>

</head>
  <body style="padding-top:200px;width:100%;text-align:center">

<select name="" id="select">
	<option value="">11111111111</option>
	<option value="">22222222222</option>
	<option value="" selected>33333333333</option>
	<option value="">44444444444</option>
	<option value="">55555555555</option>
</select> 

<script>
document.getElementById('select').focus();
document.onclick = function(e) {if(Key){
    alert('Сработало событие onclick!');
}}


var Key = true;
document.getElementById('select').onchange = function() {
    Key = false; //Запрет onclick на время смены селекта
    setTimeout('Key = true',40)
}

</script>


  </body>
</html>

Dimox 24.01.2013 23:10

Большое спасибо!

devote 24.01.2013 23:51

Deff,
странный костыль, хотя можно было сделать проще:

<select name="" id="select">
    <option value="">11111111111</option>
    <option value="">22222222222</option>
    <option value="" selected>33333333333</option>
    <option value="">44444444444</option>
    <option value="">55555555555</option>
</select> 
 
<script>
document.onclick = function(e) {
    if ((e&&e.target||{}).nodeName !== "OPTION") {
        alert('Сработало событие onclick!');
    }
}
</script>

Deff 25.01.2013 00:07

devote,
Cам удивилсо - ксать проверил еще у трёх юзеров с ХР

Ксать если ставить тестовый контент внутрь нормальной сайтовой обёртки - эффекта не наблюдаю
(*Не голый тест
Вот сюда ставил http://designforum.bestff.ru/

devote 25.01.2013 00:08

а еще лучше так:
<select name="" id="select">
    <option value="">11111111111</option>
    <option value="">22222222222</option>
    <option value="" selected>33333333333</option>
    <option value="">44444444444</option>
    <option value="">55555555555</option>
</select> 
  
<script>
document.addEventListener && document.addEventListener('keydown', function(e) {
    if (e.target.nodeName === "SELECT") {
        e.target._keypressed = true;
    }
}, false);

document.onclick = function(e) {
    if ((e&&e.target||{}).nodeName === "OPTION" && e.target.parentNode._keypressed) {
      e.target.parentNode._keypressed = false;
      return;
    }

    alert('Сработало событие onclick!');
}
</script>

Deff 25.01.2013 00:16

devote,
Ксать тут костыль для «onresize» изобразил

http://habrahabr.ru/post/166321/

devote 25.01.2013 00:36

Цитата:

Сообщение от Deff
Ксать тут костыль для «onresize» изобразил

что-то тебя совсем заминусовали там(

Deff 25.01.2013 00:39

devote,
Да - я как то попутно выявил ,когда кроссдомен делал, а оне сразу - а зачем - нафига - я растерялся сперва


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