10.事件

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

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.创建实例” 章节.