新手问题 coffeescript 使用简单问题

realwol · 2013年07月24日 · 最后由 Perish 回复于 2013年08月05日 · 3062 次阅读

rails 版本是 3.2

home.js.coffee 文件中

alert("1")
divover = (flag) ->
   if 1==flag
      $('#div1').css("opacity",".95")
   else if 2==flag
     $('#div2').css("opacity",".95")

home/index.html.erb 中有如下一行:

<div class="hero-unit center container-opacity" onmouseover="divover(1)"  id="div1" >

问题是:访问 home/index 页面的时候,会弹框,可是 onmouseover 之后没效果,如果换成普通 js 就没问题。我自己分析如果 alert 可以运行,那证明文件引用正确,可是为什么函数调用有问题呢,还请指点。还需要什么文件,可以说。 对了补充一点,将上边 coffee 代码编译为 js 后如下:

var divover;

divover = function(flag) {
  if (1 === flag) {
    return $('#div1').css("opacity", ".95");
  } else if (2 === flag) {
    return $('#div2').css("opacity", ".95");
  }
};

coffee 里需要暴露到全局作用域的东西,用 window

window.divover = (flag) ->
  ...

不是给你这么玩的。coffee 做了限制,默认域是隔离的。你要这么干就是一楼的做法,赋值给全局的 window。

提倡的写法是定义 class 或者 id,比如加入id="xxxdiv1"

然后 coffee 这么写

$("xxxdiv1").mouseover  (flag)-> 
  if .....

#1 楼 @luikore 加上 window 之后可以了。但是为什么在其他资料甚至官网上也没找到相关的蛛丝马迹呢?有没有什么全局方法能避免这么麻烦的写法?

#2 楼 @swachian 哦。。。coffee 实战很少,多谢指点哈。

#3 楼 @realwol rails3 开始后,就不主张 html 里面混杂 js。而且全局的做法本来也是 js 被人诟病的地方。这个思路合不合中国程序员的口味就另说了。

#5 楼 @swachian 适合不适合不重要,重要的是做法本身的正确与否。

#6 楼 @realwol 暴露过多的全局变量肯定是错误的做法。

另外你说官网上没说这个?上图:

#6 楼 @realwol 在目前的 rails 里,你的写法是不正确的,至少是不提倡的。后面合不合口味的意思是说你还是可以按照自己的想法来的。rails 认为不对的东西你也可以用其他方式来做。

#8 楼 @swachian @realwol 这跟 rails 没关系,只要用 javascript 的地方就不提倡这样写。所以 LZ,即使你一定要逆流而行,也别觉得“我只是没遵守 rails 的习惯罢了”。

#7 楼 @nightire 我就怕这样。。。所以我说的是我”没找到“。。。呵呵,好的,知道了,以后看的时候详细点。

#8 楼 @swachian 恩,好的,多谢指点,受益匪浅。

学习了,刚开始看真没发现有问题,用 coffee 时间也不长

#12 楼 @tyaccp_guojian 我们这些菜鸟都发现不了问题。

#13 楼 @realwol 解决了吗?我也遇到和你一样的问题,如果解决了能说一下吗?

#14 楼 @Perish 加上 $(document).ready ->

几行 css 可以办到的,不用写 js

#14 楼 @Perish 就如楼上所说的就可以解决。

#16 楼 @hhuai 恩,我只是实验下 coffee 而已。

#15 楼 @ChanceDoor 谢谢,根据你说的可以了! #18 楼 @realwol 呵呵,可以了!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号