1
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

作为另一篇文章的后续。我上面的咖啡脚本编译得很好。然而,它并没有表现出应有的行为。它似乎没有正确地将事件侦听器附加到窗口。谁能帮我找出原因?

4

1 回答 1

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表达式和解构赋值来一次完成所有操作:

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

这种方法将所有内容放在一起,并且 IMO 会产生更清晰的代码。

于 2013-08-08T17:33:00.293 回答