0

スペースバーを押すと、chromeはエラーを表示します:「UncaughtTypeError:Object#has nomethod'Spacebar'」

(Firefoxは「this.Spacebarは関数ではありません」と言っています);

これが「Init();」によって初期化されるオブジェクトです。(ページの読み込み時...):

function KeyManager() { 
this.mode="none";

this.Spacebar = ChatManagement.submitMessage;
this.KeyPress = function(e) {
        if(e.keyCode==13) {
            this.Spacebar();
        }
    }
this.switchKeySet= function(value) {
    if(this.mode!=value) {
        this.mode=value;
        switch(value) {
            case "login":
            this.Spacebar = LoginManagement.SendLogin;
            break;
            case "chat":
            this.Spacebar = ChatManagement.submitMessage;
            break;              
            default:
            case "none":
            break;
        }
    document.onkeypress=this.KeyPress;
    }
}

初期化関数:

function Init() {
ChatManagement = new ChatManager();
LoginManagement= new Login();
KeyManagement= new KeyManager();
KeyManagement.switchKeySet("chat");
}

チャット管理オブジェクト:

function ChatManager() {
this.submitMessage = function() {
    $("Message").focus();
    var text = $("Message").value; 
    if(text==""){  
        this.write('<p class="warning">Please enter a message');  
        return;  
    }  
    try{ 
        SendMessage(text);  
        this.write('<p class="event">Sent: '+text)  
    } catch(exception){  
    this.write('<p class="warning"> Error:' + exception);  
    } 
    $("Message").value="";
}

}

ChatManagerの「this.submitMessage()」が機能する

「console.log(this.Spacebar);」を使用する場合 「switchKeySet();」の最後 「this.submitMessage()」のコードを取得します。

「this.KeyPress()」の開始時に使用すると、「undefined」になります。

この場合の関数を持つ複数のswitchステートメントとjavascript-libariesを避けようとしています.....

誰かがエラーがどこにあるか知っていますか?iveは、「this.spacebar」が未定義の「this.submitMessage」を取得するように感じましたが、initは最初にChatManagerを初期化し、initが完了した後にスペースバーを押します。

(または、私が試したように関数を渡すことはできませんか?)%_%。

4

1 に答える 1

1

ここでの問題は、this.KeyPressの関数に入るときに、「this」キーワードが異なる意味をとることにあります。

this.Spacebar = ChatManagement.submitMessage; // 'this' refers to the KeyManager function 
this.KeyPress = function(e) { 
        if(e.keyCode==13) { 
            this.Spacebar(); // 'this' refers to the caller of the function (keypress event)
        } 
    } 
 ....
    document.onkeypress=this.KeyPress;  
  }

「this」キーワードはどのように機能しますか?への回答を確認してください。より鮮明な画像を得るには、コードを次のように変更する必要があるようです。

function KeyManager() {
var self = this;      
self.mode="none";     

self.Spacebar = ChatManagement.submitMessage;     
self.KeyPress = function(e) {     
        if(e.keyCode==13) {     
            self.Spacebar();     
        }     
    }     
self.switchKeySet= function(value) {     
    if(self.mode!=value) {     
        self.mode=value;     
        switch(value) {     
            case "login":     
            self.Spacebar = LoginManagement.SendLogin;     
            break;     
            case "chat":     
            self.Spacebar = ChatManagement.submitMessage;     
            break;                   
            default:     
            case "none":     
            break;     
        }     
    document.onkeypress=self.KeyPress;     
    }     
}     
于 2012-05-03T04:56:35.803 に答える