1

概要

これが私のメッセージオブジェクトです。要素ごとに1つのオブジェクトのみを許可したい。コメントに記載されている要素。

ユーザーに表示されるように、要素ごとに1つのメッセージのみが存在する必要があります。たとえば、ユーザーがボタンをクリックし続ける場合、それ以上のメッセージを再インスタンス化したくありません。必要なのは1つだけです。

メッセージの表示が終了するまでボタンを無効にすることもできましたが、それは私がやりたい方法ではありません。

Effects.fade()関数は、約4秒後にメッセージをフェードアウトします。

質問?

これを変更して、要素ごとにそれ自体のインスタンスを1つだけ許可するようにするにはどうすればよいですか?

オブジェクト

/**
 *    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)何度でも電話をかけることができ、1つのインスタンスしか戻らないことを確認できます。

EDIT:は、 DOMノードの属性(つまり、タグやその他のほとんどすべてのもの)を処理するためのメソッドですsetAttributeElementhref<a>id

比較すると、ドット表記、または同等のブラケット表記(element['messageInstance'])は、任意のJavaScriptオブジェクトのプロパティを設定します。どちらのアプローチでも機能しますが、messageInstanceは( XHTML仕様によると技術的には正当な属性ではないため、オブジェクトプロパティとして割り当てる方が技術的には正確です。

于 2012-04-07T02:19:32.333 に答える
1

または、要素にカスタム属性を追加してから、新しいメッセージインスタンスを作成し、カスタム属性があるかどうかを確認することもできます

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 に答える