由于我现在所在的公司用到的zk框架,遇到了一个需求frozen on top。 简单来说就是滚动超过范围后,希望有一块东西停留在滚动窗口的顶部。

一.zk框架

  1. 查看了zk的8.x版本,发现组件的支持的事件(Event)最大的父类如下:

* <p>Events:<br/>
* onClick, onDoubleClick, onRightClick, onDrop,
* onMouseOver, onMouseOut, onOK, onCacnel, onCtrlKey and onSwipe.<br/>
*
abstract public class HtmlBasedComponent extends AbstractComponent {
...
static {
addClientEvent(HtmlBasedComponent.class, Events.ON_CLICK, 0);
addClientEvent(HtmlBasedComponent.class, Events.ON_DOUBLE_CLICK, 0);
addClientEvent(HtmlBasedComponent.class, Events.ON_RIGHT_CLICK, 0);
addClientEvent(HtmlBasedComponent.class, Events.ON_OK, 0);
addClientEvent(HtmlBasedComponent.class, Events.ON_CANCEL, 0);
addClientEvent(HtmlBasedComponent.class, Events.ON_CTRL_KEY, 0);
addClientEvent(HtmlBasedComponent.class, Events.ON_DROP, 0);
addClientEvent(HtmlBasedComponent.class, Events.ON_MOUSE_OVER, 0); //not to use CE_DUPLICATE_IGNORE since there is an order issue
addClientEvent(HtmlBasedComponent.class, Events.ON_MOUSE_OUT, 0);
addClientEvent(HtmlBasedComponent.class, Events.ON_SWIPE, CE_DUPLICATE_IGNORE);
addClientEvent(HtmlBasedComponent.class, Events.ON_AFTER_SIZE, CE_DUPLICATE_IGNORE);
}
...
}

发现最大的组件所支持的事件并没有我们想要的onScroll事件。然后查一下你想要滚动的目标组件,比如说div component:

div没有属于自己的事件注册。所以div所支持的事件都是父类的所注册的事件。

如果说我们想要在div监听到滚动事件呢?

二.创建属于自己系统的component

ZK框架的扩展性非常强。zk允许用户定义属于自己的组件,所以在这次解决问题的时候我创建了自己的组件cbxDiv。

我们需要做的有以下几点:

  1. 配置lang-addon.xml : 这是zk的配置文件,通常我们把所需要自己的组件信息都定义到这个配置文件,这样zk就会自动识别。
<?xml version="1.0" encoding="UTF-8"?>
<language-addon>
<addon-name>cul</addon-name>
<depends>zul,ckez</depends>
<language-name>xul/html</language-name>
....
<component>
<component-name>cbxdiv</component-name>
<component-class>com.core.cbx.ui.zk.cul.CbxDiv</component-class>
<widget-class>cul.wgt.CbxDiv</widget-class>
<extends>div</extends>
</component>
</language-addon>

这里的component-class就是你组件class的具体位置,widget-class是自己定义的js文件的所在位置。extend当然就是父类。

2.配置zk.wpd:这个是配置你组件的名字,以至于zk可以找到对应关系。

<?xml version="1.0" encoding="UTF-8"?>

<package name="cul.wgt" language="xul/html" depends="zul.wgt">
<widget name="CbxDiv"/>
</package>

3.创建对应的component class

public class CbxDiv extends Div {

    static {
addClientEvent(CbxDiv.class, Events.ON_SCROLL, CE_IMPORTANT);
addClientEvent(CbxDiv.class, Events.ON_SCROLLING, CE_IMPORTANT);
} public CbxDiv() {
super();
} /*
* (non-Javadoc)
* @see org.zkoss.zk.ui.AbstractComponent#service(org.zkoss.zk.ui.event.Event, org.zkoss.zk.ui.ext.Scope)
*/
@Override
public void service(final AuRequest request, final boolean everError) {
final String cmd = request.getCommand();
if (Events.ON_SCROLL.equals(cmd)) {
final ScrollEvent evt = ScrollEventExt.getScrollEventExt(request);
Events.postEvent(evt);
} else if (Events.ON_SCROLLING.equals(cmd)) {
final ScrollEvent evt = ScrollEvent.getScrollEvent(request);
Events.postEvent(evt);
} else {
super.service(request, everError);
}
}
}
addClientEvent()这个方法是注册你自己想要的事件的。重写service是为了具体到的事件对应的处理类。并且数据的绑定。
注意:这个class创建的位置要跟lang-addon.xml配置的位置对应 4.创建自己的js
cul.wgt.CbxDiv = zk.$extends(zul.wgt.Div, {

    bind_: function() {
this.$supers(cul.wgt.CbxDiv, 'bind_', arguments);
this.domListen_(this.$n(), "onScroll", 'doScroll_');
}, unbind_: function() {
this.domUnlisten_(this.$n(), "onScroll", 'doScroll_');
this.$supers(cul.wgt.CbxDiv, 'unbind_', arguments);
}, doScroll_: function() {
this.fire('onScroll',{'x':this.$n().scrollLeft,'y':this.$n().scrollTop},{toServer:true});
} });

