Asp Mvc视图绑定jQuery toggleMenu方法一正常一失效的可能原因
问题场景相关代码
视图HTML代码
<div id="hide-menu" class="btn-header pull-right"> <span> <a href="javascript:void(0);" class="toggleMenu" data-action="toggleMenu" title="Collapse Menu"> <i class="fa fa-reorder"></i> </a> </span> </div>
对应jQuery逻辑
toggleMenu: function () { if (!$.root_.hasClass("menu-on-top")) { $('html').toggleClass("hidden-menu-mobile-lock"); $.root_.toggleClass("hidden-menu"); $.root_.removeClass("minified"); } else if ($.root_.hasClass("menu-on-top") && $.root_.hasClass("mobile-view-activated")) { $('html').toggleClass("hidden-menu-mobile-lock"); $.root_.toggleClass("hidden-menu"); $.root_.removeClass("minified"); } }
故障可能原因
- 事件绑定时机错误:失效视图的事件绑定代码在DOM渲染完成前就执行了,比如绑定逻辑写在
<head>标签中且没有套$(document).ready()监听,代码运行时还没有加载到.toggleMenu元素,导致事件没有绑定成功。正常的视图可能是JS放在页面底部,或者加了DOM就绪监听所以绑定正常。 - 事件绑定方式不匹配:如果用的是
$('.toggleMenu').click(toggleMenu)直接绑定的写法,而失效视图里的菜单元素是页面加载完成后动态渲染的(比如异步加载局部视图),直接绑定的事件不会作用到动态生成的元素上,换成事件委托写法绑定到页面加载时就存在的父级元素即可。 - JS依赖加载异常:失效视图里jQuery或者包含
toggleMenu方法的公共JS文件加载顺序晚于事件绑定代码,甚至没有加载成功,导致调用方法时提示函数未定义。如果JS引用用的是相对路径,更深层级路由的视图很容易出现相对路径匹配错误、JS加载失败的问题。 - 元素或事件冲突:失效视图里存在重复的
id="hide-menu"元素,或者有其他JS代码覆盖了.toggleMenu类的点击事件,阻止了事件冒泡、直接解绑了对应处理函数。也有可能是视图额外引入的其他JS库覆盖了$变量,导致jQuery代码运行报错,把代码里的$换成jQuery即可验证是否是该问题。 - 逻辑条件不匹配:可以在
toggleMenu函数第一行加console.log('函数触发')测试,如果控制台能输出日志说明事件绑定正常,就是逻辑内部的判断条件不满足:两个视图的$.root_对应的元素不一致,失效视图的根元素既不满足!hasClass("menu-on-top")也不满足else if的判断条件,所以内部逻辑没有执行。 - HTML语法错误:你提供的原始代码里title属性多了一个多余的右括号
title="Collapse Menu"),如果失效视图保留了这个语法错误,会导致DOM解析异常,元素属性识别错误,事件绑定逻辑找不到data-action匹配的方法。
内容的提问来源于stack exchange,提问作者James.mikael
相关产品推荐
相关产品推荐

