Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проблемы с функцией фильтрации элементов (https://javascript.ru/forum/misc/10742-problemy-s-funkciejj-filtracii-ehlementov.html)

exec 18.07.2010 20:39

Проблемы с функцией фильтрации элементов
 
Есть функция поиска элементов:

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() элементы. Но консоль пишет

Цитата:

Uncaught exception: TypeError: Array.prototype.filter: callbackfn is not a callable object
В чём проблема?

Kolyaj 18.07.2010 21:19

У массивов свой метод filter.

exec 18.07.2010 21:27

Спасибо.

x-yuri 18.07.2010 21:58

и не надо ничего в Object.prototype добавлять

exec 19.07.2010 19:29

Чтобы не создавать новую тему, спрошу здесь ещё раз:

При поиске элементов, заключённых в <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 );
};

Panzermaus 19.07.2010 20:00

ИМХО, вместо
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;

x-yuri 19.07.2010 21:39

Panzermaus, +1

и твоя функция находит копии элементов, а не оригиналы

и вообще странная функция. Разве это надо? Можно конкретный пример? А то мне ничего лучше такого варианта в голову не приходит
Array.prototype.find = function( params ) { 
    var r = [];
    this.each(function( el ){
        r = r.concat( Q(params, el.parentNode) );
    })
    return r;
};

только each надо написать...

а когда в этом Array появится состояние, лучше создать отдельный класс

exec 20.07.2010 06:06

Panzermaus, это тестовый код, сейчас моя задача — сделать так, чтобы он заработал, а скоростной оптимизацией я займусь потом.

x-yuri, спасибо, попробую.

x-yuri 20.07.2010 07:28

Цитата:

Сообщение от exec
При поиске элементов, заключённых в <TD>, к примеру, ф-ция безбожно тормозит и вешает браузер, почему?

Цитата:

Сообщение от exec
это тестовый код, сейчас моя задача — сделать так, чтобы он заработал, а скоростной оптимизацией я займусь потом.

контрадикшн детектед ;)

так а можно конкретный пример использования?

exec 20.07.2010 07:46

Q({"tagName": "P"}).find("tagName": "A"});


Найдёт все ссылки, заключённые в тег P.


Часовой пояс GMT +3, время: 07:44.