Проблема с селекторами
Добрый день. Недавно начал изучать 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, время: 08:58. |