renovations

This commit is contained in:
Ilya Kantor 2015-01-11 01:54:57 +03:00
parent 4b8b168fd2
commit c7d4c7e3ff
172 changed files with 869 additions and 244 deletions

View file

@ -0,0 +1,11 @@
function addClass(obj, cls) {
var classes = obj.className ? obj.className.split(' ') : [];
for(var i=0; i<classes.length; i++) {
if (classes[i] == cls) return; // класс уже есть
}
classes.push(cls); // добавить
obj.className = classes.join(' '); // и обновить свойство
}

View file

@ -0,0 +1,27 @@
describe("addClass", function() {
it("добавляет класс, которого нет", function() {
var obj = { className: 'open menu' };
addClass(obj, 'new');
assert.deepEqual(obj, {
className: 'open menu new'
});
});
it("не добавляет класс, который уже есть", function() {
var obj = { className: 'open menu' };
addClass(obj, 'open');
assert.deepEqual(obj, {
className: 'open menu'
});
});
it("не добавляет лишних пробелов, который уже есть", function() {
var obj = { className: '' };
addClass(obj, 'open');
assert.deepEqual(obj, {
className: 'open'
});
});
});

View file

@ -0,0 +1,28 @@
Решение заключается в превращении `obj.className` в массив при помощи `split`.
После этого в нем можно проверить наличие класса, и если нет - добавить.
```js
//+ run
function addClass(obj, cls) {
var classes = obj.className ? obj.className.split(' ') : [];
for(var i=0; i<classes.length; i++) {
if (classes[i] == cls) return; // класс уже есть
}
classes.push(cls); // добавить
obj.className = classes.join(' '); // и обновить свойство
}
var obj = { className: 'open menu' };
addClass(obj, 'new');
addClass(obj, 'open');
addClass(obj, 'me');
alert(obj.className) // open menu new me
```
P.S. "Альтернативный" подход к проверке наличия класса вызовом `obj.className.indexOf(cls)` был бы неверным. В частности, он найдёт `cls = "menu"` в строке классов `obj.className = "open mymenu"`.
P.P.S. Проверьте, нет ли в вашем решении присвоения `obj.className += " " + cls`. Не добавляет ли оно лишний пробел в случае, если изначально `obj.className = ""`?

View file

@ -0,0 +1,23 @@
# Добавить класс в строку
[importance 5]
В объекте есть свойство `className`, которое содержит список "классов" - слов, разделенных пробелом:
```js
var obj = {
className: 'open menu'
}
```
Создайте функцию `addClass(obj, cls)`, которая добавляет в список класс `cls`, но только если его там еще нет:
```js
addClass(obj, 'new'); // obj.className='open menu new'
addClass(obj, 'open'); // без изменений (класс уже существует)
addClass(obj, 'me'); // obj.className='open menu new me'
alert(obj.className); // "open menu new me"
```
P.S. Ваша функция не должна добавлять лишних пробелов.