You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移动端JavaScript滑动仅生效一次问题技术求助

修复移动端滑动无法重复触发的问题

嘿,我找到问题的根源了!你这段代码里有个很容易踩的小坑——classList方法的链式调用错误。

你看,classList.add()和classList.remove()这两个方法是没有返回值的(准确说返回undefined),所以当你写element.classList.add("down-scroll").remove("up-scroll")的时候,执行完add后拿到的是undefined,再去调用remove就会直接抛出错误,导致后面的xDown = null; yDown = null;重置代码根本没机会运行。第一次滑动后,变量没被正确重置,后续的滑动判断自然就失效了。

下面是修复后的完整代码,主要把链式调用拆成了单独语句,还加了可选的阻止默认滚动行为的代码,避免浏览器原生滚动和自定义滑动冲突:

window.addEventListener('touchstart', handleTouchStart, false);
window.addEventListener('touchmove', handleTouchMove, false);

var xDown = null;
var yDown = null;

function handleTouchStart(evt) {
    xDown = evt.touches[0].clientX;
    yDown = evt.touches[0].clientY;
};

function handleTouchMove(evt) {
    if (!xDown || !yDown) {
        return;
    }

    var xUp = evt.touches[0].clientX;
    var yUp = evt.touches[0].clientY;

    var xDiff = xDown - xUp;
    var yDiff = yDown - yUp;

    // 可选:阻止浏览器默认滚动行为,避免和自定义滑动冲突
    evt.preventDefault();

    if (Math.abs(xDiff) > Math.abs(yDiff)) {
        /* 左右滑动逻辑 */
        if (xDiff > 0) {
            // 左滑操作
        } else {
            // 右滑操作
        }
    } else {
        var element = document.getElementById("background");
        if (yDiff > 0) {
            // 拆分为单独调用,避免链式错误
            element.classList.add("down-scroll");
            element.classList.remove("up-scroll");
        } else {
            element.classList.add("up-scroll");
            element.classList.remove("down-scroll");
        }
    }

    /* 重置变量,确保下次滑动能正常触发 */
    xDown = null;
    yDown = null;
};

另外,建议你打开浏览器开发者工具的控制台(按F12),就能看到第一次滑动时抛出的Cannot read properties of undefined (reading 'remove')错误,这是排查前端问题的常用小技巧哦。

内容的提问来源于stack exchange,提问作者Stan Howe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:42:15