0

KineticJS を使用しようとしていますが、これに問題があります。

さて、私の JavaScript ファイルの上部に、次のちょっとしたヒントがあります。

var cuin = '';
//...
var cuinShow = new Kinetic.Text({
 x: 320,
 y: 81,
 text: '',
 fontSize: 18,
 fontFamily: 'Lucida Bright',
 fill: 'black'
});

そして、私はこの機能を持っています:

function updateText(){
    cuinShow.setText(cuin);
    return current + getAction() + $.localStorage('difficulty') + " =";
}

テストすると、Chrome は私のコードが気に入らないと言います:

Uncaught TypeError: Cannot call method 'setText' of undefined

今、私はそれがおそらく のスコープと関係があることを知っていますがcuinShow、何がわかりません。また、それが何かを意味する場合 (そうなるとは思いませんが、念のため)、このスクリプトを KineticJS スクリプトと共に外部化しました。html は次のとおりです。

<!DOCTYPE html>
<head><script src="jquery-1.10.2.min.js"></script>
    <script src="jquery.storage.js"></script></head>
<body>
    <div id="container"></div>
    <script src="kinetic-v4.5.4.min.js"></script>
    <script src="kgame.js" defer="defer"></script>
</body>

これについての助けをいただければ幸いです。

4

1 に答える 1

1

Diveyが言ったように、それはスコープの問題である可能性が最も高い.

このjsfiddleを見てください

言及したすべてのコードを同じスコープに次々と配置すると、関数は正常に実行されます。

私の推測では、が含まれていない別の関数内のように、 にアクセスできない場所var cuinShowとして宣言されています。varupdateText()updateText()

var現在のcuinShow宣言から を削除してからvar cuinShow、JS ファイルのグローバル スコープ (または上部) の外で宣言してみてください。

編集:

以下を定義しました。

var ptext = new Kinetic.Text({
  x: 193.5,
  y: 84,
  text: updateText(),
  fontSize: 18,
  fontFamily: 'Lucida Bright',
  fill: 'black'
});

定義する前に:

var cuinShow = new Kinetic.Text({
  name: 'cuinShowName',
  x: 320,
  y: 81,
  text: '',
  fontSize: 18,
  fontFamily: 'Lucida Bright',
  fill: 'black'
});

したがって、 を宣言すると updateText() が呼び出されますがptext、cuinShow はまだ宣言されていません! これは、cuinShowptext の前に宣言することで解決されます。

また、updateText()関数にはいくつかのエラーがあります。

function updateText(){
  console.log(textLayer.get('cuinShow'));
  (textLayer.get('.cuinShowName')).each(setText(cuin));
  return current + getAction() + $.localStorage('difficulty') + " =";
}

次のようになります。

function updateText(){
  textLayer.get('.cuinShowName').each(function() {
    this.setText(cuin)
  });
  return current + getAction() + $.localStorage('difficulty') + " =";
}

setText()その前にオブジェクトが必要なのでthis、関数内で使用する必要がありeachます。

于 2013-07-10T18:08:39.247 に答える