Проблема с селекторами
Добрый день. Недавно начал изучать 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, но не понял как у них обрабатываются селекторы. |
Разбивать селектор на простые выборки и в цикле спускаться на уровень/неск. уровней ниже каждый раз.
У меня это реализовано так:
var matches = selector.split( " " ),
result = Q(matches[0]);
for (var i = 1; i < matches.length; i++) {
result = Q(matches[i], result);
}
Разумеется, ф-ция поиска должна принимать вторым аргументом контекст поиска. |
Я пару недель как изучить 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? |
Функция для поиска элементов.
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;
}
// А если нет, то пропускаем этот участок кода
}
|
У меня опять также работает, потому что я использую 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);
}
|
| Часовой пояс GMT +3, время: 04:54. |