2013-04-04 16 views
12

otrzymuję następujący komunikat konsola:jQuery wsparcie ": nieprawidłowy" 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 

Kiedy próbuję coś takiego:

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

Jak mogę rozwiązać ten problem?

Oto przykład: http://jsfiddle.net/L4g99/ - spróbuj zmienić wersję jQuery (przestaje działać po 1,9)

+1

niestandardowe validators nie suppored po jQuery 1.8 – karthikr

+2

Może to być pomocne http://stackoverflow.com/questions/7815951/jquery-invalid-html- 5-formularz-z-wymagany-wybierz-element –

+0

Zgodnie z tym https://developer.mozilla.org/en-US/docs/CSS/:invalid, ten selektor istnieje. – jldupont

Odpowiedz

19

Korzystanie querySelectorAll jak sugeruje @JanDvorak (i ​​jego odpowiedź powinna być przyjęta do myślenia o tym), można napisać własny wyrażenie, dzięki czemu .is(':invalid') jest ważne?

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

teraz można zrobić:

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

FIDDLE

+0

przepraszam; zabrało mi trochę czasu, aby napisać odpowiedź. –

+0

Twój jest lepszy. Awans. –

+0

działa na chrome 25, FF 19, Opera 12. Dzięki! – jldupont

12

:invalid jest, rzeczywiście, nie jest poprawnym selektor jQuery (pseudoclass).

Jednak zgodnie z the link you posted jest to prawidłowy selektor CSS (nieobsługiwany w IE < 10).

A fiddle by Adeneo pokazuje, że zgodnie z podejrzeniami, mimo że nie działa w jQuery, może być używany przez natywne metody querySelector/querySelectorAll. Tak więc, choć to nie działa:

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

ta ma (z wyjątkiem IE < 10):

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

To powinno działać, jak również (w przyszłości lub po neccessary podkładek, patrz caniuse):

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

+1, nie byłam pewna, czy mam zamiar aby opublikować odpowiedź, ponieważ powinna ona trafić do Ciebie. Nigdy bym nie pomyślał, że rodzimy querySelector będzie na to działał. – adeneo

+1

@adeneo to ty napisałeś skrzypce –

+1

Tak, ale to było głównie kopiowanie/wklejanie z MDN. Tutaj na SO jest *** pokój dla idei faceta! – adeneo

0

można użyć elementu validity atrybut (patrz MDN).

Teraz łącząc ją z ideą @ adeneo za:

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


});