1

鉴于此 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”。

4

1 回答 1

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); })"
于 2013-10-23T15:28:17.817 回答