up
This commit is contained in:
parent
f99574f53b
commit
b0976b5253
153 changed files with 590 additions and 533 deletions
|
@ -0,0 +1,2 @@
|
|||
|
||||
Обратите внимание: константы состояний перенесены в прототип, чтобы `AnimatingMenu` их тоже унаследовал.
|
|
@ -0,0 +1,64 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<script src="menu.js"></script>
|
||||
<script>
|
||||
function AnimatingMenu() {
|
||||
Menu.apply(this, arguments);
|
||||
}
|
||||
|
||||
AnimatingMenu.prototype = Object.create(Menu.prototype);
|
||||
|
||||
AnimatingMenu.prototype.STATE_ANIMATING = 2;
|
||||
|
||||
AnimatingMenu.prototype.open = function() {
|
||||
var self = this;
|
||||
|
||||
this._state = this.STATE_ANIMATING;
|
||||
|
||||
this._timer = setTimeout(function() {
|
||||
Menu.prototype.open.call(self);
|
||||
}, 1000);
|
||||
};
|
||||
|
||||
AnimatingMenu.prototype.close = function() {
|
||||
clearTimeout(this._timer);
|
||||
Menu.prototype.close.apply(this);
|
||||
};
|
||||
|
||||
AnimatingMenu.prototype._stateAsString = function() {
|
||||
|
||||
switch (this._state) {
|
||||
case this.STATE_ANIMATING:
|
||||
return 'анимация';
|
||||
|
||||
default:
|
||||
return Menu.prototype._stateAsString.call(this);
|
||||
}
|
||||
};
|
||||
|
||||
// тест, использование..
|
||||
var menu = new AnimatingMenu();
|
||||
|
||||
menu.showState(); // закрыто
|
||||
|
||||
menu.open();
|
||||
menu.showState(); // анимация
|
||||
|
||||
setTimeout(function() { // через 1 секунду
|
||||
menu.showState(); // открыто
|
||||
|
||||
menu.close();
|
||||
menu.showState(); // закрыто
|
||||
}, 1000);
|
||||
</script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,28 @@
|
|||
function Menu(state) {
|
||||
this._state = state || this.STATE_CLOSED;
|
||||
};
|
||||
|
||||
Menu.prototype.STATE_OPEN = 1;
|
||||
Menu.prototype.STATE_CLOSED = 0;
|
||||
|
||||
Menu.prototype.open = function() {
|
||||
this._state = this.STATE_OPEN;
|
||||
};
|
||||
|
||||
Menu.prototype.close = function() {
|
||||
this._state = this.STATE_CLOSED;
|
||||
};
|
||||
|
||||
Menu.prototype._stateAsString = function() {
|
||||
switch (this._state) {
|
||||
case this.STATE_OPEN:
|
||||
return 'открыто';
|
||||
|
||||
case this.STATE_CLOSED:
|
||||
return 'закрыто';
|
||||
}
|
||||
};
|
||||
|
||||
Menu.prototype.showState = function() {
|
||||
alert(this._stateAsString());
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<script src="menu.js"></script>
|
||||
<script>
|
||||
var AnimatingMenu = Menu; // замените на ваш код для AnimatingMenu
|
||||
|
||||
// использование..
|
||||
|
||||
var menu = new AnimatingMenu();
|
||||
|
||||
menu.showState(); // закрыто
|
||||
|
||||
menu.open();
|
||||
menu.showState(); // анимация
|
||||
|
||||
setTimeout(function() {
|
||||
menu.showState(); // открыто
|
||||
|
||||
menu.close();
|
||||
menu.showState(); // закрыто (закрытие без анимации)
|
||||
}, 1000);
|
||||
</script>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -0,0 +1,28 @@
|
|||
function Menu(state) {
|
||||
this._state = state || Menu.STATE_CLOSED;
|
||||
};
|
||||
|
||||
Menu.STATE_OPEN = 1;
|
||||
Menu.STATE_CLOSED = 0;
|
||||
|
||||
Menu.prototype.open = function() {
|
||||
this._state = Menu.STATE_OPEN;
|
||||
};
|
||||
|
||||
Menu.prototype.close = function() {
|
||||
this._state = Menu.STATE_CLOSED;
|
||||
};
|
||||
|
||||
Menu.prototype._stateAsString = function() {
|
||||
switch (this._state) {
|
||||
case Menu.STATE_OPEN:
|
||||
return 'открыто';
|
||||
|
||||
case Menu.STATE_CLOSED:
|
||||
return 'закрыто';
|
||||
}
|
||||
};
|
||||
|
||||
Menu.prototype.showState = function() {
|
||||
alert(this._stateAsString());
|
||||
};
|
|
@ -0,0 +1,15 @@
|
|||
importance: 5
|
||||
|
||||
---
|
||||
|
||||
# Меню с таймером для анимации
|
||||
|
||||
Есть класс `Menu`. У него может быть два состояния: открыто `STATE_OPEN` и закрыто `STATE_CLOSED`.
|
||||
|
||||
Создайте наследника `AnimatingMenu`, который добавляет третье состояние `STATE_ANIMATING`.
|
||||
|
||||
- При вызове `open()` состояние меняется на `STATE_ANIMATING`, а через 1 секунду, по таймеру, открытие завершается вызовом `open()` родителя.
|
||||
- Вызов `close()` при необходимости отменяет таймер анимации (назначаемый в `open`) и передаёт вызов родительскому `close`.
|
||||
- Метод `showState` для нового состояния выводит `"анимация"`, для остальных -- полагается на родителя.
|
||||
|
||||
[edit src="source" title="Исходный документ, вместе с тестом"]
|
Loading…
Add table
Add a link
Reference in a new issue