Прежде всего позвольте мне извиниться, если мой вопрос не сформулирован правильно - я не профессиональный кодер, поэтому моя терминология может быть странной. Я надеюсь, что мой код не слишком смущает :(Напишите объект обертки в Javascript
У меня есть метод fade()
, который затухает изображение взад и вперед с помощью опрокидывания мыши. Я хотел бы использовать объект-оболочку (я думаю, что это правильный термин) для хранения элемента изображения и нескольких требуемых свойств, но я не знаю, как это сделать. fade()
вызывается из HTML и предназначен для удаления на страницу без дополнительной настройки (чтобы я мог легко добавлять новые выцветания изображения в любой HTML), так же, как это:
<div id="obj" onmouseover="fade('obj', 1);" onmouseout="fade('obj', 0);">
метод fade(obj, flag)
начинает SetInterval, который затухает изображение, и когда указатель перемещается в сторону, интервал очищается и новый SetInterval создан, чтобы вытеснить изображение. Чтобы сохранить состояние непрозрачности, я добавил несколько свойств к объекту: obj.opacity
, obj.upTimer
и obj.dnTimer
.
Все работает нормально, но мне не нравится идея добавления свойств к элементам HTML, поскольку это может привести к будущей ситуации, когда какой-либо другой метод перезаписывает эти свойства. В идеале, я думаю, что должен быть задействован объект-оболочка, но я не знаю, как это сделать, без добавления кода для создания объекта при загрузке страницы. Если у кого-нибудь есть предложения, я был бы очень признателен!
Вот мой метод фейдер:
var DELTA = 0.05;
function fade(id, flag) {
var element = document.getElementById(id);
var setCmd = "newOpacity('" + id + "', " + flag + ")";
if (!element.upTimer) {
element.upTimer = "";
element.dnTimer = "";
}
if (flag) {
clearInterval(element.dnTimer);
element.upTimer = window.setInterval(setCmd, 10);
} else {
clearInterval(element.upTimer);
element.dnTimer = window.setInterval(setCmd, 10);
}
}
function newOpacity(id, flag) {
var element = document.getElementById(id);
if (!element.opacity) {
element.opacity = 0;
element.modifier = DELTA;
}
if (flag) {
clearInterval(element.dnTimer)
element.opacity += element.modifier;
element.modifier += DELTA; // element.modifier increases to speed up fade
if (element.opacity > 100) {
element.opacity = 100;
element.modifier = DELTA;
return;
}
element.opacity = Math.ceil(element.opacity);
} else {
clearInterval(element.upTimer)
element.opacity -= element.modifier;
element.modifier += DELTA; // element.modifier increases to speed up fade
if (element.opacity < 0) {
element.opacity = 0;
element.modifier = DELTA;
return;
}
element.opacity =
Math.floor(element.opacity);
}
setStyle(id);
}
function setStyle(id) {
var opacity = document.getElementById(id).opacity;
with (document.getElementById(id)) {
style.opacity = (opacity/100);
style.MozOpacity = (opacity/100);
style.KhtmlOpacity = (opacity/100);
style.filter = "alpha(opacity=" + opacity + ")";
}
}
Спасибо Феликс, я бы предпочел избежать JQuery, пока не узнаю веревки Javascript, это очень поможет. Хотя, я теперь полностью озадачен объемом переменных Javascript. Я не понимаю, почему 'init()' и 'fade()' можно увидеть за пределами возвращаемого блока:/ – SpaceJunk
@SpaceJunk: см. Мое обновление. Надеюсь, это поможет. Вы можете увидеть эту функцию, потому что 'return {...}' на самом деле не является блоком, это объектная запись для определения объектов. Это будет одно и то же: 'var obj = {init: function() {...}}; return obj; '. Обратите внимание, что я также немного изменил код и переместил 'DELTA' в непосредственную функцию. Это должно работать лучше с вашим кодом. Если у вас есть дополнительные вопросы, просто спросите. –