2013-04-04 3 views
12

я получаю следующее сообщение консоли:JQuery поддержки ": недопустимый" Селектор

[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)

+1

пользовательские валидаторы не suppored после JQuery 1.8 – karthikr

+2

Это может быть полезным http://stackoverflow.com/questions/7815951/jquery-invalid-html- 5-form-with-required-select-element –

+0

В соответствии с этим https://developer.mozilla.org/en-US/docs/CSS/:invalid этот селектор существует. – jldupont

ответ

19

Использование querySelectorAll как предложено @JanDvorak (и его ответ должен быть принят для мышления этого), вы можете написать свой собственный выражение, делая .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')){ ... } 

FIDDLE

+0

извините; Мне потребовалось некоторое время, чтобы написать мой ответ. –

+0

Твой лучше. Upvoting. –

+0

работает на chrome 25, FF 19, Opera 12. Спасибо! – jldupont

12

:invalid, действительно, не действительный селектор JQuery (pseudoclass).

В соответствии с the link you posted, однако, это допустимый селектор CSS (не поддерживается в IE < 10).

A fiddle by 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")) 
+1

+1, я не был уверен, чтобы отправить ответ, поскольку это должно пойти вам. Я бы никогда не подумал, что родной querySelector будет работать для этого. – adeneo

+1

@adeneo это вы писали скрипку –

+1

Да, но это было в основном копирование/вставка из MDN. Здесь, на SO, есть *** комната для идеи парня! – adeneo

0

Вы можете использовать атрибут элемента 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; 
    } 


}); 
Смежные вопросы