Проблемы с функцией фильтрации элементов
Есть функция поиска элементов:
Q = function( params, context ) { if ( !( params instanceof Object || params instanceof Function ) ) { return params; } var elements = ( document || context ).getElementsByTagName( "*" ), finds = []; for ( var i = 0; i < elements.length; i++ ) { if ( typeof params != "function" ) { var a = 0, x = 0; for ( var z in params ) { if ( elements[i][z] == params[z] ) { a++; } x++; } if ( a == x ) { finds.push( elements[i] ); } } else { if ( params.call( elements[i] ) ) { finds.push( elements[i] ); } } } finds.params = params; finds.context = context; return finds; }; И, собственно, сама функция фильтрования: Object.prototype.filter = function( params, context ) { var wrapper = document.createElement( "DIV" ); for ( var i = 0; i < this.length; i++ ) { wrapper.appendChild( this[i] ); } return Q( params, wrapper ); } Казалось бы, всё просто: заносим элементы в обёрточный DIV и ищем в нём через Q() элементы. Но консоль пишет Цитата:
|
У массивов свой метод filter.
|
Спасибо.
|
и не надо ничего в Object.prototype добавлять
|
Чтобы не создавать новую тему, спрошу здесь ещё раз:
При поиске элементов, заключённых в <TD>, к примеру, ф-ция безбожно тормозит и вешает браузер, почему? Вот исходный код ф-ции (это уже другая, для поиска в чилдах): Array.prototype.find = function( params ) { var wrapper = document.createElement( "DIV" ); for ( var i = 0; i < this.length; i++ ) { wrapper.innerHTML += this[i].innerHTML; } return Q( params, wrapper ); }; |
ИМХО, вместо
for ( var i = 0; i < this.length; i++ ) { wrapper.innerHTML += this[i].innerHTML; }лучше написать var html = ''; for ( var i = 0; i < this.length; i++ ) { html += this[i].innerHTML; } wrapper.innerHTML = html; |
Panzermaus, +1
и твоя функция находит копии элементов, а не оригиналы и вообще странная функция. Разве это надо? Можно конкретный пример? А то мне ничего лучше такого варианта в голову не приходит Array.prototype.find = function( params ) { var r = []; this.each(function( el ){ r = r.concat( Q(params, el.parentNode) ); }) return r; }; только each надо написать... а когда в этом Array появится состояние, лучше создать отдельный класс |
Panzermaus, это тестовый код, сейчас моя задача — сделать так, чтобы он заработал, а скоростной оптимизацией я займусь потом.
x-yuri, спасибо, попробую. |
Цитата:
Цитата:
так а можно конкретный пример использования? |
Q({"tagName": "P"}).find("tagName": "A"}); Найдёт все ссылки, заключённые в тег P. |
Часовой пояс GMT +3, время: 07:44. |