Mat*_*chu 22 html javascript jquery
目前我的程序位于一个地方,它既可以监听用户滚动某个元素,也可以自动滚动这个元素.(不是一个渐进的,漂亮的卷轴,而是瞬间跳跃.我发誓在上下文中有道理.)
如果通过设置scrollLeft或scrollTop完成滚动,有没有办法使滚动事件不触发?我的第一个想法是一个基本的开关,如:
ignoreScrollEvents = true;
element.scrollLeft = x;
ignoreScrollEvents = false;
function onScroll() {
if(ignoreScrollEvents) return false;
}
Run Code Online (Sandbox Code Playgroud)
但由于事件不会立即触发(oops,duhh),这不是一个可行的解决方案.我可以尝试其他什么样的答案?我也在使用jQuery,如果这有帮助的话.
Sho*_*og9 22
最简单的通用方法?只需在事件处理程序中重置标志即可.如果您实际上正在更改该值,您将首先检查,否则将不会触发事件 - 正如Rodrigo所说,这里的一个好习惯是将其分解为所谓的"setter"函数:
function setScrollLeft(x)
{
if ( element.scrollLeft != x )
{
ignoreScrollEvents = true;
element.scrollLeft = x;
}
}
...
function onScroll()
{
var ignore = ignoreScrollEvents;
ignoreScrollEvents = false;
if (ignore) return false;
...
}
Run Code Online (Sandbox Code Playgroud)
但是,根据您的需要,您可能已经将滚动位置存储在某处; 如果是这样,只需更新并检查它作为您的标志.就像是:
element.scrollLeft = currentScrollLeft = x;
...
function onScroll()
{
// retrieve element, etc...
if (element.scrollLeft == currentScrollLeft) return false;
...
}
Run Code Online (Sandbox Code Playgroud)
二传手怎么样?
var _preventEvent = false; // set global flag
function setScrollTop(amount) {
_preventEvent = true; // set flag
document.documentElement.scrollTop = amount * Math.random();
}
function setScrollLeft(amount) {
_preventEvent = true; // set flag
document.documentElement.scrollLeft = amount * Math.random();
}
// scroll event listener
window.onscroll = function() {
console.clear();
if (_preventEvent) {
_preventEvent = false; // reset flag
return;
}
console.log('normal scroll');
}
Run Code Online (Sandbox Code Playgroud)
html{ height:500%; width:500%; }
button{ position:fixed; }
button + button{ top:50px; }
Run Code Online (Sandbox Code Playgroud)
<button onclick=setScrollTop(1000)>Random scrollTop</button>
<button onclick=setScrollLeft(1000)>Random scrollLeft</button>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
27445 次 |
最近记录: |