我想创建伪选择器:regex to anwser这个问题:jQuery Selector with regex并想写完整的例子,但它抛出异常
TypeError: Cannot read property '3' of undefined
我的代码:
jQuery.expr[':'].regex = function(elem, index, match) {
new RegExp(match[3]);
};
当我执行console.log(arguments)
时,它只显示两个参数元素和文档,API是否已更改或更改?如何访问pseduo选择器的参数?
答案 0 :(得分:0)
这可能对您的情况不起作用,但我想在此提供给未来的搜索者。
$.fn.regexFilter = function (expression, flags) {
flags = flags != null ? flags : "g";
if (expression.constructor === String) {
// simple string expression
expression = new RegExp(expression, flags);
} else if (expression.constructor === Array) {
// turns ["a", "b", "c"] into (a)|(b|(c)
expression = new RegExp("(" + expression.join(')|(') + ")", flags);
}
// objects in the form of {expression: "foo", flags: "gim" }
else if (typeof expression === "object" && expression.foo) {
expression = new RegExp(expression.expression, expression.flags != null ? expression.flags : flags);
} else if (expression.constructor !== RegExp) {
// otherwise we assume no mathes
return $();
}
// list of matches
var matches = [];
// list of matching elements
var $matches = this.filter(function () {
var haystack = $(this).text();
var match = haystack.match(expression);
matches.push(match);
$(this).data('match', match);
return !!match;
});
$matches.matches = matches;
return $matches;
};
这些都是等效的,并将任何<p>
与以“c”开头的单词匹配:
$('p').regexFilter('\\bc\\w+', 'g').css({
color: 'green'
});
$('p').regexFilter(/\bc\w/g).css({
color: 'green'
});
$('p').regexFilter({expression: '\\bc\\w+', flags: 'g'}).css({
color: 'green'
});
您还可以在任何函数中检索子匹配。这里我们匹配前两个单词。第二个词存储在第1组中。
$('p').regexFilter(/^\w+\s(\w+)/).each(function () {
var match = $(this).data('match');
var oldText = ["the second word of <i>", $(this).text(), "</i> is", match[1]].join(" ");
$(this).html(oldText);
});
您也可以获取所有元素的匹配数组。
var $matchedElements = $('p').regexFilter(/^\w+\s(\w+)/);
var matches = $matchedElements.matches;
matches[3][1] // the second word of the 4th p
请注意,此匹配数组不会保留,并且数组中将存在nulls
。所以第4个p是$(p)[3]
,而不是$matchedElements[3]
。