芝麻web文件管理V1.00
编辑当前文件:/home2/sdektunc/.trash/cepali/lib/amd/src/autoscroll.js
// This file is part of Moodle - http://moodle.org/ // // Moodle is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Moodle is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see
. /* * JavaScript to provide automatic scrolling, e.g. during a drag operation. * * Note: this module is defined statically. It is a singleton. You * can only have one use of it active at any time. However, since this * is usually used in relation to drag-drop, and since you only ever * drag one thing at a time, this is not a problem in practice. * * @module core/autoscroll * @class autoscroll * @package core * @copyright 2016 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @since 3.6 */ define(['jquery'], function($) { /** * @alias module:core/autoscroll */ var autoscroll = { /** * Size of area near edge of screen that triggers scrolling. * @private */ SCROLL_THRESHOLD: 30, /** * How frequently to scroll window. * @private */ SCROLL_FREQUENCY: 1000 / 60, /** * How many pixels to scroll per unit (1 = max scroll 30). * @private */ SCROLL_SPEED: 0.5, /** * Set if currently scrolling up/down. * @private */ scrollingId: null, /** * Speed we are supposed to scroll (range 1 to SCROLL_THRESHOLD). * @private */ scrollAmount: 0, /** * Optional callback called when it scrolls * @private */ callback: null, /** * Starts automatically scrolling if user moves near edge of window. * This should be called in response to mouse down or touch start. * * @public * @param {Function} callback Optional callback that is called every time it scrolls */ start: function(callback) { $(window).on('mousemove', autoscroll.mouseMove); $(window).on('touchmove', autoscroll.touchMove); autoscroll.callback = callback; }, /** * Stops automatically scrolling. This should be called in response to mouse up or touch end. * * @public */ stop: function() { $(window).off('mousemove', autoscroll.mouseMove); $(window).off('touchmove', autoscroll.touchMove); if (autoscroll.scrollingId !== null) { autoscroll.stopScrolling(); } }, /** * Event handler for touch move. * * @private * @param {Object} e Event */ touchMove: function(e) { for (var i = 0; i < e.changedTouches.length; i++) { autoscroll.handleMove(e.changedTouches[i].clientX, e.changedTouches[i].clientY); } }, /** * Event handler for mouse move. * * @private * @param {Object} e Event */ mouseMove: function(e) { autoscroll.handleMove(e.clientX, e.clientY); }, /** * Handles user moving. * * @private * @param {number} clientX X * @param {number} clientY Y */ handleMove: function(clientX, clientY) { // If near the bottom or top, start auto-scrolling. if (clientY < autoscroll.SCROLL_THRESHOLD) { autoscroll.scrollAmount = -Math.min(autoscroll.SCROLL_THRESHOLD - clientY, autoscroll.SCROLL_THRESHOLD); } else if (clientY > $(window).height() - autoscroll.SCROLL_THRESHOLD) { autoscroll.scrollAmount = Math.min(clientY - ($(window).height() - autoscroll.SCROLL_THRESHOLD), autoscroll.SCROLL_THRESHOLD); } else { autoscroll.scrollAmount = 0; } if (autoscroll.scrollAmount && autoscroll.scrollingId === null) { autoscroll.startScrolling(); } else if (!autoscroll.scrollAmount && autoscroll.scrollingId !== null) { autoscroll.stopScrolling(); } }, /** * Starts automatic scrolling. * * @private */ startScrolling: function() { var maxScroll = $(document).height() - $(window).height(); autoscroll.scrollingId = window.setInterval(function() { // Work out how much to scroll. var y = $(window).scrollTop(); var offset = Math.round(autoscroll.scrollAmount * autoscroll.SCROLL_SPEED); if (y + offset < 0) { offset = -y; } if (y + offset > maxScroll) { offset = maxScroll - y; } if (offset === 0) { return; } // Scroll. $(window).scrollTop(y + offset); var realOffset = $(window).scrollTop() - y; if (realOffset === 0) { return; } // Inform callback if (autoscroll.callback) { autoscroll.callback(realOffset); } }, autoscroll.SCROLL_FREQUENCY); }, /** * Stops the automatic scrolling. * * @private */ stopScrolling: function() { window.clearInterval(autoscroll.scrollingId); autoscroll.scrollingId = null; } }; return { /** * Starts automatic scrolling if user moves near edge of window. * This should be called in response to mouse down or touch start. * * @public * @param {Function} callback Optional callback that is called every time it scrolls */ start: autoscroll.start, /** * Stops automatic scrolling. This should be called in response to mouse up or touch end. * * @public */ stop: autoscroll.stop }; });