鉴于此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”。
答案 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); })"