1

概述

这是我的消息对象。我只希望每个元素允许一个对象。评论中提到的元素。

正如用户所见,每个元素应该只有一条消息。例如,如果用户继续单击按钮,我不想重新实例化更多消息。只需要一个。

我本可以做的一件事是禁用按钮,直到消息显示完毕……但这不是我想要的方式。

Effects.fade() 函数在大约 4 秒后淡出消息。

问题?

如何修改它,使其每个元素只允许一个自身实例?

物体

/**
 *    Message
 */

var Message = function( element ) 
{
    // need only single instance per element..so a singleton pattern per element
    this.element = element;  // This is element where the message is sent
};

Message.prototype.messages = 
{ 
    name:       'Please enter a valid name',
    email:      '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',
};

Message.prototype.display = function( type ) 
{
    Control.send( this.element, this.messages[ type ] );
    var EffectsObject = new Effects( this.element );
    EffectsObject.fade( 'down', 4000);
};

对象的使用

this.message_object = new Message( this.response_element );
this.message_object.display( 'empty' );
4

3 回答 3

2

与现有答案类似,但更符合单例的传统概念:

Message = function(element) {
    if (element.hasOwnProperty("messageInstance")) {
        return element.messageInstance;
    }

    element.messageInstance = this;

    // Remainder of your constructor logic here
};

这样您就不必在一个集中位置跟踪所有标记的元素,并且您可以随意调用new Message(element)多次,并确保您只会返回一个实例。

编辑setAttribute是一种Element专门用于处理 DOM 节点属性的方法(即标签上的东西或href几乎任何东西)。<a>id

相比之下,点表示法或等效的括号表示法 ( element['messageInstance']) 在任意 JavaScript 对象上设置属性。两种方法都可以,但由于messageInstance在技术上不是根据 ( X ) HTML规范的合法属性,因此将其分配为对象属性在技术上更正确。

于 2012-04-07T02:19:32.333 回答
1

或者你可以给元素添加一个自定义属性,然后创建一个新的Message实例,检查是否有自定义属性

Message = function( element ) 
{
    if ( !element.getAttribute("messageInstance")  ){
        // need only single instance per element..so a singleton pattern per element
        this.element = element;  // This is element where the message is sent
        element.setAttribute("messageInstance" , "true");
    } else {
        throw new Error ( "one elem one instance");
    }
};
于 2012-04-07T00:40:54.883 回答
1

您可以在闭包中定义构造函数。

(function () {
    var messageInstances = {};

    Message = function(element) {
        if (messageInstances[element.name])
            return messageInstances[element.name];

        this.element = element;

        messageInstances[element.name] = this;
    }

    Message.prototype.messages = {...};
    Message.prototype.display = {...};

})();

Message标识符在闭包内定义,但没有关键字var,因此可以全局访问。这messageInstances是一个“私有”(在闭包之外无法访问)数组,用于跟踪现有实例。如果Message(element)为给定的第一次调用构造函数element,则会创建一个新对象。如果再次调用,则会在数组中找到之前创建的实例并返回,而不是新创建的对象。

请注意,在此示例中,元素必须通过某些字符串属性来识别,例如name.

于 2012-04-07T00:59:16.530 回答