调用jQuery的blur/focus触发TypeError:this.trigger不是函数
问题描述
页面中有多个配置方式相同的按钮,但调用focus()或blur()方法时,部分按钮会触发TypeError,该错误发生在jQuery 3.6.0内部。
报错位置的jQuery代码片段:
S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "), function (e, n) { S.fn[n] = function (e, t) { return 0 < arguments.length ? this.on(n, null, e, t) : this.trigger(n) } })
报错信息:
jquery-3.6.0.js?v=638024629878907069:3228 Uncaught TypeError: this.trigger is not a function at S.fn.<computed> (jquery-3.6.0.js?v=638024629878907069:3228:73)
请问为何仅部分按钮或元素会持续出现该问题?
原因分析与解决方案
这个错误的核心是调用focus()/blur()的对象不是合法的jQuery实例,或者实例关联的DOM元素已失效,以下是具体场景和排查方向:
常见触发场景
- 目标DOM已被销毁:部分按钮可能在调用方法前就被动态移除(比如通过
remove()、detach()或页面更新),此时对应的jQuery对象虽然还存在,但内部绑定的DOM节点已不存在,调用方法时this指向的对象丢失了trigger方法。 - 误将原生DOM当jQuery实例用:如果代码里直接拿原生DOM元素(比如
document.getElementById('btn')返回的对象)调用jQuery的focus()方法,就会触发这个错误——原生元素的focus是原生API,但走jQuery的方法映射逻辑时,会因为对象不具备jQuery的trigger方法报错。 - 异步时序问题:在AJAX回调、定时器这类异步逻辑里调用方法时,目标按钮可能已经被页面更新替换,原jQuery实例绑定的DOM已不存在。
- 局部jQuery原型被篡改:极少数情况下,自定义代码或第三方脚本可能修改了局部jQuery实例的原型链,但这种情况通常会影响所有元素,而非部分。
排查与修复建议
- 调用方法前先校验jQuery实例的有效性:
// 检查实例是否包含有效DOM元素,且元素仍在DOM树中 if ($targetBtn.length > 0 && $targetBtn[0].isConnected) { $targetBtn.focus(); } - 确认调用对象是jQuery实例:
console.log($targetBtn instanceof jQuery); // 正常应为true - 梳理DOM操作逻辑,确保调用方法时目标元素未被移除或替换。
内容的提问来源于stack exchange,提问作者Kristóf Horváth
相关产品推荐
相关产品推荐

