21

ボックスを生成して警告する次のcoffeescriptコードがあります。

show_alert = () ->
  alert("Hello! I am an alert box!")

これは次のようにコンパイルされます:

(function() {
  var show_alert;

  show_alert = function() {
    return alert("Hello! I am an alert box!");
  };

}).call(this);

私のhtmlには次のものがあります

<input onclick='show_alert()' type='button' value='Show alert box' />

しかし、警告ボックスが表示されませんか? 以下は、ブラウザからコピーされた html です。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <title>Test Rails Application</title>
    <style type='text/css'>.application h1 {
  color: lime; }
</style>
    <script type='text/javascript'>(function() {
  var show_alert;

  show_alert = function() {
    return alert("Hello! I am an alert box!");
  };

}).call(this);
</script>
  </head>
  <body>
    <h1>Hello from applicaiton.html.haml</h1>
    <div class='application'><h1>Hello World</h1>
<input onclick='show_alert()' type='button' value='Show alert box' />
</div>
  </body>
</html>

警告ボックスを表示できないのはなぜですか?

4

3 に答える 3

23

あなたの問題は、生成された JavaScript コードが別のスコープにあることです。-bパラメータをcoffeescriptコンパイラに追加するか、関数を明示的にエクスポートして、これを解決する必要があります

root = exports ? this
root.show_alert = () -> alert("Hello! I am an alert box!")

エクスポートとスコープの問題の詳細については、https://stackoverflow.com/a/4215132/832273をご覧ください。

上記のcoffeescriptコードで動作するjsfiddleを作成しました

于 2012-05-05T05:01:38.143 に答える
11

この問題を解決するには、関数名の前に最初に @ を追加する 2 つの方法を見つけました

@say_hi = () ->
  $(alert('Hello!!!'))

コーヒーファイル追加の最後の 2 番目

window["say_hi"] = say_hi
于 2014-06-09T11:31:24.900 に答える
4

Coffeescrptコードで、関数をウィンドウに保存してみてください。window["show_alert"] = show_alert

于 2012-05-05T04:42:34.263 に答える