Проверить элемент против querySelector? (используя собственные методы, а не JQuery)

у меня есть элемент. Я хотел бы проверить, соответствует ли он определенному запросу, например ('.someclass') в том же стиле, что и querySelector.

это не так просто, как кажется. элемент.querySelectorAll и элемент.querySelector работать только на наследниками рассматриваемого элемента. Не сам элемент.

var p = document.querySelector('p')

Примечание: строка выше-это только для иллюстрации. В реальной жизни я действительно нашел стихия каким-то другим способом.

p.querySelector('p')

возвращает null. Потому что querySelector работает только с потомками.

Я мог бы сделать:

p.parentNode.querySelector('.someclass')

но это вернет первый дочерний элемент родительского элемента, который может быть другим элементом. Этот код завершится ошибкой, например, если "p" является вторым дочерним элементом родителя.

как я могу проверить, отвечает ли сам элемент запросу?

4 ответов


можно использовать matches() метод.

поддержка может быть найдена в http://caniuse.com/matchesselector


но поскольку это все еще черновик, все браузеры реализуют его с префиксом

  • element.msMatchesSelector( selector ) (IE)
  • element.mozMatchesSelector( selector ) (mozilla)
  • element.webkitMatchesSelector( selector ) (webkit)
  • element.oMatchesSelector( selector ) (Опера)

дополнительно: помощник для использования MatchesSelector в основных браузерах

function matches() {
  var el = document.querySelector('body');
  return ( el.mozMatchesSelector || el.msMatchesSelector ||
           el.oMatchesSelector   || el.webkitMatchesSelector || 
           {name:'getAttribute'} ).name;
}
//=> usage
var someP = document.querySelector('p');
   ,rightClass = someP[matches()]('.someclass');

все-таки /someclass/.test(someP.className) здесь было бы короче;)


не во всех браузерах, но это может быть полезно: http://caniuse.com/matchesselector

пример использования (с MDN страница);

<div id="foo">This is the element!</div>
  <script type="text/javascript">
    var el = document.getElementById("foo");
    if (el.mozMatchesSelector("div")) {//or webkitMatchesSelector("div") in webkit browser or msMatchesSelector("div") in IE9/10
      alert("Match!");
    }
  </script>

Supose единственный другой способ-запустить querySelector и цикл через все элементы тестирования, если он такой же, как у вас уже есть.


как правило, данный элемент e, чтобы проверить, соответствует ли он селектору, вы бы использовали:

var check = false;
var c = e.parentNode.querySelectorAll('selector');
for(var i = 0; i < c.length; i++){
    if (c[i]==e){
        check = true;
    }
}

более краткое, но несколько хакерское решение:

var c = e.parentNode.querySelectorAll('selector');
var check = Array.prototype.indexOf.call(c,e) != -1;

Примечание: check указывает, соответствует ли элемент селектору.

вот демо:http://jsfiddle.net/2vX3z/