这是一个只在客户端的JavaScript 代码中实现的信号槽。
这个类提供一个钩子,使得你能够添加你自己的JavaScript 以 便对事件进行响应。
想清楚再用这个东西。因为 :写出跨浏览器的JavaScript 代码是困难且烦人的 ;要考虑可能的安全问题(以后再讲 );当JavaScript 功能 被禁用甚至根本没有的时候,事件处理就不能用咯。
如果,你想要加上客户端的事件处理,并且要自动退化到服务器端的事件处理 ,并且不要因为写JavaScript 代码而面临那些风险和问题,那么就考虑一下使用无状态 槽(参见 WObject::implementStateless() )吧。
对于某些情况来说,无状态 槽是不合适的,因为它们不允许对状态进行跟踪。另外勒,对于某些非必须的功能 (比如 ,看看 WSuggestionPopup 部件 ),或者是你根本不在乎的情况下, 即使JavaScript 被禁用也没关系。在 这些情况下,可以使用一个JSlot 来加上客户端事件处理功能 。
可使用setJavaScript()方法来设置(或改变)JavaScript 代码,它的参数是一个字符串 ,那个字符串就是一个JavaScript 函数 ,并且具有以下特征:
function(sender, event) {
//处理这个事件,sender是捕获咯这个事件(并且保留咯这个信号)的那个DOM 元素的引用 。
//因为它与一个普通的%Wt信号槽中的sender 是等价的。
//你可以使用以下语句来阻止默认动作:
${WT_CLASS}.cancelEvent(event);
//${WT_CLASS}应当是 WT_CLASS 的值
}
在这个JavaScript 代码中,你可以使用 WWidget::jsRef() 来获取对应于任意 WWidget 的DOM 元素 ,可以使用 WWidget::id() 来获取DOM 标识符。另外 ,你还可以使用WtSignalEmit (参考 JSignal 文档) 这个JavaScript 函数来触发服务器端的事件 。我们只能帮你帮到这里咯 。剩下的就是你自己 、充满漏洞的浏览器和怪异的JavaScript (我经 常从 http://www.quirksmode.org/ 获得一些帮助 )咯--祝你好运。
注意,只要你想要这段JavaScript 代码 被已连接的信号触发,那么这个信号 槽对象就要继续生存下去:当这个信号 槽被销毁时,对应的连接也会被销毁,就像其它的信号 /信号槽连接一样。这就意味着, (几乎 ? )永远不要在栈上声明一个 JSlot 。
HxLauncher: Launch Android applications by voice commands