从jQuery 1.4.1迁移至1.9.1时正则选择器插件$.expr报错求助
修复jQuery 1.9.1中老正则选择器插件的报错问题
这个报错的根源是你用的这款老正则选择器插件,它的正则匹配逻辑没跟上jQuery 1.9+版本对选择器解析的变化——插件代码里的match[3]之所以是undefined,是因为它预期的选择器捕获组在jQuery 1.9.1里没有被正确匹配到,导致match数组的长度不够。
下面给你两种可行的解决办法:
方案一:修复插件的匹配逻辑
找到插件的核心代码部分(就是报错那一行所在的函数),把原来的匹配逻辑替换成更健壮的写法,确保能正确提取属性名和正则表达式:
jQuery.expr[':'].regex = function(elem, index, match) { // 修正正则,准确捕获属性和正则内容 var regexParts = match[0].match(/:regex\(([^,]+),\s*(.*?)\)/); // 匹配失败直接返回false,避免报错 if (!regexParts || regexParts.length < 3) { return false; } var propName = regexParts[1].trim(); var regexPattern = regexParts[2].trim(); // 保留原插件的正则匹配逻辑(比如忽略大小写,可根据需求调整) var regex = new RegExp(regexPattern, 'i'); var propValue = jQuery(elem).attr(propName) || ''; return regex.test(propValue); };
这个修改后的代码会先检查匹配结果是否有效,再提取参数,彻底避免了Cannot read property '3' of undefined的错误。
方案二:抛弃老插件,用jQuery原生方法实现
其实jQuery 1.9+的filter()方法已经足够灵活,完全可以替代这个老插件,还能避免插件兼容性问题。把你的原代码替换成下面的写法:
var rows = $("#tableComments").find("tr:visible").filter(function() { // 检查当前元素的class是否不以"th"开头 return !/^th/.test($(this).attr('class') || ''); });
这种写法更直观,不需要依赖第三方插件,稳定性也更强。
内容的提问来源于stack exchange,提问作者keivan sharifi
相关产品推荐
相关产品推荐

