【发布时间】:2015-12-29 19:58:49
【问题描述】:
我正在尝试使用 CoffeeScript 实现应用程序对话框(模式)。
目的是您执行一些操作,创建一个 CoffeeScript 对话框对象并将其附加到页面上的一个数组,以便以后可以引用它们(如果有多个)。
当某些事件(例如单击叠加层)发生时,我想隐藏叠加层以及所有现有对话框,方法是销毁它们。
为了方便,我也使用 jQuery。
我的愿望是学习如何使用 JavaScript/CoffeeScript 对象与 DOM 进行交互,而不是在一个庞大的 JS 文件中到处触发一堆全局事件。
目前,当我在下面调用dialog.destroy() 时,控制台(使用 Chrome 开发工具)状态:
Uncaught TypeError: dialog.destroy is not a function
HTML 页面
<a href="#" id="create-dialog-link">Link</a>
<div id="overlay"></div>
CoffeeScript 全局文件
$("#create-dialog-link").on "click", ->
new Dialog("<div class='dialog'>content</div>")
$("#overlay").on "click", ->
this.hide() # Hide overlay
dialog.destroy() for dialog in window.dialogs
CoffeeScript 对话框类
class @Dialog
constructor: (element) ->
window.dialogs ||= [] # Initialize "global" array of dialogs
@element = $(element) # Turn into jQuery object
$("#overlay").show()
@append_to_body()
append_to_body: ->
$("body").append(@element) # Actually add HTML to DOM
window.dialogs.push(@element) # Store array of dialogs
destroy: ->
@element.remove() # Completely remove from DOM
【问题讨论】:
-
可能有助于找到你自己的答案是意识到你不是用coffeescript做的,而是用jQuery做的。 Coffeescript 只是一种解析为另一种语法(Javascript)的语法。
-
@muistooshort:我用该代码更新了 Dialog 类构造函数 (
window.dialogs ||= []) -
@muistooshort:为什么我需要引用
window.dialog(单数)?目的是创建一个 JS 对象数组,然后在#overlay的事件处理程序中对每个对象调用destroy()方法。我只是不确定我明白你在问什么。 -
抱歉,我忽略了点击处理程序中的
for循环,因此我对dialog和dialogs感到困惑。您是否查看过点击处理程序中的window.dialogs以查看它实际包含的内容,而不是您期望它包含的内容?Dialog类中的类属性 (@dialogs: [ ]) 会比window.dialogs更好,然后您可以将类方法添加到Dialog并在叠加层的单击处理程序中说Dialog.destroy_all()而不是搞乱全局变量。 -
@muistooshort:这是个好主意;我很好奇添加一个类级变量与一个全局窗口。我实际上发现了我的问题,并且与您所说的很接近。当我执行
window.dialogs.push(@element)时,它实际上应该是window.dialogs.push(this)...我推送的是DIV 的jQuery 对象而不是Dialog 对象。
标签: javascript jquery coffeescript javascript-objects