【问题标题】:Creating jquery draggable "stop" callbacks in a for loop在 for 循环中创建 jquery 可拖动“停止”回调
【发布时间】:2013-07-21 19:17:03
【问题描述】:

我有一个 for 循环遍历可变数量的可拖动元素,为每个元素创建一个停止事件回调。回调函数需要知道它所链接的项目的索引。

我遇到了我认为是闭包的问题:当回调被触发时,传递给回调 (_x) 的循环迭代器索引变量的状态是循环迭代器索引的最后一个值,而不是比定义回调函数时该迭代器索引的值。下面是一些咖啡脚本:

for _x in [0..total]
  $(window).ready $(".draggable-#{_x}").draggable
    cursor: 'move'
    handle: ".draggable-image-move-button-#{_x}"
    containment: 'div#banner-builder-preview'
    stop: =>
      alert "x === #{_x}"

在上面的示例中,警报提示将始终打印“x === total+1”而不是“x === 0”、“x === 1”...等。

对于每个具有停止事件的元素,将唯一索引传递给回调的最佳解决方案是什么?我宁愿这样做,而无需借助另一个 jquery 选择器从触发回调的任何元素中提取更多数据。

更新:

我现在遇到的另一个问题:我的回调,在 for 循环中,看不到文件中定义的其他函数。我认为这很奇怪,即使定义发生在 for 循环用于创建匿名回调函数之前。

例如:

for _x in [0..total]
  do (_x) ->
    $(window).ready $(".draggable-#{_x}").draggable
      cursor: 'move'
      handle: ".draggable-image-move-button-#{_x}"
      containment: 'div#banner-builder-preview'
      stop: =>
        someFunction _x  # ... this line throws an exception, not defined
        alert "x === #{_x}

【问题讨论】:

    标签: jquery jquery-ui coffeescript closures jquery-ui-draggable


    【解决方案1】:

    问题是你的回调:

    stop: =>
      alert "x === #{_x}"
    

    所有最终都引用了_x,但他们在被调用之前不会评估_x。到那时,_x 的值是 total + 1。这是一个常见的问题,CoffeeScript 有 do keyword 提供帮助:

    当使用 JavaScript 循环生成函数时,通常会插入一个闭包包装器以确保循环变量被封闭,并且所有生成的函数不只是共享最终值。 CoffeeScript 提供了 do 关键字,它立即调用传递的函数,转发任何参数。

    所以你可以这样说:

    for _x in [0..total]
      do (_x) ->
        $(window).ready $(".draggable-#{_x}").draggable
          #... as before
    

    【讨论】:

    • 遇到另一个奇怪的问题...请参阅上面的编辑问题。
    • 这对我来说似乎是另一个问题,我需要看看 someFunction 的定义方式和位置,甚至可能是 jsfiddle.net 上的一个小演示
    猜你喜欢
    • 2012-03-05
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多