主要的方法是对我们的component绑定一个事件,然后触发这个事件的时候发送数据到后台。数据是以map的形式传送。

到这里基本上可以进行测试了。测试步骤就是创建一个cbxDiv,然后里面塞些东西。。在我们后台就可以动态的去加这个监听

test1Div.addEventListener(Events.ON_SCROLL, new EventListener<ScrollEventExt>() {
  @Override
  public void onEvent(final ScrollEventExt event) throws Exception {
    system.out.print("scroll event have been fired!");
  }
}
 

关于ZK框架的onScroll事件的问题的更多相关文章

  1. onscroll事件,onresize事件

    js获取页面元素高度.宽度 网页可见区域宽: document.body.clientWidth;  网页可见区域高: document.body.clientHeight;  网页可见区域宽: do ...

  2. ZK框架的分析与应用

    前言:本文是在下的在学习ZK官方文档时整理出来的初稿.本来里面有很多的效果图片和图片代码的.奈何博客园中图片不能粘贴上去,所以感兴趣的筒子们就将就吧.内容中,如有不好的地方,欢迎斧正! ZK框架的分析 ...

  3. ZK框架笔记1、ZK Ajax框架简介

    简介    ZK是一个基于事件驱动和组件的框架,他为web应用提供了丰富的接口.zk包括一个基于Ajax的事件驱动引擎.一整套丰富的XML用户接口语言(XML User Interface Langu ...

  4. js动态添加onload、onresize、onscroll事件(另类方法)

    js动态添加onload.onresize.onscroll事件(另类方法)   window 的 onload.onresize.onscroll 事件,跟其他的事件不一样,它不能用 attachE ...

  5. zk框架中利用map类型传值来创建window,并且传值

    @Command @NotifyChange("accList") public void clear(@BindingParam("id") String a ...

  6. 移动端(IOS)iframe监听不到 onscroll 事件

    问题描述: 我在一个页面A中有瀑布流,点击瀑布流中的图片需要进入到另外一个页面B,点击返回需要回到页面A中点击的位置,为了实现该效果所以在页面A中嵌入iframe,iframe指向页面B,页面B中同样 ...

  7. onscroll事件没有响应的原因以及vue.js中添加onscroll事件监听的方法

    1 onscroll事件失效 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  8. ZK框架笔记5、事件

            事件是org.zkoss.zk.ui.event.Event类,它通知应用程序发生了什么事情.每一种类型的事件都由一个特定的类来表示.         要响应一个事件,应用程序必须为事 ...

  9. Minor【 PHP框架】5.事件

    框架Github地址:github.com/Orlion/Minor (如果觉得还不错给个star哦(^-^)V) 框架作者: Orlion 知乎:https://www.zhihu.com/peop ...

随机推荐

  1. shell中的数字

    shell中的数字 author :headsen chen date :2017-10-18  15:01:42 个人原创,转载请注明作者,出处,否则依法追究法律责任 1,生成随机数(范围:0-32 ...

  2. Path通过Selenium模拟浏览器抓取,Windows 64解决selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.方法

    1.下载geckodriver.exe: 下载地址:https://github.com/mozilla/geckodriver/releases请根据系统版本选择下载:(如Windows 64位系统 ...

  3. NGUI_slider

    十一.进度条UISlider 1.一般按以下规律使用进度条; 如果某一钟值,他有最大值,需要表达当前的值得占比,则可以使用不可拖动的进度条 如果某一值,他有最大值,需要玩家记性滑动设置,则可以使用可拖 ...

  4. [Bzoj 2547] [Ctsc2002] 玩具兵

    2547: [Ctsc2002]玩具兵 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 317  Solved: 152[Submit][Status] ...

  5. Mycat 分片规则详解--单月小时分片

    实现方式:单月内按照小时拆分,最小粒度是小时,一天最多可以有24个分片,最少1个分片,下个月从头开始循环 优点:使数据按照小时来进行分时存储,颗粒度比日期(天)分片要小,适用于数据采集类存储分片 缺点 ...

  6. Angular开发实践(六):服务端渲染

    Angular Universal Angular在服务端渲染方面提供一套前后端同构解决方案,它就是 Angular Universal(统一平台),一项在服务端运行 Angular 应用的技术. 标 ...

  7. sql模糊查询效率

    在数据库量比较大的时候通常有一些查询,例如查询文本类型的数据,存储量大,用like进行模糊查询效率实在太低 select * from stdcontent where  content like ' ...

  8. <经验杂谈>C#使用AES加密解密的简单介绍

    AES 算法是基于置换和代替的.置换是数据的重新排列,而代替是用一个单元数据替换另一个.AES 使用了几种不同的技术来实现置换和替换. 以下是我自己用c#研究出来算法Code: /// <sum ...

  9. SpringMVC学习笔记三 整合jdbc和事务

    spring整合JDBC spring提供了很多模板整合Dao技术,用于简化编程. 引入相关jar包 spring中提供了一个可以操作数据库的对象,JDBCTemplate(JDBC模板对象).对象封 ...

  10. Java基础学习笔记二十八 管家婆综合项目

    本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添 ...