如何在Fay中获得“this”这个对象?

时间:2013-10-20 12:57:32

标签: jquery haskell fay

鉴于此HTML:

  <div class="blah" id="div1">a</div>
  <div class="blah" id="div2">b</div>

我正在尝试使处理程序依赖于“this”的值,就像在下面的JavaScript代码中一样:

$(document).ready(function() {
  $(".blah").click(function() {
    alert(this.id); }); });

如何在Fay中做到这一点?我没有找到API来做到这一点。看起来直接从main调用ffi是不可能的:

main = ready $ do
  select ".blah" >>= onClick (\_ ->
    ffi "alert(this.id)")

我得到“Test $ ffi未定义”。我设法使用以下代码调用ffi:

alertthis = ffi "alert(this.id)"
main = ready $ do
  select ".blah" >>= onClick (\_ ->
    alertthis)

但现在“this”指的是某些特定于Fay的对象,并且没有属性“id”。

1 个答案:

答案 0 :(得分:1)

首先,你没有你的ffi调用的类型签名,要么做一个顶级声明(我认为fay会给出一个错误,但也许它没有,应该修复它):

alert :: sometype -> Fay ()
alert = ffi "alert(%1)"

或在表达级别使用它:

(\_ -> (ffi "alert(%1)" :: sometype -> Fay ()) myThis))

this在Fay函数中不可用,因为它与js函数的表示形式不同,有一些转换发生,因此this在此过程中丢失。

我们认为依靠this被绑定并不好。您没有给出onClick函数的定义,但可能是您在回调中忽略的参数包含具有target属性的事件对象。由于事件传播,这并不总是有效,如果这是一个问题,你可以将this传递给它,比如

onClick :: (Element -> Event -> Fay ()) -> JQuery -> Fay JQuery
onClick = ffi "%2.click(function (e) { %1(this, e); })"