0

cardSelection()からメソッドを呼び出そうとしていますfunction game()が、代わりに、「メソッド cardSelection() がありません」という関数全体をスローするエラー レポートが表示されます。アイデアは、ボタンをクリックしてメソッドにアクセスすることです。 、この HTML タグは次のとおりです。

<img id="PlayerCard0" class="card" src="images/Cards/Mario.png" alt="Mario" title="Mario" onclick="game.cardSelection('PlayerCard0')">

game()とにかく、これは単なる宣言エラーの場合であると信じておりcardSelection()、次のように宣言されているため、Javascript全体を投稿していません。

function game()
{
...
this.cardSelection = function(card)
{
    var cardElem = document.getElementById(card);
    var id = cardElem.getAttribute("id");
    var call = document.getElementById("call");

    var select = function(card)
    {


        var found = 0;
        for (var card = 0, totalCards = 5; card < totalCards; card++)
        {
            if (document.getElementById("PlayerCard" + card + "selected"))
            {found++}
        }
        if (found == 0)
        {
            call.setAttribute("onclick", "changeHand()");
            call.childNodes[0].nodeValue = "Change";
        }
        if (found < 3)
        {
            id += "selected"
            setAttributes(cardElem,
            {
                "id" : id,
                "style": "position: relative; top: 1em;",
                "onclick" : "cardSelection('" + id + "')"
            });
        }
        else { return; }
    }
    var unselect = function (card)
    {
        cardElem.removeAttribute("style");
        id = id.replace("selected","");
        setAttributes(cardElem,
        {
            "id" : id,
            "onclick" : "cardSelection('" + id + "')"
        });
        var cardNumber = 0;
        var found = false;
        while (cardNumber < 5 && !found)
        {
            if (document.getElementById("playerCard" + cardNumber + "selected"))
            {found = true;}
            cardNumber++;
        }
        if (!found)
        {
            call.setAttribute("onclick", "compareHands()");
            call.childNodes[0].nodeValue = "Hold";
        }
    }
    if (id.indexOf("selected") >= 0){unselect(card);}
    else {select(card);}
    }
    ...
}

呼び方game()

window.onload = function openingScreen()
{
    var startGame = document.createElement("a");
    startGame.setAttribute("onclick", "game()");
    startGame.appendChild(document.createTextNode("Play"));
    window.table = document.getElementById("table");
    table.appendChild(startGame);
}
4

1 に答える 1

0

あなたが経験している問題は、JavaScript のオブジェクト/クラス/インスタンスに関する混乱の結果です。

new game()この問題に関する重要な点は、との違いgame()です。

var foo = new game()
  • JS エンジンに新しいオブジェクトを作成するよう指示します
  • そのオブジェクトのプロトタイプ (ではないprototype) を にgame向けるprototype
  • 次に、関数ゲームを呼び出しますが、その関数の本体のためthisに、作成されたオブジェクトを参照します。
  • 関数がオブジェクトを返さない場合は、作成したオブジェクトを割り当てますfoo(そうでない場合は、関数の戻り値をfoo

ゲーム関数の本体内には、this.cardSelection = function (.... game単純に関数として呼び出す場合は、キーワードgame()なしで、関数本体内の だけがウィンドウ オブジェクトになります。したがって、window オブジェクトに追加します。newthiscardSelection

また重要なことは、 functionのプロパティとして名前が付けられた関数game.cardSelection()を探していることです。cardSelection game

動作するそのスタイルの使用例を次に示します。

var foo = function () {
    //do interesting stuff
}

foo.bar = function () {
    //do interesting stuff related to foo
}

foo.bar();

あなたが期待しているように見えるものは、このように書く必要があります:

var game = function () {
    this.cardSelection = function () {
        //perform card selection!
    }
}

var aGame = new game();

aGame.cardSelection();

または、cardSelectionゲームのプライベート プロパティにアクセスする必要がない場合は、次のようにより効率的に記述できます。

var game = function () {
   //setup the game
};

game.prototype.cardSelection = function () {
   //perform card selection
};

var aGame = new game();

aGame.cardSelection();
于 2013-12-16T05:32:50.553 に答える