如何在向上滚动或向下滚动时运行doSomething()一次?
window.onscroll = function(e) {
// scrolling up
if(this.oldScroll > this.scrollY){
doSomething();
// scrolling down
} else {
doSomething();
}
this.oldScroll = this.scrollY;
};
doSomething()绑定了一些元素,我不想重复绑定。我只想在向上滚动时绑定一次,在向下滚动时绑定一次。
答案 0 :(得分:0)
如果您的意思是,您的功能应该每 滚动事件执行一次,那么您的代码应该已经完成了工作。
但是,如果您的意思是希望您的功能仅在用户滚动时执行第一次,则代码可能如下所示:
window.onscroll = function(e) {
if (this.oldScroll > this.scrollY) {
doSomething();
} else {
doSomethingElse();
}
this.oldScroll = this.scrollY;
delete window.onscroll;
};
NOT 依赖于任何类型的"标志变量"正如上面提出的那样。在这种情况下,这是一种非常糟糕的做法!
答案 1 :(得分:0)
你可以选择定义闭包函数,并按照post
中描述的方式使用它。除了上面的帖子,我遇到了这种情况,我使用以下方法来检查事件是否已经注册或者没有看到下面的函数我需要绑定点击一次只有我用typeof $._data ( elementClose.get ( 0 ), 'events' ) === 'undefined'
来获取使用元素注册的事件$._data
用于检索注册到元素/
this.closeButtonPreview = () => {
let elementClose = $("a.close-preview");
if (typeof $._data(elementClose.get(0), 'events') === 'undefined') {
elementClose.on('click', function(e) {
e.preventDefault();
let container = $(this).parent();
container.find('video').remove();
$("#overlay,.window").effect("explode", {}, 500);
});
}
return;
};
修改强>
为了让您了解我与$._data()
使用的逻辑有关的概念。我在下面创建了一个例子。
我正在做的是将事件click
绑定到条件id=unique
内的if (typeof $._data(uniqueBind.get(0), 'events') == 'undefined') {
,这决定了是否为该元素分配了一个事件并绑定了事件click
在条件之外的锚id=multi
而不检查元素上的绑定事件。
你需要做什么。
最初,按钮unique
和multi
无法将任何内容记录到控制台,点击EVENT BINDER
一次,然后点击unique
和{{1}他们都会在mutli
中记录一次文本,但是当您一直点击console
通知时,单击EVENT BINDER
按钮将开始记录文本,因为您点击multi
{ {1}}按钮,但无论您点击EVENT BINDER
按钮多少次,unique
按钮都只会记录一次。
EVENT BINDER

$(document).ready(function() {
$('#binder').on('click', bindEvents);
$('#clear').on('click', function() {
console.clear();
})
});
function bindEvents() {
var uniqueBind = $('#unique-bind');
var multiBind = $('#multi-bind');
//will bind only once as many times you click on the EVENT BINDER BUTTON
//check if any event is assigned to the element
if (typeof $._data(uniqueBind.get(0), 'events') == 'undefined') {
uniqueBind.on('click', function() {
console.log('clicked unique bind');
});
}
//will log the text EVENT BINDER * TIMES_EVENT_BINDER_CLICKED button
multiBind.on('click', function() {
console.log('clicked multi bind');
});
}

body {
text-align: center;
}