10.事件



  所谓“事件”是指组件执行某个动作(如鼠标单击、内容有输入)后会以某种方式通知页面,使页面执行一段相应的js。
  事件有2个:OnReadyOnEvent.

10.1 OnReady

  OnReady事件是指功能组件的实例已经成功创建后,插件/加载项通知页面的事件,它表示插件的生命周期已经开始,这样页面js就可对其作进一步的操控,例如加载数据。当然在<body>的 onLoad( ) 事件中也可以对组件进行操控,但是我们强烈建议不要写在onLoad()事件中,因为在 onLoad( ) 事件执行时,组件实例未必已创建
  OnReady事件书写举例如下:
<script>
function OnReady( id )
{
 AF.func('Build', 'index.XML');
}
</script>
  插件或加载项只有经过 OnReady 触发才可用,在 OnReady 前试图调用插件的函数都是无效的,因为它的生命周期尚未开始。
  如果页面中有多个插件/加载项,那么OnReady事件会被触发多次,此时就必须根据参数 id 判断事件的发起者,js 应该改写为诸如:
<script>
function OnReady( id )
{
 if(id=='AF1')
  AF1.func('Build', 'index.XML');
 else if(id=='AF2')
  AF2.func('Build', '../index.aspx?pure=xml');
}
</script>
  初学者常常会写错,比如写成如下这种不正确的脚本
<script>
function OnReady( id )
{
  AF1.func('Build', 'index.XML');
  AF2.func('Build', '../index.aspx?pure=xml');
}
</script>
  因为 AF1、AF2 会在各自生命周期开始时触发 OnReady 事件, 假如 AF1 先触发, 那么在 AF1 执行 OnReady 时, AF2 的生命周期通常还没有开始, 所以务必请注意.

  另外有几个疑问需要进一步澄清:
1.OnReady 相当于是控件给页面的通知, 它告诉页面:我已经准备好了! 页面中哪怕不写 function OnReady(id) 函数体, 也不会导致出错的,并且也不影响控件的生命周期;
2.针对 AF 的函数调用, 可以写在 OnReady 中, 也可以写在页面其它地方, 假如我们希望页面打开时加载报表模板, 而用户点击页面上的 “查询” 按钮,时 报表才执行查询功能, 那么您可以这样写:
...
<script>
function OnReady( id )
{
 AF.func('Build', 'myReport.XML');
}
function queryReport()
{
 AF.func('SetSource', 'ds1 \r\n servlet/do?num=12&year=2016');
 AF.func('calc', '');
}
</script>
...
<body>
<input type="button" onClick="queryReport()" value=" 查询 " >
...


10.2 OnEvent

  OnEvent事件是由功能组件的某个动作触发的,例如鼠标、键盘、状态变化等,在何时抛出事件、以及事件的各个参数的含义请参考功能组件各自的文档。
  事件的书写规则举例如下:
<script>
//OnEvent参数说明: “Event”为事件名,p1,p2,p3,p4参数有特定的含义,由具体的功能组件规定.
function OnEvent(id, Event, p1, p2, p3, p4)
{
 if(Event == "SelChanged")
  document.getElementById('Page1').src=p2;
 else if(Event == "RButtonDown")
  AF.func("SetCellData", "1 \r\n price \r\n300");
}
//注1: 控件能触发哪些事件,请参考功能组件的相关文档中的“事件”章节;
//注2: 通常情况下 p1, p2, p3, p4 参数中不会包含回车符,如果里面包含了回车符,那么回车符是 "\\r\\n" 这种形式的串;
</script>
  控件在运行过程中,会触发大量的 OnEvent 事件,您必须通过 if( ) ... else if( ) ... else if( ) ... 条件判断,筛选出您感兴趣的事件执行,就像上例中的那样。
  如下的脚本是拙劣而粗暴的:
function OnEvent(id, Event, p1, p2, p3, p4)
{
 var xml = AF.func("GetChangedXML", "");
}
  事件的语法规则、以及上述示例,是没有差别的。

对上例稍加分析,你会发现所谓 “事件” 只是普通的页面 js 函数,只不过这二个函数名被硕正插件/加载项占用了,当组件触发事件时,实际上就是由插件/加载项反向调用页面的 js 函数而已!


事件脚本应该写在页面的 <head> 中,而不应该写在 <body> 中.


硕正套件允许在创建参数中增加事件日志,使得您可以查看事件的触发情况,请详见树列表或报表的 “1.创建实例” 章节.