JavaScript. Подробное руководство, 6-е издание, стр. 263

<b>                                  0; // свойство не определено</b>

<b>    // Большинство броузеров генерируют одно событие со значением 120</b>

<b>    // на один щелчок колесика. Однако похоже, что мыши компании Apple</b>

<b>    // более чувствительные, и значения свойств delta часто оказываются</b>

<b>    // в несколько раз больше 120, по крайней мере, для Apple Mouse.</b>

<b>    // Использовать прием проверки типа броузера, чтобы решить эту проблему,</b>

<b>    if (isMacWebkit) { </b>

<b>      deltaX /= ЗО;</b>

<b>      deltaY /= 30;</b>

<b>    }</b>

<b>    // Если мы когда-нибудь будем получать событие mousewheel или wheel в (будущих </b>

<b>    // версиях) Firefox, можно отказаться от обработки события DOMMouseScroll.</b>

<b>    if (isFirefox &amp;&amp; e.type !== '‘DOMMouseScroll&quot;)</b>

<b>      frame.removeEventListener(&quot;DOMMouseScroll&quot;, wheelHandler, false);</b>

<b>    // Получить текущие размеры элемента содержимого</b>

<b>    var contentbox = content.getBoundingClientRectO;</b>

<b>    var contentwidth = contentbox.right - contentbox.left;</b>

<b>    var contentheight = contentbox.bottom - contentbox.top;</b>

<b>    // Если удерживается нажатой клавиша Alt, изменить размеры фрейма</b>

<b>    if (e.altKey) {</b>

<b>      if (deltaX) {</b>

<b>        framewidth -= deltaX; // Новая ширина фрейма, но не больше,</b>

<b>        framewidth = Math.min(framwidth, contentwidth); // чем ширина</b>

<b>        framewidth = Math.max(framewidth,50); // содержимого</b>

<b>        frame.style.width = framewidth + &quot;px&quot;; // и не меньше 50</b>

<b>      }</b>

<b>      if (deltaY) {</b>

<b>        frameheight -= deltaY; // To же для высоты фрейма</b>

<b>        frameheight = Math.min(frameheight, contentheight);</b>

<b>        frameheight = Math.max(frameheight-deltaY, 50);</b>

<b>        frame.style.height = frameheight + &quot;px&quot;;</b>

<b>      }</b>

<b>    }</b>

<b>    else { // Клавиша Alt не нажата, прокрутить содержимое в фрейме</b>

<b>      if (deltaX) {</b>

<b>        // Прокручивать не больше, чем</b>

<b>        var minoffset = Math.min(framewidth-contentwidth, 0);</b>

<b>        // Сумма deltaX и contentX, но не меньше, чем minoffset</b>

<b>        contentX = Math.max(contentX + deltaX, minoffset);</b>

<b>        contentX = Math.min(contentX, 0); // или больше 0</b>

<b>        content.style.left = contentX + &quot;px&quot;; // Новое смещение</b>

<b>      }</b>

<b>      if (deltaY) {</b>

<b>        var minoffset = Math.min(frameheight - contentheight, 0);</b>

<b>        // Сумма deltaY и contentY, но не меньше, чем minoffset</b>

<b>        contentY = Math.max(contentY + deltaY, minoffset);</b>

<b>        contentY = Math.min(contentY, 0); // или больше О</b>

<b>        content.style.top = contentY + &quot;px&quot;; // Новое смещение.</b>

<b>      }</b>

<b>    }</b>

<b>    // He позволять всплывать этому событию. Предотвратить выполнение действий</b>

<b>    // по умолчанию. Это позволит предотвратить прокрутку содержимого документа</b>

<b>    // в окне броузера. Будем надеяться, что вызов preventDefault() для события wheel</b>

<b>    // также предотвратит возбуждение дублирующего события mousewheel.</b>

<b>    if (е.preventDefault) е.preventDefault();</b>

<b>    if (е.stopPropagation) е.stopPropagation();</b>

<b>    e.cancelBubble = true; // модель событий IE</b>

<b>    e.returnValue = false; // модель событий IE</b>

<b>    return false;</b>

<b>  }</b>

<b>}</b>

17.7. События механизма буксировки (drag-and-drop)

В примере 17.2 было показано, как реализовать операцию буксировки элементов мышью. Она позволяет перетаскивать и оставлять элементы в пределах веб-страницы, но истинная буксировка - это нечто иное. Буксировка (drag-and-drop, или DnD)- это интерфейс взаимодействия с пользователем, позволяющий перемещать данные между «источником» и «приемником», которые могут находиться в одном или в разных приложениях. Буксировка (DnD) - это сложный механизм организации взаимодействий между человеком и машиной, и прикладные интерфейсы, реализующие поддержку буксировки, всегда отличались высокой сложностью: