使用jQuery 1.12.2时遇"无法获取defaultView属性"错误求助
解决jQuery 1.12.2中mousedown事件里的"无法获取未定义或空引用的defaultView属性"错误
这个错误我之前维护旧项目用jQuery 1.12.x的时候也碰到过,根源是你尝试对非DOM元素调用了jQuery的css()方法。具体来说,当event.target不是有效的DOM元素(比如元素已被动态销毁、或者某些旧浏览器里事件目标是window/document这类特殊对象),jQuery包装它之后调用css()时,内部会尝试访问defaultView属性,而这个属性在非DOM元素上是undefined,就会抛出这个错误。
针对你的代码,这里有几个实用的修复方案:
方案1:先校验目标元素是否为合法DOM节点
在进行任何DOM操作前,先判断event.target是不是标准DOM元素,再创建jQuery对象:
jQuery(document).bind('mousedown', function (event) { var $active_element; // 先过滤非DOM元素的情况 if (!(event.target instanceof Element)) { return; } var $target = jQuery(event.target); // 执行你的判断逻辑 if ($target.is('[contenteditable]') || $target.css('position') === 'absolute' || $target.css('position') === 'fixed') { return; } // 剩下的业务代码... });
方案2:缓存jQuery对象+判断元素存在性
你原来的代码重复创建了3次jQuery(event.target),既影响性能也增加出错概率,建议缓存起来,同时判断jQuery对象是否包含有效元素:
jQuery(document).bind('mousedown', function (event) { var $active_element; var $target = jQuery(event.target); // 目标元素不存在则直接返回 if (!$target.length) { return; } if ($target.is('[contenteditable]') || $target.css('position') === 'absolute' || $target.css('position') === 'fixed') { return; } // 剩下的业务代码... });
额外提醒:jQuery 1.12.2是比较老旧的版本,对现代浏览器的兼容性和边缘场景处理都有局限,如果项目允许的话,建议升级到兼容的稳定版本;如果暂时不能升级,上面的方案应该能解决你遇到的问题。
内容的提问来源于stack exchange,提问作者Fridez Lucas
相关产品推荐
相关产品推荐

