Coffeescript编译但似乎不起作用

时间:2013-08-08 15:19:59

标签: coffeescript

jQuery ($) ->
    eventMethod = if window.addEventListener then "addEventListener" else "attachEvent"
    eventer = window[eventMethod]
    messageEvent = eventMethod == if "attachEvent" then "onmessage" else "message"

    # Listen to message from child window
    eventer messageEvent, (e) ->
        console.log "parent received message!:  #{e.data}"
        newHeight = e.data
        $("#cf-iframe").css("height", newHeight)
    , false

作为另一篇文章的后续文章。我上面的coffeescript编译得很好。然而它并没有表现出应有的表现。它似乎没有正确地将事件监听器附加到窗口。任何人都可以帮我解决原因吗?

1 个答案:

答案 0 :(得分:3)

Niko是对的,这没有多大意义:

messageEvent = eventMethod == if "attachEvent" then "onmessage" else "message"

内联if的优先级高于==,其优先级高于=,因此您实际上是在说:

messageEvent = (eventMethod == (if "attachEvent" then "onmessage" else "message"))

字符串"attachEvent"是真实的,所以你实际上在说:

messageEvent = (eventMethod == "onmessage")

或更短的时间:

messageEvent = false

eventer函数不知道如何处理布尔值,所以整个事情最终什么都不做。

我想你想这样说:

messageEvent = if eventMethod == 'attachEvent' then 'onmessage' else 'message'

或者您可以使用单个条件与if表达式和destructured assignment一起完成所有操作:

[eventer, event] = if window.addEventListener
                       [window.addEventListener, 'message']
                   else
                       [window.attachEvent, 'onmessage' ]
eventer event, ...

这种方法将所有内容保持在一起,IMO可以产生更清晰的代码。