15

我收到以下控制台消息:

[16:04:01.292] Error: Syntax error, unrecognized expression: unsupported pseudo: invalid @ http://localhost:8080/assets/js/jquery-1.9.1.min.js:4

当我尝试类似的事情时:

if( $(e.target).is(':invalid') ){ ... }

我该如何解决?

这是一个示例: http: //jsfiddle.net/L4g99/ - 尝试更改 jQuery 版本(1.9 后停止工作)

4

3 回答 3

22

按照@JanDvorak 的建议使用querySelectorAll(考虑到这一点,他的回答应该被接受),您可以编写自己的表达式,使.is(':invalid')?

jQuery.extend(jQuery.expr[':'], {
    invalid : function(elem, index, match){
        var invalids = document.querySelectorAll(':invalid'),
            result = false,
            len = invalids.length;

        if (len) {
            for (var i=0; i<len; i++) {
                if (elem === invalids[i]) {
                    result = true;
                    break;
                }
            }
        }
        return result;
    }
});

现在你可以这样做:

if( $(e.target).is(':invalid') ){ ... }

小提琴

于 2013-04-04T20:39:40.623 回答
12

:invalid实际上,它不是一个有效的 jQuery 选择器(伪类)。

但是,根据您发布的链接,它是一个有效的 CSS 选择器(IE<10 不支持)。

Adeneo 的小提琴表明,正如怀疑的那样,虽然它在 jQuery 中不起作用,但可以通过本机querySelector/querySelectorAll方法使用。所以,虽然这不起作用:

if($(e.target).is(":invalid"))  //SyntaxError

这样做(IE<10 除外):

if(~[].indexOf.call(document.querySelectorAll(":invalid"),e.target))

这也应该起作用(在将来或在必要的匀场之后;参见caniuse):

if(e.target.matches(":invalid"))
于 2013-04-04T20:41:03.283 回答
3

您可以使用元素的validity属性(参见MDN)。

现在将它与@adeneo 的想法结合起来:

jQuery.extend(jQuery.expr[':'], {
    invalid : function(elem, index, match){
        return elem.validity !== undefined && elem.validity.valid === false;
    },

    valid : function(elem, index, match){
        return elem.validity !== undefined && elem.validity.valid === true;
    }


});
于 2018-01-11T16:22:08.530 回答