Очередной черновик по селекторам
На W3.org выложили очередной черновик по Selector API 2, кому интересно вот. Что больше поразило, воткнули пару новых методов, особо сильно не отличающих от querySelector/querySelectorAll называются find/findAll отличия лишь в том что можно будет указывать контекст поиска вторым параметром. Ну и еще matches укороченный.
|
Хорошая Новость!
|
Цитата:
Element.prototype.find = Document.prototype.find = DocumentFragment.prototype.find = function( selector, context ) {
return ( context || this ).querySelector( selector );
}
Element.prototype.findAll = Document.prototype.findAll = DocumentFragment.prototype.findAll = function( selector, context ) {
return ( context || this ).querySelectorAll( selector );
}
|
вот если бы они добавили в NodeList подобные методы, цены бы небыло. Что-то типо этого:
document.querySelectorAll('div[data-lala="tratat"]').find('a');
то-есть искать в найденном ранее. что бы не делать так:
var result = [], a = document.querySelectorAll('div[data-lala="tratat"]');
for( var i = 0; i < a.length; i++ ) {
result = result.concat( a[ i ].querySelectorAll('a') );
}
цены бы им не было.. а так да добавили ерунду. |
Цитата:
<div><a></a></div>
<div><a></a></div>
<script>
alert( document.querySelectorAll('div').querySelectorAll('a'));
</script>
у меня в консоле вот что:
[29.06.2012 20:48:30] JavaScript - http://lookatcode.com/showhtml
Inline script thread
Uncaught exception: TypeError: 'document.querySelectorAll('div').querySelectorAll' is not a function
Error thrown at line 2, column 4 in http://lookatcode.com/showhtml:
alert( document.querySelectorAll('div').querySelectorAll('a'));
а у тебя что то иное чтоль? |
Цитата:
|
Цитата:
var blocks = jQuery("div.blocks");
blocks.click(function() {
// ... some code
var spans = blocks.find( 'span.tratata' ).show(); // ищем в уже найденном ранее списке.
// ... some code
spans.find("b").html( '' ); // так же ищем в уже найденном списке
// ... some code
});
а если писать постоянно вбивая одни и те же селекторы то будет выглядеть так:
jQuery("div.blocks").click(function() {
// ... some code
jQuery("div.blocks span.tratata" ).show();
// ... some code
jQuery("div.blocks span.tratata b").html( '' );
// ... some code
});
куда удобнее и производительный вариант выше |
вообщем очень было бы не плохо иметь подобную реализацию:
NodeList.prototype.querySelector = function( selector ) {
var elem, listLength = this.length;
for( var i = 0; i < listLength; i++ ) {
if ( elem = this[ i ].querySelector( selector ) ) {
return elem;
}
}
return null;
}
NodeList.prototype.querySelectorAll = function( selector ) {
var result = [], // Instead the Array, use NodeList
listLength = this.length;
for( var i = 0; i < listLength; i++ ) {
result = result.concat( Array.prototype.slice.call( this[ i ].querySelectorAll( selector ), 0 ) );
}
return result;
}
// но назначение прототипов объекту NodeList эфекта никакого не дает
// тоесть сделав такую хрень:
alert( document.querySelectorAll('div').querySelectorAll ); // получим undefined
// браузеры не добавляют пользовательский метод экземпляру NodeList
// хотя тестил я тока в опере.
|
Цитата:
|
Цитата:
Да и в принципе оно есть, но не совсем полноценное. Возьми к примеру getElementsByTagName он же возвращает NodeList и при поиске можно указать контекст, но лишь из отдного элемента а не из списка. А в джуквери а точнее во всех селекторах написанных людьми, можно список элементов указать в контексте. |
| Часовой пояс GMT +3, время: 20:39. |