如何在jQuery中访问新伪选择器中的参数

时间:2013-08-30 08:18:30

标签: javascript jquery regex pseudo-class

我想创建伪选择器: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选择器的参数?

1 个答案:

答案 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]

fiddle