(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) : typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) : (factory((global.$ = global.$ || {}, global.$.fn = global.$.fn || {}), global.$)); }(this, (function (exports, $) { 'use strict'; $ = $ && $.hasOwnProperty('default') ? $['default'] : $; // 参考了(reference): // debouncing function from John Hann // http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/ function debounce(func, threshold) { var timeout; return function debounced() { var obj = this, args = arguments; function delayed() { // 让调用smartresize的对象执行 func.apply(obj, args); /* timeout = null;:这个语句只是单纯将timeout指向null, 而timeout指向的定时器还存在, 要想清除定时器(让setTimeout调用的函数不执行)要用clearTimeout(timeout)。 eg: var timeout = setTimeout(function(){ alert('timeout = null');// 执行 },1000); timeout = null; var timeout = setTimeout(function(){ alert('clearTimeout(timeout)');// 不执行 },1000); clearTimeout(timeout); var timeout = setTimeout(function(){ clearTimeout(timeout); alert('clearTimeout(timeout)');// 执行(已经开始执行匿名函数了) },1000); */ timeout = null; } // 如果有timeout正在倒计时,则清除当前timeout timeout && clearTimeout(timeout); timeout = setTimeout(delayed, threshold || 100); }; } function smartscroll(fn, threshold) { return fn ? this.bind('scroll', debounce(fn, threshold)) : this.trigger('smartscroll'); } //jquery-smartscroll $.fn.smartscroll = smartscroll; function scrollsync(options) { var defaluts = { x_sync: true, y_sync: true, use_smartscroll: false, smartscroll_delay: 10, }; // 使用jQuery.extend 覆盖插件默认参数 var options = $.extend({}, defaluts, options); console.log(options); var scroll_type = options.use_smartscroll ? 'smartscroll' : 'scroll'; var $containers = this; // 滚动后设置scrolling的值,调用set同步滚动条 var scrolling = {}; Object.defineProperty(scrolling, 'top', { set: function (val) { $containers.each(function () { $(this).scrollTop(val); }); } }); Object.defineProperty(scrolling, 'left', { set: function (val) { $containers.each(function () { $(this).scrollLeft(val); }); } }); $containers.on({ mouseover: function () { if (scroll_type == 'smartscroll') { $(this).smartscroll(function () { options.x_sync && (scrolling.top = $(this).scrollTop()); options.y_sync && (scrolling.left = $(this).scrollLeft()); }, options.smartscroll_delay); return; } $(this).bind('scroll', function () { options.x_sync && (scrolling.top = $(this).scrollTop()); options.y_sync && (scrolling.left = $(this).scrollLeft()); }); }, mouseout: function () { $(this).unbind('scroll'); } }); return this; } exports.scrollsync = scrollsync; Object.defineProperty(exports, '__esModule', {value: true}); })));