jQuery support “:invalid” selector

2019-01-07 19:15发布

问题:

I get the following console message:

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

When I try something like:

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

How do I fix this?

Here's an example: http://jsfiddle.net/L4g99/ - try changing the jQuery version (stops working after 1.9)

回答1:

Using querySelectorAll as suggested by @JanDvorak (and his answer should be accepted for thinking of that), you can write your own expression, making .is(':invalid') valid ?

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;
    }
});

now you can do :

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

FIDDLE



回答2:

:invalid is, indeed, not a valid jQuery selector (pseudoclass).

According to the link you posted, however, it is a valid CSS selector (not supported in IE<10).

A fiddle by Adeneo shows that, as suspected, while it doesn't work in jQuery, it can be used via the native querySelector/querySelectorAll methods. So, while this doesn't work:

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

This does (except in IE<10):

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

This should work as well (in the future or after the neccessary shimming; see caniuse):

if(e.target.matches(":invalid"))


回答3:

You can use element's validity attribute (see MDN).

Now combining it with @adeneo's idea:

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;
    }


});