0

我有一个有任务的客户的应用程序。要为客户创建新任务,您可以单击添加图标,该图标会打开一个显示新任务表单的精美框。这有以下咖啡脚本:

jQuery ->
  $("a.fancyForm").fancybox
  scrolling: "no"
  titleShow: false

但是,客户也必须有一个努力的目标,否则这些任务都是徒劳的。所以这种关系实际上是客户有很多目标,有很多任务。如果客户已经有了一些目标,那么表格只会询问您它朝着哪个目标努力。如果客户没有目标,那么我想弹出一个确认框,询问用户是否想现在制定目标。这是我目前拥有的咖啡脚本:

$("a.noGoals").click (e) ->
  e.preventDefault()
  confirm_create_goal = confirm("There is currently no Goal for this customer. Would you like to create one?")
  if confirm_create_goal
    $("a.noGoals").fancybox()
  else
    alert "You won't be able to create tasks until a goal is created!"

这通过单击确定弹出确认框似乎什么都不做。如果您再次尝试,它会显示确认框,如果您单击确定或取消,它会显示带有我的新目标表单的正确幻想框。我如何让这个第一次工作?似乎第一次单击确定它只设置了 confirm_create_goal ,然后只在第二次尝试时打开了幻想框。

如果我在第一次尝试时单击“取消”,它会正确显示警报。第二次尝试我点击“ok”没有fancybox。第三次尝试点击“ok”得到fancybox,但如果我点击“cancel”我得到警报然后fancybox oO

4

2 回答 2

1

fancybox() 应该在页面加载时调用,而不是响应点击事件。调用 fancybox() 只是创建了 fancybox 并附加了监听器等。它只是配置它。它没有显示出来。

这是我没有使用 fancybox 的原因之一,因为它的 API 很弱。没有手动显示它的方法。除非您使用的是 fancybox 2。这是一个如何工作的示例:

http://jsfiddle.net/9wAdV/1/

于 2012-07-25T18:50:38.043 回答
0

所以事实证明,像上面那样调用fancybox只是将它附加到点击事件上,而不是调用它。因此,当您再次单击时,无论您的确认框响应如何,它都会显示现在附加到单击事件的幻想框。

我的解决方案,虽然不确定它是否是最好的,但使用 .on() 和 .off() 绑定和取消绑定确认框,然后我可以在 $("a.noGoals").fancybox() 之后触发fancybox称呼:

confirm_create_goal = (e) ->
  e.preventDefault()
  confirm_create = confirm("There is currently no Goal for " + $(this).data("customer") + "'s company, " + $(this).data("company") + ". Would you like to create one?")
  if confirm_create
    $("body").off "click", "a.noGoals", confirm_create_goal
    $("a.noGoals").fancybox(onClosed: ->
      $("body").on "click", "a.noGoals", ->
        alert "Create a Goal!"
    ).trigger "click"
  else
    alert "You won't be able to create tasks until a goal is created!"

$("body").on "click", "a.noGoals", confirm_create_goal

所以函数confirm_create_goal会弹出一个确认框,如果你点击取消,它会发出警报,如果你点击ok,它会从链接中解除绑定,添加fancybox并触发链接上的点击事件。这将打开花式框,一切都正确显示。最后,我添加了一个绑定到链接的警报(以防用户关闭框并尝试执行任务),提醒他们创建目标。

于 2012-07-25T21:48:37.327 回答