Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.10.2010, 16:18
Аватар для cyberx
Аспирант
Отправить личное сообщение для cyberx Посмотреть профиль Найти все сообщения от cyberx
 
Регистрация: 02.02.2010
Сообщений: 50

Проблема с селекторами
Добрый день. Недавно начал изучать javascript и решил написать функцию примерно как в jquery, но столкнулся с проблемой. Вот сам скрипт

function $Smarty(selector)
 {
	 
  this.undefined  = 'undefined';	
	 
  typeof selector === undefined ? this.selector = '' : this.selector = selector; 	 
			 	 
 };


$Smarty.prototype.trim =  function (string)
 {                
  return string.replace(/ /g,' ').replace(/(^\s+)|(\s+$)/g, "");
 }

$Smarty.prototype.getElement = function (id)
  {		 	
   if(id.substring(0,1) == '#')
    {
	 return document.getElementById(id.replace('#',''));	 
    }
	
   if(id.substring(0,1) == '.')
	{
     // будет выбирать по классам
    }

  }


$Smarty.prototype.select = function()
 {
   var arr = this.trim(this.selector).split(/\s+/),
       count = arr.length;

  if(count == 1)
   {
	return this.getElement(arr.slice(0,1).toString());
   } 				  
			    

  var elements = this.getElement(arr.slice(0,1).toString()).getElementsByTagName('*'),
	  last = this.getElement(arr.slice(count - 1).toString()),
	  i = 0;           

  for (i; i < elements.length; i++)
   {
	 if(elements[i] === last)
	  {	  				    
		return elements[i];
	  }
		
      }
	return false; 						 
   }






$Smarty.prototype.html = function(id)
 {
  return typeof id === this.undefined ? this.select().innerHTML : this.select().innerHTML = id; 	  						
 }


Используется так : new $Smarty('#one #two').html('test text');
Проблема с самыми селекторами, функция их неправильно обрабатывает. Надо найти в div one div two, искать по дочерним элементам, но я беру по document, значит со всей страницы. Не могу собрать алгоритм который искал бы по дочерним элементам. Попытался разобраться в jquery, но не понял как у них обрабатываются селекторы.
Ответить с цитированием
  #2 (permalink)  
Старый 18.10.2010, 16:52
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

Разбивать селектор на простые выборки и в цикле спускаться на уровень/неск. уровней ниже каждый раз.

У меня это реализовано так:

var matches = selector.split( " " ),
result = Q(matches[0]);
for (var i = 1; i < matches.length; i++) {
	result = Q(matches[i], result);
}


Разумеется, ф-ция поиска должна принимать вторым аргументом контекст поиска.
Ответить с цитированием
  #3 (permalink)  
Старый 18.10.2010, 23:30
Аватар для cyberx
Аспирант
Отправить личное сообщение для cyberx Посмотреть профиль Найти все сообщения от cyberx
 
Регистрация: 02.02.2010
Сообщений: 50

Я пару недель как изучить javascript и извините за глупый вопрос. Что поставляется в переменную Q? На пример функция select принимает такое значение
var selector = '#one #two';

// потом добавлю функцию которая определяет это id или class и удаляет первый символ

var matches = selector.split( " " ),
result = Q(matches[0]);
for (var i = 1; i < matches.length; i++)
 {
  result = Q(matches[i], result);
 }


Что тут означает Q?
Ответить с цитированием
  #4 (permalink)  
Старый 19.10.2010, 04:36
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

Функция для поиска элементов.

function Q( selector, context ) {
	// Если в селекторе найдены пробелы, то делаем вот так:
	if (selector.indexOf(" ") !== -1) {
		var matches = selector.split( " " ),
		result = Q(matches[0]);
		for (var i = 1; i < matches.length; i++) {
			result = Q(matches[i], result);
		}
		return result;
	}
	// А если нет, то пропускаем этот участок кода
}

Последний раз редактировалось exec, 19.10.2010 в 04:38.
Ответить с цитированием
  #5 (permalink)  
Старый 20.10.2010, 00:09
Аватар для cyberx
Аспирант
Отправить личное сообщение для cyberx Посмотреть профиль Найти все сообщения от cyberx
 
Регистрация: 02.02.2010
Сообщений: 50

У меня опять также работает, потому что я использую document.getElementById(); Эта функция все время пропускает первый участок кода. Я сделал так и наверно что то не то
function Q( selector, context ) {
	// Если в селекторе найдены пробелы, то делаем вот так:
	if (selector.indexOf(" ") !== -1) {
		var matches = selector.split( " " ),
		result = Q(matches[0]);
		for (var i = 1; i < matches.length; i++) {
			result = Q(matches[i], result);
		}
		return result;
	}
	return document.getElementById(selector);
}
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с Popup окном vovuslik jQuery 5 12.06.2010 16:12
Проблема с CSS COKOJIOB (X)HTML/CSS 5 04.08.2009 14:19
Проблема, в менюшке Большой джо Элементы интерфейса 0 12.07.2009 17:12
Проблема спама lliberty AJAX и COMET 1 12.03.2009 16:47
Проблема с селекторами, одни работают - другие нет Deee_Miles jQuery 4 19.12.2008 23:29