JavaScript 初学 Coffee 脚本,请教 function 定义问题!

saillee · 2013年06月12日 · 最后由 saillee 回复于 2013年06月12日 · 4243 次阅读

学着把以下一段通过页面按钮调用的 javascript 脚本

mini.parse();

var grid = mini.get("datagrid1");
var editWindow = mini.get("editWindow");
var actionMode = "edit";
grid.load();
grid.sortBy("orderby", "asc");

function search() {
    var key = mini.get("key").getValue();
    if (key!="") {
        grid.load({ key: key });
    } else {
        alert("请输入要查询的内容!");
    }
}

改成 coffee 脚本

jQuery ->
  mini.parse

  grid = mini.get "datagrid1"

  grid.load

  grid.sortBy "duty_id","asc"

  search = ->
    key = mini.get("key").getValue()
    if key isnt ""
      grid.load {key: key}
    else
    alert "请输入要查询的内容!"

search() 前面的代码都能正确执行,但偏偏 search 调不出来。请教一下我 coffee 脚本中存在问题?

你这只是定义了 search function,但是没有调用它,再写个 search()

CoffeeScript 在方法调用方面和 Ruby 不同, 需要显式括号

mini.parse()
grid.load()

另外名字也, JavaScript 不叫 Java 脚本, CoffeeScript 没有这样的叫法.

#1 楼 @iamroody 我是通过页面中的 button 来调用的:

<a class="mini-button" onclick="search()">查询</a>

#3 楼 @saillee coffee 里定义的方法都是局部的,你最好不要这么调用,用事件绑定吧

#3 楼 @saillee coffee 自己给变量加 var ,而且每个文件都在一个匿名函数里执行,所以上面那些相当于 JavaScript (自己多看看编译后的 JavaScript 就清楚了

(function() {

    var search = function () {
        ...
    };

}).call(this)

全局变量是不推荐的,实在需要的化,可以显示的定义为 window 对象的属性:

window.search = search

如果是在 CoffeeScript 文件的 top level 的话也可以写成

@search = search

不过推荐你加个全局的 Object 作为 namespace 来组织这些函数。

App = @App ||= {} App.search = search

// onclick="App.search()"

就你的情况来说,完全没有必要暴露这个函数,你可以直接用 js 来绑定,而不是在 HTML 里混用 JavaScript。当然你需要加些 class, id 方便 jQuery 来选取

$('body').on 'click', 'a.search-button', search

#5 楼 @doitian 非常感谢!很详尽的讲解,使我对 CoffeeScritpt 又有了进一步的认识。

#4 楼 @kikyous 谢谢你的建议。

#2 楼 @jiyinyiyong 谢谢你的建议。

给出解决后的最终代码,供以后有此疑问的同学参考学习: HTML 代码

<a id="btnSearch" class="mini-button">查询</a>

CoffeeScript 代码

jQuery ->
  # 定义要绑定的函数
  search = ->
    key = mini.get("key").getValue()
    if key isnt ""
      grid.load {key: key}
    else
      alert "请输入要查询的内容!"

  # 将要特定的功能函数绑定到相应的DOM中去
  $('#btnSearch').click =>
    search()
需要 登陆 后方可回复, 如果你还没有账号请 注册新账号