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

OpenCart 2.3.0.2移动端输入框键盘弹出后立即关闭问题

问题分析

你遇到的问题根源是:移动端键盘弹出时会触发window.resize事件,而你的代码每次resize都会重新执行元素移动逻辑——把购物车区域从原位置移除再插入到新位置。这个DOM操作会导致当前获得焦点的输入框失去焦点,键盘也就随之关闭了。

解决方案

修改代码,添加防抖机制,并且只在窗口宽度发生显著变化时才执行元素移动,避免键盘弹出这类非屏幕尺寸变化的resize触发DOM操作:

<script>
    $(function(){
        let lastWindowWidth = $(window).width();
        // 防抖定时器
        let resizeTimer;

        function moveCart(){
            const currentWidth = $(window).width();
            // 只有宽度变化超过10px时才执行,过滤键盘弹出的微小变化
            if(Math.abs(currentWidth - lastWindowWidth) < 10) return;
            
            lastWindowWidth = currentWidth;

            if(currentWidth < 768 ){
                const $cartArea = $('#content > .row > .col-sm-4');
                // 避免重复执行移动
                if(!$cartArea.hasClass('moved-div')){
                    $cartArea.removeClass('col-sm-4').addClass('moved-div');
                    $('.moved-div').insertAfter('.thumbnails');
                }
            } else {
                const $movedDiv = $('.moved-div');
                if($movedDiv.length){
                    $movedDiv.insertAfter('#content > .row > .col-sm-8').addClass('col-sm-4').removeClass('moved-div');
                }
            }
        }

        // 初始化执行
        moveCart();

        $(window).resize(function(){
            // 防抖:300ms内只执行一次,避免频繁触发
            clearTimeout(resizeTimer);
            resizeTimer = setTimeout(moveCart, 300);
        })
    });
</script>
修改说明
  • 防抖机制:添加300ms的定时器,避免窗口resize时频繁触发DOM操作,提升性能同时减少不必要的元素移动。
  • 宽度变化阈值判断:记录上次窗口宽度,只有当宽度变化超过10px时才执行移动逻辑,过滤键盘弹出导致的微小视口变化。
  • 重复操作判断:添加类名判断,避免在已经处于正确位置时重复执行移除/插入DOM的操作,防止焦点丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 13:35:02