Velocity.js汉堡菜单点击报错:第二次点击提示Cannot read property 'pattern'
汉堡菜单点击切换报错"Cannot read property 'pattern' of undefined"的解决办法
你遇到的问题主要来自两个关键细节的疏漏,咱们一步步拆解解决:
问题1:菜单状态判断的目标元素错误
你当前用$(event.target).hasClass('open')来判断菜单是否处于打开状态,但event.target指向的是实际被点击的DOM节点——如果你的.menu内部包含图标、文字之类的子元素,点击这些子元素时,event.target就不是.menu本身,自然检测不到open类,逻辑直接混乱,后续操作就容易触发未定义属性的报错。
正确的做法是用$(this),它始终指向绑定点击事件的.menu元素本身,不管你点击的是它的子元素还是自身,状态判断会准确得多。
问题2:重复绑定事件引发冲突
你每次打开菜单时都会调用bindmenus(),如果这个函数内部是给菜单元素绑定点击事件,那么每次打开都会多绑定一次重复的事件,多次触发时就会出现奇怪的报错(比如你遇到的pattern未定义)。bindmenus()应该只在页面加载完成时初始化一次,而不是每次打开菜单都执行。
修改后的完整代码
// 页面加载完成后先初始化菜单绑定,只执行一次 $(function() { bindmenus(); $('.menu').click(function(event) { // 用$(this)判断当前菜单的状态,确保准确性 if ($(this).hasClass('open')) { $('.full-menu').velocity({ width: "0%" }, { duration: 100 }); $(this).removeClass('open'); $('.full-menu').addClass('hide-menu'); } else { $('.full-menu').velocity({ width: "100%" }, { duration: 100 }); $('.full-menu').removeClass('hide-menu'); $(this).addClass('open'); // 移除此处的bindmenus()调用,避免重复绑定事件 } }); });
另外,如果bindmenus()是给.full-menu内的元素绑定事件,更推荐用事件委托的方式,既能兼容菜单动态显示隐藏的场景,还能彻底避免重复绑定问题,示例如下:
function bindmenus() { // 把事件委托给稳定的父元素(比如document或固定容器) $(document).on('click', '.full-menu .menu-item', function() { // 你的菜单子项点击逻辑 }); }
这样调整后,菜单的开合逻辑会更稳定,第二次点击时的报错也会消失。
内容的提问来源于stack exchange,提问作者user1218670
相关产品推荐
相关产品推荐

