Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.07.2010, 20:39
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

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

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
В чём проблема?
Ответить с цитированием
  #2 (permalink)  
Старый 18.07.2010, 21:19
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

У массивов свой метод filter.
Ответить с цитированием
  #3 (permalink)  
Старый 18.07.2010, 21:27
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

Спасибо.
Ответить с цитированием
  #4 (permalink)  
Старый 18.07.2010, 21:58
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

и не надо ничего в Object.prototype добавлять
Ответить с цитированием
  #5 (permalink)  
Старый 19.07.2010, 19:29
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

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

При поиске элементов, заключённых в <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 );
};
Ответить с цитированием
  #6 (permalink)  
Старый 19.07.2010, 20:00
Аспирант
Отправить личное сообщение для Panzermaus Посмотреть профиль Найти все сообщения от Panzermaus
 
Регистрация: 14.07.2010
Сообщений: 43

ИМХО, вместо
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;
Ответить с цитированием
  #7 (permalink)  
Старый 19.07.2010, 21:39
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

Panzermaus, +1

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

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

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

а когда в этом Array появится состояние, лучше создать отдельный класс
Ответить с цитированием
  #8 (permalink)  
Старый 20.07.2010, 06:06
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

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

x-yuri, спасибо, попробую.
Ответить с цитированием
  #9 (permalink)  
Старый 20.07.2010, 07:28
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

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

так а можно конкретный пример использования?
Ответить с цитированием
  #10 (permalink)  
Старый 20.07.2010, 07:46
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

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


Найдёт все ссылки, заключённые в тег P.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрый разбор списка элементов. B~Vladi Общие вопросы Javascript 31 14.07.2010 15:52
Выбор элементов и построение списка выбранных элементов. madgals Events/DOM/Window 6 14.04.2009 22:30
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37
Drug&Drop + всплывание события = проблемы =(( _NoName_ Events/DOM/Window 4 05.03.2009 17:47
Создание элементов createElement в IE. Phoenix Общие вопросы Javascript 6 26.09.2007 19:43