如何在jQuery中忽略‘Cannot read property’类未定义属性的控制台报错
问题根因说明
你遇到的报错本质不是innerText为空,而是你选中的来源元素本身不存在:myDiv[0]的值为undefined,你直接访问undefined.innerText才会抛出异常。你之前的判断逻辑直接先访问了innerText,相当于在判断生效前就触发了错误,自然不会达到预期效果。
正确处理方案
- 方法1:先逐层判断元素是否存在,再读取属性
可以用可选链操作符简化判断(ES2020+支持,兼容2020年后发布的所有主流浏览器):
如果需要兼容旧版浏览器,可使用全量判断逻辑:// 先判断元素存在,再判断内容非空 if (myDiv?.[0]?.innerText?.trim() !== "") { // 你的业务逻辑 }if (myDiv && myDiv[0] && myDiv[0].innerText && myDiv[0].innerText.trim() !== "") { // 你的业务逻辑 } - 方法2:修正try-catch的捕获范围
你之前用try-catch不生效,大概率是没有覆盖到异步执行的代码块:报错属于jQuery.Deferred异常,说明你的业务逻辑是在Deferred异步回调中执行的,需要把try-catch写在回调内部:$.when(/* 你的异步逻辑 */).done(function() { try { if (myDiv[0].innerText.trim() !== "") { // 你的业务逻辑 } } catch (e) { // 捕获到异常后无操作即可不打印到控制台 } }) - 方法3:全局过滤指定异常(不推荐,优先使用代码层局部判断)
如果确实需要全局屏蔽该类报错,可监听全局异常事件做过滤:// 过滤同步抛出的指定错误 window.addEventListener('error', function(e) { if (e.message.includes("Cannot read property 'innerText' of undefined")) { e.stopPropagation(); e.preventDefault(); return false; } }) // 过滤异步Promise/Deferred抛出的指定错误 window.addEventListener('unhandledrejection', function(e) { if (e.reason?.message?.includes("Cannot read property 'innerText' of undefined")) { e.stopPropagation(); e.preventDefault(); return false; } })
内容的提问来源于stack exchange,提问作者randomuser37487593
相关产品推荐
相关产品推荐

