bootd
@bootd
Гугли и ты откроешь врата знаний!

Как унифицировать выборку элементов?

Добрый вечер. Столкнулся с такой проблемой, как можно сделать унифицированный способ добавления класса к элементу, если я выбираю селектор разными способами?

https://jsfiddle.net/Lvns0vxo/3/
  • Вопрос задан
  • 486 просмотров
Пригласить эксперта
Ответы на вопрос 3
Во первых, если вы используете именно функцию, то вам необходимо проверять в ней тип элемента, если массив перебирать циклом!
Для лучшего понимания советую вам посмотреть исходник функции addClass в библиотеке jquery, там в принципе все понятно.

Вот мой вариант, немного переписаный, но основанный именно на addClass в jquery:
Array.isArray = function(obj) {
	return /^\[object (NodeList|Array)\]$/.test(Object.prototype.toString.call(obj));
};

Document.prototype.addClass =
DocumentFragment.prototype.addClass =
NodeList.prototype.addClass =
Element.prototype.addClass = function(value) {
	if( typeof value === "string" && value ) {
		var j, current, clazz, finalValue;
		var stripAndCollapse = function(v, a) {
			var tokens = v.match(/[^\x20\t\r\n\f]+/g) || [];

			return a ? tokens : tokens.join(" ");
		},  classList = stripAndCollapse(value, true);

		var list; Array.isArray(this) ? (list = this) : (list = [], list.push(this));

			list.forEach(function(elem, i) {
				// This expression is here for better compressibility (see addClass)
					current = elem.nodeType === 1 && (" " + stripAndCollapse(elem.className) + " ");
				if( current ) {
					j = 0;
					while( (clazz = classList[j++]) ) {
						if( current.indexOf(" " + clazz + " ") < 0 ) {
							current += clazz + " ";
						}
					}

					// Only assign if different to avoid unneeded rendering.
						finalValue   = stripAndCollapse(current);
					if( finalValue !== elem.className ) {
						elem.setAttribute("class", finalValue);
					}
				}
			});
	}

	return this;
};
Ответ написан
dummyman
@dummyman
диссидент-схизматик
https://jsfiddle.net/cen1xxn0/1/
Немного поисправлял. Вы не проверяли, находит он что-нибудь или нет.
Ответ написан
@Mr_Epic
Web программист
https://jsfiddle.net/38fc6q17/1/
Работает с массивом элементов, с набором и отдельным элементом.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы