在下面的消息中,我使用了该模式,它工作正常。message[] 只有一个实例,它是私有的。显示是公开的,因为这就是我使用对象的方式。
关于第二个对象 - 效果
默认方式,
我打算将 Effects 更新为这种模式只是因为我想让它成为我编写面向对象 JavaScript 的默认方式。
是否还有其他/更好的事情需要考虑,或者这是编写对象的一个很好的起点。
在 C++ 中,默认起点可能是:
class MyClass
{
private:
protected:
public:
};
此外,潜在的低效率
效果只是淡入或淡出一个元素。我将计时器设为元素的属性以避免闪烁。这样做只允许为每个元素设置一个不透明度级别。
然而,这让我相信有时我有多个效果实例在同一个元素上运行。他们只是碰巧在做同样的事情,因为他们共享同一个计时器。
/**
*Message
* element - holds the element to send the message to via .innerHTML
* type - determines the message to send
*/
var Message = ( function ()
{
var messages =
{
name: 'Please enter a valid name',
email: 'Please enter a valid email',
email_s: 'Please enter a valid email.',
pass: 'Please enter passoword, 6-40 characters',
url: 'Please enter a valid url',
title: 'Please enter a valid title',
tweet: 'Please enter a valid tweet',
empty: 'Please complete all fields',
same: 'Please make emails equal',
taken: 'Sorry, that email is taken',
validate: 'Please contact <a class="d" href="mailto:me@host.com">support</a> to reset your password',
};
var Message = function (element)
{
this.element = element;
};
Message.prototype.display = function( type )
{
this.element.innerHTML = messages[ type ];
new Effects().fade( this.element, 'down', 4000 );
};
return Message;
}());
效果
/**
*Effects - build out as needed
* element - holds the element to fade
* direction - determines which way to fade the element
* max_time - length of the fade
*/
var Effects = function( )
{
this.fade = function( element, direction, max_time )
{
element.elapsed = 0;
clearTimeout( element.timeout_id );
function next()
{
element.elapsed += 10;
if ( direction === 'up' )
{
element.style.opacity = element.elapsed / max_time;
}
else if ( direction === 'down' )
{
element.style.opacity = ( max_time - element.elapsed ) / max_time;
}
if ( element.elapsed <= max_time )
{
element.timeout_id = setTimeout( next, 10 );
}
}
next();
}
};