Javascript 从<;调用coffeescript定义的函数;脚本>;在html中?

Javascript 从<;调用coffeescript定义的函数;脚本>;在html中?,javascript,jquery,ruby-on-rails,coffeescript,Javascript,Jquery,Ruby On Rails,Coffeescript,我有一个rails应用程序,我正在用CoffeeScript重写我所有的JS,只是为了检查一下 我知道CoffeeScript编译成JS,但我遇到了一些问题 我正在使用Google Maps API,其中一个html.erb文件中有一个脚本标记,如下所示: <script> initialize() </script> 我把它放在函数定义之后的coffeescript文件的底部,但仍然没有骰子 window["initialize"] = initialize 这实际

我有一个rails应用程序,我正在用CoffeeScript重写我所有的JS,只是为了检查一下

我知道CoffeeScript编译成JS,但我遇到了一些问题

我正在使用Google Maps API,其中一个html.erb文件中有一个脚本标记,如下所示:

<script>
initialize()
</script>
我把它放在函数定义之后的coffeescript文件的底部,但仍然没有骰子

window["initialize"] = initialize

这实际上与CoffeeScript vs JS没有任何关系。但这是因为内联脚本在运行声明
window.initialize
的外部文件之前运行

人们普遍认为内联脚本标记是一种不好的做法。所以,从摆脱它开始

这是如何使用&而不是全局回调函数的示例:

jQuery(function(){
  var apiLoaded = jQuery.Deferred();
  var mapInit = jQuery.Deferred();
  var $map_canvas = $('#map_canvas');

  if ( $map_canvas.length ) {
    google.load("maps", "3", { other_params:'sensor=false', callback: function(){
      apiLoaded.resolve(google);
    }});

    apiLoaded.done(function(g){
      var map = new g.maps.Map($map_canvas[0],{
          center: new google.maps.LatLng(63.399313, 13.082236),
          zoom: 10,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        });
      mapInit.resolve(map);
    });

    mapInit.done(function(map){
      // do something with the map!
    });
  }
});
如果您没有使用jQuery或加载程序,则需要使用轮询来检查是否加载了google maps API:

function init(gmaps){
    // do something with the maps api...
}

function isLoaded(){
  if (!window.google){
    window.setTimeout(function(){ isLoaded() }, 10);
  } else {
     init(window.google.maps);
  }
}

这实际上与CoffeeScript vs JS没有任何关系。但这是因为内联脚本在运行声明
window.initialize
的外部文件之前运行

人们普遍认为内联脚本标记是一种不好的做法。所以,从摆脱它开始

这是如何使用&而不是全局回调函数的示例:

jQuery(function(){
  var apiLoaded = jQuery.Deferred();
  var mapInit = jQuery.Deferred();
  var $map_canvas = $('#map_canvas');

  if ( $map_canvas.length ) {
    google.load("maps", "3", { other_params:'sensor=false', callback: function(){
      apiLoaded.resolve(google);
    }});

    apiLoaded.done(function(g){
      var map = new g.maps.Map($map_canvas[0],{
          center: new google.maps.LatLng(63.399313, 13.082236),
          zoom: 10,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        });
      mapInit.resolve(map);
    });

    mapInit.done(function(map){
      // do something with the map!
    });
  }
});
如果您没有使用jQuery或加载程序,则需要使用轮询来检查是否加载了google maps API:

function init(gmaps){
    // do something with the maps api...
}

function isLoaded(){
  if (!window.google){
    window.setTimeout(function(){ isLoaded() }, 10);
  } else {
     init(window.google.maps);
  }
}

如果您在Coffeescript中正确地重写javascript,从而生成相同的原始代码,那么它应该可以工作。如果没有,你就做错了。。。编译后的javascript输出不符合预期。我使用了一个在线转换器,我猜引入了一个错误。谢谢你的警告。在编写CoffeeScript之后,编译器是否必须重新启动Rails服务器才能创建javascript?如果你知道的话,我只是好奇。再次感谢可能的重复,如果您在Coffeescript中正确重写javascript,那么它将生成相同的原始代码,应该可以工作。如果没有,你就做错了。。。编译后的javascript输出不符合预期。我使用了一个在线转换器,我猜引入了一个错误。谢谢你的警告。在编写CoffeeScript之后,编译器是否必须重新启动Rails服务器才能创建javascript?如果你知道的话,我只是好奇。再次感谢可能的重复,如果您在Coffeescript中正确重写javascript,那么它将生成相同的原始代码,应该可以工作。如果没有,你就做错了。。。编译后的javascript输出不符合预期。我使用了一个在线转换器,我猜引入了一个错误。谢谢你的警告。在编写CoffeeScript之后,编译器是否必须重新启动Rails服务器才能创建javascript?如果你知道的话,我只是好奇。谢谢阿加尼,我会把这个翻译成咖啡剧本留给你。作为一个好孩子,把它放在一个外部文件中。添加了使用轮询而不是Promise的示例。我将把它翻译成咖啡脚本留给您。作为一个好孩子,把它放在一个外部文件中。添加了使用轮询而不是Promise的示例。我将把它翻译成咖啡脚本留给您。做一个好孩子,把它放在一个外部文件中。添加了使用轮询代替承诺的示例