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
作为另一篇文章的后续。我上面的咖啡脚本编译得很好。然而,它并没有表现得像它应该的那样。它似乎没有将事件侦听器正确附加到窗口。谁能帮我找出原因?
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会产生更清晰的代码。