首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在javascript中在2秒内使用不超过1次的函数

在javascript中在2秒内使用不超过1次的函数
EN

Stack Overflow用户
提问于 2014-09-26 19:17:33
回答 3查看 177关注 0票数 1

我有一个从鼠标滚轮滚动开始的函数,但是,如果我做一个更长的滚动,它执行2-3次。所以,如果它在2秒内被调用超过1次,我必须找到一种方法来阻止它运行。有什么想法吗?

PS :这是我的功能。如果你知道一个更好的方式开始滚动,而不考虑它是多长时间是滚动,我也会感谢它。

代码语言:javascript
运行
复制
if (window.addEventListener) {
// IE9, Chrome, Safari, Opera
window.addEventListener("mousewheel", MouseWheelHandler, false);
// Firefox
window.addEventListener("DOMMouseScroll", MouseWheelHandler, false);
}
// IE 6/7/8

var s = 0;
function MouseWheelHandler(e) {

// cross-browser wheel delta
var e = window.event || e; // old IE support
var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));     
e.preventDefault();
                ...
 }

更新:我根据我在评论和回答中读到的想法制定了我自己的代码版本。就是这样:

代码语言:javascript
运行
复制
function MouseWheelHandler(e) {
var e = window.event || e;   

// cross-browser wheel delta
 // old IE support
var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));     
 e.preventDefault();
GoUpDown(delta,e);

}
function GoUpDown(delta,e) {
                        if(timer ==0){ timer =1;
                            setTimeout(function () {timer =0;},4200);
  /*function stuff*/
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-26 20:36:27

一种从Morten OC的代码中修改的节流方式

http://jsfiddle.net/43sgpme7/13/

代码语言:javascript
运行
复制
var interval = 2000;
var count = 0;

function action() {
    count++;
    $("p").html(new Date().getTime() + "-" + count)
}

$(".scroll").scroll(function () {
    var self = this;
    if (this.lastScroll === undefined) {
        this.lastScroll = Date.now() - interval;
    }

    /*calculate how long until next execution should happen*/
    var nextTime = interval - Date.now() + this.lastScroll;
    /*it doesn't make sense that time range is smaller than 0*/
    if (nextTime < 0) {
        nextTime = 0;
    }

    if (this.scrollTo) clearTimeout(this.scrollTo);
    this.scrollTo = setTimeout(function () {
        self.lastScroll = Date.now();
        action();
    }, nextTime);
});
票数 0
EN

Stack Overflow用户

发布于 2014-09-26 20:49:28

这里是一个简单的节气门功能。它返回一个只允许传入的函数在指定的interval上运行的新函数(以毫秒为单位)。

代码语言:javascript
运行
复制
function throttleFunction(func, interval){
    return function(){
        if(!func.lastRunTime || func.lastRunTime < Date.now() - interval){
            func.lastRunTime = Date.now();

            func.apply(this, arguments);
        }
    }
}

将其添加到代码中,如下所示:

代码语言:javascript
运行
复制
//Only run every 2000 milliseconds
var throttledMouseWheelHandler = throttleFunction(MouseWheelHandler, 2000);
// IE9, Chrome, Safari, Opera
window.addEventListener("mousewheel", throttledMouseWheelHandler , false);
// Firefox
window.addEventListener("DOMMouseScroll", throttledMouseWheelHandler , false);

代码语言:javascript
运行
复制
function throttleFunction(func, interval) {
  return function() {
    if (!func.lastRunTime || func.lastRunTime < Date.now() - interval) {
      func.lastRunTime = Date.now();

      func.apply(arguments);
    }
  }
}

document.body.onclick = throttleFunction(function() {
  var div = document.createElement('div');
  div.innerHTML = 'clicked';
  document.body.appendChild(div);
}, 2000);
代码语言:javascript
运行
复制
<div>Click ME (only registers every 2 seconds)</div>

票数 1
EN

Stack Overflow用户

发布于 2014-09-26 19:36:14

为了简单起见,我在本例中包括了jQuery。你可以把它重写成本地的..。

看看这里:http://jsfiddle.net/43sgpme7/

代码语言:javascript
运行
复制
$(".scroll").scroll(function ()
{
    if (this.scrollTo) clearTimeout(this.scrollTo);
    this.scrollTo = setTimeout(function ()
    {
        $("p").html(new Date().getTime())

    }, 1000);
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26066797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档