2014-12-28 2 views
0

Использование хром 39 (для Mac) следующий не работаетMouseOut и MouseOver события не стрельбы должным образом в хроме 39

<div id='canvasWrapper'> 
    <canvas id='main0'></canvas> 
    <canvas id='main1'></canvas> 
    <canvas id='main2'></canvas> 
    <div id='mainToolbar'> 
     <img src='magnify.png'> 
     <img src='pencil.png'> 
     <img src='plus.png'> 
     <img src='ex.png'> 
    </div> 
</div> 
<script> 
    var wrap = document.getElementById('canvasWrapper'); 
    wrap.addEventListener('mouseover', function(){ 
     document.getElementById('mainToolbar').style.display = 'block'; 
    }) 
    wrap.addEventListener('mouseout', function(){ 
     document.getElementById('mainToolbar').style.display = 'none'; 
    }) 
    var imgs = [].slice.call(document.querySelectorAll('img')); 
    imgs.forEach(function(img) { 
     img.addEventListener('mouseover', function() { 
      var string = img.className; 
      string += ' inverted'; 
      img.className = string; 
     }) 
     img.addEventListener('mouseout', function() { 
      var string = img.className.split(' ').filter(function(classy) { 
       return classy != 'inverted'; 
      }).join(' '); 
      img.className = string; 
     }) 
    }) 
</script> 

панели инструментов с иконками должен показать, когда пользователь наводит мышь на холст, содержащий DIV, спрячьтесь на мыши. С изображениями мышь над ними добавляет класс, который содержит свойство css filter, чтобы инвертировать цвета. Все это работает точно так, как ожидалось, в Safari 7.1 и даже на FF 28. Однако в хроме события срабатывают только при нажатии на или вне div canvasWrapper. Установка функции на onmouseover свойства div не имеет значения по сравнению с addEventListener. Если это известная ошибка в хроме 35+ минут поиска в Google, она не дала результатов. Кто-нибудь знает, почему и как это исправить?

PS, не уверен, что его релевантные или нет, но холсты являются слоями: все они имеют одинаковый размер и перекрываются точно. Заранее спасибо.

+0

Проверьте, что ваш массив 'imgs' фактически содержит то, что он должен: я никогда не видел' [] .slice.call (document.querySelectorAll ('img')); 'before, попробуйте использовать' document.getElementsByTagName ("img «)'. – theonlygusti

+0

В этом случае то, что я написал, более или менее эквивалентно. Единственное отличие, насколько мне известно, это то, что nodeList, возвращаемый 'querySelectorAll', не является живым, он не отражает изменения в DOM, поскольку список был отбракован (' getElementsByTagName' возвращает «живой» список) –

+0

Я не думаю инвертированный, как класс, делает что-либо по умолчанию в chrome; вы правильно настроили свой css? – theonlygusti

ответ

1

Выяснил это. Я отправил ответ здесь, если у кого-то еще есть эта проблема. Он отлично работает в chrome только, если вы действительно просматриваете страницу через веб-сервер. Если вы просто открываете файл с хром, он не работает. Это неверно с другими браузерами. Не знаю, почему это работает во всем, кроме хром, но там у вас оно есть.

+0

Кстати, если я напишу ошибку с командой chrome dev на этом? –

+0

Это «особенность», а не ошибка. Существует много сообщений об одной и той же проблеме. Его раздражающая «особенность», но вокруг него есть миллионы сообщений в Интернете. –

+1

Спасибо, я оставлю это в покое. Это порождает нарушение «принципа наименьшего удивления», хотя и не уверен, что они получают, будучи странным. –