Проблемы с функцией фильтрации элементов
Есть функция поиска элементов:
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, время: 00:49. |