2013-04-04 3 views
12

erhalte ich die folgende Konsolenmeldung:jQuery Unterstützung ": ungültig" Selektor

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

Wenn ich versuche, so etwas wie:

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

Wie behebe ich das?

Hier ist ein Beispiel: http://jsfiddle.net/L4g99/ - versuchen, die jQuery-Version zu wechseln (stoppt nach 1,9 Arbeits)

+1

benutzerdefinierte Validatoren sind nicht suppored nach jquery 1.8 – karthikr

+2

Dies könnte hilfreich sein http://stackoverflow.com/questions/7815951/jquery-invalid-html- 5-form-with-required-select-element –

+0

Gemäß diesem https://developer.mozilla.org/en-US/docs/CSS/:invalid existiert dieser Selektor. – jldupont

Antwort

19

Mit querySelectorAll von @JanDvorak vorgeschlagen, wie (und seine Antwort sollte denken, dass angenommen werden), können Sie Ihre eigenen schreiben Ausdruck, machen .is(':invalid') gültig?

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

jetzt können Sie tun:

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

FIDDLE

+0

Entschuldigung; dauerte eine Weile, um meine Antwort zu schreiben. –

+0

Deines ist besser. Upvoting. –

+0

funktioniert auf Chrom 25, FF 19, Opera 12. Danke! – jldupont

12

:invalid sind in der Tat keine gültigen jQuery-Selektor (Pseudoklasse).

Laut the link you posted ist es jedoch ein gültiger CSS-Selektor (nicht unterstützt in IE < 10).

A fiddle by Adeneo zeigt, dass, wie vermutet wird, während es nicht in jQuery funktioniert, kann es über die nativen querySelector/querySelectorAll Methoden verwendet werden. Also, während das nicht funktioniert:

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

Dies gilt (außer in IE < 10):

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

Dies sollte auch funktionieren (in der Zukunft oder nach dem notwendigen Shim, siehe caniuse):

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

+1, ich war mir nicht sicher, ob oder nicht um eine Antwort zu posten, da dies zu dir gehen sollte. Ich hätte nie gedacht, dass der native querySelector dafür funktionieren würde. – adeneo

+1

@adeneo es war du, der die Geige geschrieben hat –

+1

Ja, aber das war hauptsächlich Kopieren/Einfügen von MDN. Hier auf SO gibt es *** Raum für den Ideenkerl! – adeneo

0

Sie validity Attribut des Elements verwenden können (siehe MDN).

Jetzt ist es mit @ adeneo Idee kombiniert:

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


});