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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:51:26