Если обработчик клика запускается при нажатии на полосу прокрутки

Взгляните на эти фрагменты HTML: Jsfiddle

<style>
  div { 
    margin:20px; 
    border: 30px red solid; 
    padding: 20px; 
    background-color:green;
    overflow-y:scroll; 
  }
</style>

<div onclick="alert('div clicked');">click me</div>

Теперь, если пользователь нажимает на полосу прокрутки в Firefox или Chrome, обработчик кликов на элементе div не срабатывает. С другой стороны, в IE срабатывает обработчик кликов.

Какое поведение верно? Является ли ожидаемое поведение определенным в любом месте?

Ответы

Ответ 1

рекомендации w3 предполагают, что полоса прокрутки должна быть размещена между внутренним краем границы и краем внешнего края элемента. Кроме того, размеры прокрутки должны быть вычтены из ваших размеров элемента.

Короче говоря, полоса прокрутки не должна находиться внутри элемента. и высота/ширина элемента должны быть соответствующим образом отрегулированы.

Ответ 2

Я думаю, что оба поведения в порядке. Когда полоса прокрутки находится над документом (например, сафари), она должна запускать событие щелчка, в то время как полоса прокрутки не должна. (хром, firefox).

Я рекомендую "не возиться (пытаясь справиться с этим поведением) с помощью щелчка на полосе прокрутки, но в случае прокрутки или щелчка, если это на документе или нет.

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

Ответ 3

Если мыслить буквально, полоса прокрутки на самом деле не является частью страницы, а является способом навигации по этой странице, поэтому не должно иметь прямого вмешательства со своей страницей, если только кто-то не использует эффект onscroll. Если полоса прокрутки покрывает часть элемента, тогда эфир будет широким, или браузер не будет компенсировать добавленную ширину полосы прокрутки. Я думаю, что в этом случае Firefox и Chrome являются "правильными", но IE не обязательно ошибочен, у них просто есть другой способ реализации прокрутки.

Я думаю, еще один вопрос: "отображает ли браузер часть элемента за полосой прокрутки, если ширина страницы составляет 100%?" Если это так, элементы должны быть доступны через панель.

Надеюсь, это имеет смысл:)

Ответ 4

В соответствии с W3, события события пузырятся.

Что это значит? Здесь объясняется:

Пузырящийся    Процесс, посредством которого событие распространяется вверх через своих предков после обработки его целью.

Теперь проблема, касающаяся полос прокрутки, заключается в том, чтобы понять, должны ли они:

  • остановить распространение события клика или
  • пусть это пузырится до более подходящего обработчика (в данном случае это div элемент) или
  • ответьте на событие И также выпустите его, чтобы предков, чтобы поймать его.

Теперь, в той же странице W3 объясняется, что такое событие прокрутки:

прокрутки    Событие прокрутки происходит, когда прокручивается вид документа.

Теперь то, что вы ожидаете от полосы прокрутки, будет обрабатывать прокрутку вида документа (в данном случае div), не мешая ему правильное и ожидаемое поведение (включая распространение событий).

Реальная проблема здесь заключалась в том, что, когда свиток на мышах все еще был воображением, чтобы прокрутить, вам нужно было щелкнуть первым! Таким образом, в этом качестве мы можем сказать, что поведение № 1 и номер 3 являются правильными (первый приоритет для полосы прокрутки, а второй - как полоса прокрутки, так и предки).

Все это можно сказать: на данный момент на нем нет явного стандарта. Создатели браузера могут решить принять одно поведение или другое, и оба они верны.

Что вы можете сделать в этом случае, чтобы получить однородное поведение в браузерах, может быть, например, поймать клики на полосах прокрутки (для Firefox и Chrome) и запускать событие с щелчком мыши.

Ответ 5

Здесь существует большая проблема, которая распространяется во всей разработке webapp: на самом деле нет стандарта; просто рекомендации. W3C - самый громкий голос, когда речь идет об объединении Интернета, но все, что они могут дать, - это рекомендации, поскольку Microsoft и разработчики небольших веб-браузеров не входят в состав комитета.

Итак, короткий ответ: ни правильный, ни неправильный из-за отсутствия стандартного стандарта

Долгое решение Microsoft давно приняло решение, противоречащее Netscape (единственному другому браузеру того времени), которое противоречит тому, что сейчас делают другие браузеры, которые относятся к вашему вопросу:

Microsoft решила, что все элементы, относящиеся к элементу, будут включены/отрисованы внутри ограничивающего блока элемента (включая границы, отступы, поля (?), полосы прокрутки и т.д.). Это означает, что любое нажатие внутри элемента вызывает событие onclick независимо от того, что было нажато, потому что оно находится в ограничивающей рамке.

Где W3C рекомендует включать только область заполнения и отображения, оставляя границы, поля, полосы прокрутки и т.д., которые будут отображаться вне нее, что, в свою очередь, означает, что единственный раз, когда onclick поднят, - это когда область заполнения и/или отображения элемент щелкнут