4
buildIMG = (src, resize) ->
  html  = '<div class="left"><div class="foods_image">'
  html += '<a onclick="popitup("http://somewhere.com/test" href="javascript:void(0)">'
  html += '   <img src="'+src+'" '+resize+' />'  
  html += '</a>'
  html += '</div></div>'
  html

popitup = (url) ->
  newwindow=window.open(url,'name','height=640,width=640')
  newwindow.focus() if window.focus
    false

私は現在、javascript コード (上記のもの) を Web サイトに挿入するブックマークレットを持っています。上記の coffeescript を作成すると、次のように生成されます。

(function() {
  var buildIMG, popitup;

  buildIMG = function(src, resize) {
    var html, nbsp;
    html = '<div class="left"><div class="foods_image">';
    html += '<a onclick="popitup(\'http://somewhere.com/test\');" href="javascript:void(0)">';
    html += '   <img src="' + src + '" ' + resize + ' />';
    html += '</a>';
    html += '</div></div>';
    return html;
  };
  popitup = function(url) {
    var newwindow;
    newwindow = window.open(url, 'name', 'height=640,width=640');
    return newwindow.focus()(window.focus ? false : void 0);
  };
}).call(this);

buildIMG を使用する関数を抜粋しました。この関数は、サイト上にオーバーレイを作成し、そのオーバーレイにすべての画像を表示します。画像ごとに buildIMG が呼び出され、html が作成されます。

問題は、そのonclick="popitup("http://somewhere.com/test"部分が機能しないことです。未定義です。

私が行った解決策は、CoffeeScriptによって生成されたこれを削除することでした:

(function() {

}).call(this);

削除したら直りました。生成された JavaScript のこれらの行に CoffeeScript を入れないようにするにはどうすればよいですか?

4

2 に答える 2

19

CoffeeScript では、オプションにより、このセーフティ ラッパーを使用せずに JavaScript をコンパイルでき--bareます。

于 2012-04-04T10:29:18.037 に答える
5

このドキュメントではわかりやすくするために省略していますが、CoffeeScript の出力はすべて無名関数 (function(){ ... })(); でラップされています。このセーフティ ラッパーは、var キーワードの自動生成と組み合わせることで、グローバル名前空間を誤って汚染することを非常に困難にします。

CoffeScript サイトからのものです。グローバルなメソッドまたは変数を作成したい場合は、

root = this
localProperty = "111"
root.property = localProperty

そして、グローバル スコープでプロパティを取得します。

于 2012-04-04T10:25:57.020 に答える