1

これが私のhtmlです。

<html>
  <head>
    <script src="closure-library/closure/goog/base.js"></script>
    <script src="hello.js"></script>
  </head>
  <body onload="sayHi()">
  </body>
</html>

そして、これが私のhello.jsファイルです。

var options = {
    "style" : "background:#EEE;"
}

function sayHi() {
  goog.require("goog.dom");
  var header = goog.dom.createDom("h1", options, "hello world");
  goog.dom.appendChild(document.body, header);
}

Chromeコンソールがこのエラーを発行するのはなぜですか?

Uncaught TypeError: Cannot call method 'createDom' of undefined 

一般に、ライブラリから関数を呼び出すのと同じコードブロックにライブラリを要求することはできないと思います。これはドキュメントで見たばかりですが、なぜだろうと思っていました。

4

1 に答える 1

3

コンパイルされていないClosure コードでは、それぞれgoog.require(NAMESPACE)が次の呼び出しになります。

document.write('<script src="SCRIPT_PROVIDING_NAMESPACE"></script>');

依存関係は、 depswriter.py で生成された deps ファイル内の呼び出しで定義さgoog.addDependency(relativePath, provides, requires)ます。Chrome 開発者ツールを使用すると、 [要素] タブに、 deps.jsで定義された Closure Library の依存関係に基づいて動的に挿入されたすべての要素が表示されます。 <script>

あなたの例では、 bodyイベントsayHi()によってトリガーされると、ヘッダーに新しい要素が挿入されます。ただし、この新しい要素はまだ読み込まれていません。したがって、未定義です。onload<script><script>goog.domgoog.dom

hello.jsを次のように変更した場合:

goog.require("goog.dom");

var options = {
    "style" : "background:#EEE;"
}

function sayHi() {
  var header = goog.dom.createDom("h1", options, "hello world");
  goog.dom.appendChild(document.body, header);
}

その後、イベントgoog.require("goog.dom")の前に実行され、挿入された要素はへの呼び出しの前にロードされる可能性があります。 onload<script>dom.jssayHi()

于 2012-06-06T02:23:14.770 に答える