【问题标题】:Calling coffeescript defined function from <script> in html?从html中的<script>调用coffeescript定义的函数?
【发布时间】:2015-06-08 12:07:12
【问题描述】:

我有一个 Rails 应用程序,我正在用 CoffeeScript 重写我所有的 JS 来检查它。

我了解 CoffeeScript 可以编译为 JS,但我遇到了一些问题。

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

<script>
initialize()
</script>

现在我的初始化可以正常工作,因为它只是用 javascript 编写的,但现在我有一个 coffeescript 函数,而不是浏览器控制台说:

"Uncaught ReferenceError: initialize is not defined"

我把它放在函数定义后的coffeescript文件的底部,但仍然没有骰子。

window["initialize"] = initialize

【问题讨论】:

  • 如果你正确地重写了 Coffeescript 中的 javascript,它会产生相同的原始代码,它应该可以工作。如果没有,你做错了什么...编译的 javascript 输出不符合预期。
  • 我使用了一个在线转换器,我猜是引入了一个错误。谢谢你的提醒。编写 CoffeeScript 后是否必须重新启动 Rails 服务器才能让编译器创建 javascript?只是好奇你是否知道。再次感谢

标签: javascript jquery ruby-on-rails coffeescript


【解决方案1】:

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

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

这是一个示例,说明如何使用 google loaderjQuery.Deferred 代替全局回调函数:

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 交给你。做个好孩子,把它放在一个外部文件中。
  • 添加了使用轮询代替承诺的示例
猜你喜欢
  • 2018-05-30
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 2011-12-10
  • 2011-11-23
  • 1970-01-01
相关资源
最近更新 更多