Разобрать Jquery селктор с кастомными указателями?

Доброго дня.



Возможно изобретаю велосипед. Если так — то натолкните на истиный путь.

Суть задачи: Есть Jquery серелктор, но не стандартный а дополненый определенными вещами чтоб можно было выбирать значения аттрибутов, например:

div.border_premium a@href

Превращаю с помощи функции в запрос вида

$('div.border_premium a').each(function(){<br>
var return = $(this).attr('href');<br>
});<br>


Но алгоритм «превращения» очень приметивен и не позволяет анализировать селекторы где больше одного кастомного «костыля» т.к. делаю это сейчас обычным

if (path.match(/'@"/i)) {<br>
	var path=....<br>
}<br>




Что бы хотелось: чтоб можно было разбирать сложные селекторы в вида
div.listItem|table tr td:eq(0)~contents().eq(0).text()
— в преобразованном виде должно стать

$('div.listItem').find('table tr td:eq(0)').each(function (){<br>
var return = $(this).contents().eq(0).text();<br>
});<br>




Собственно вопрос: натолкните на мысль, как последовательно составлять правильно «разборщики» строк так чтоб можно было инкрементально наращивать селекторы
  • Вопрос задан
  • 2977 просмотров
Пригласить эксперта
Ответы на вопрос 2
creage
@creage
Я бы вообще так не делал — вы вводите кастомную логику поверх «стандартных» селекторов jQuery, наполняя ваш код неимовреными рисками. Как в этом всем будет разбираться следующий/новый разработчик? Что будете делать вы, если в Sizzle что-то изменят/добавят, и оно все у вас поломает?

Но все, наверное, зависит от задач.

Если вам нужно выбрать определенные атрибуты коллекции элементов — напишите обертку, что-то типа

function collectAttributes(collection, attribute){
    // тут собираете запрашиваемые атрибуты и возвращаете новую коллекцию
}

и просто натравливаете эту функцию где нужно. Тоже самое касательно остальных селекторов. Если вам нужно

$('div.listItem').find('table tr td:eq(0)').each(function (){
     var return = $(this).contents().eq(0).text();
});

то так и пишите, а не ужас из div.listItem|table tr td:eq(0)~contents().eq(0).text().

P.S. Рекомендую также использовать each2, вместо each — довольно сильно влияет на производительность.

$.fn.extend({
	/*
	* 4-10 times faster .each replacement
	*/
	each2 : function (c) {
		var j = $([0]), i = -1, l = this.length;
		while (
			++i < l
			&& (j.context = j[0] = this[i])
			&& c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
		);
		return this;
	}
});
Ответ написан
denver
@denver
Например, делаем сначала selector.split('~') — получаем 1..2 элемента, второй (если есть) сохраняем на потом, а первому делаем split("|"), получаем еще 1..∞ элементов, самому последнему из них делаем split('@'), вуаля, все распарсили без всяких проверок.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы