CoffeeScript混乱? (KeyUp Jquery)

时间:2012-02-16 23:51:16

标签: coffeescript

我刚刚开始使用coffeescript看看所有的大惊小怪,我喜欢它。然而,在将我的旧脚本转换为咖啡时,我遇到了一个问题:

$(function() {
    $(create_MP).keyup(function(e){
        if(e.which == 16) {
            isShift = false;
        }
    });
});

那是我以前的JQuery所以我试图把它变成coffeescript:

jQuery ->
    $(create_MP).keyup(e) ->
        if e.which == 16
            isShift = false

但是在打开控制台时出现此错误:

application.js:23Uncaught TypeError: Object [object Object] has no method 'keyUp'

有什么想法吗?

2 个答案:

答案 0 :(得分:8)

无论如何,该代码都是错误的。您发布的CoffeeScript等同于:

jQuery(function() {
    $(create_MP).keyup(e)(function() {
        if (e.which == 16) {
            isShift = false
        }
    }
}

也就是说,您正在调用keyup(e)的结果并将函数传递给它。你想要的是用函数作为参数调用keyup()。解决这个问题的最简单方法就是在keyup(e) ->之间加一个空格。

jQuery ->
  $(create_MP).keyup (e) ->
    isShift = false if e.which is 16

答案 1 :(得分:3)

您在评论中注意到的问题不是您唯一的问题。您需要在(e)之前使用空格,否则CoffeeScript会认为您尝试使用keyup参数调用e函数。你想这样说:

jQuery ->
    $(create_MP).keyup (e) ->
        if e.which == 16
            isShift = false

如果没有空格,您的JavaScript将如下所示:

jQuery(function() {
  return $(create_MP).keyup(e)(function() {
    // ...

这没有任何意义,因为keyup(e)不会返回一个函数。但是,如果添加空格,则(e) ->将成为匿名函数的定义,该函数采用单个e参数:

jQuery(function() {
  return $(create_MP).keyup(function(e) {
    // ...

这不仅有意义,它还可以做你想做的事。