博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
系统滚动条实现的NUD控件Unusable版
阅读量:6250 次
发布时间:2019-06-22

本文共 2182 字,大约阅读时间需要 7 分钟。

昨天研究了一下系统滚动条,准备使用它来实现一个NumericUpDown控件,因为它可以带来最正宗的微调按钮外观emteeth.gif,并说了一下可以使用viewport里的onScroll事件来获取系统滚动条的上下点击动作。

    同时昨天还说了onScroll事件的一个问题是,在点击了滚动条的上下按钮后,onScroll事件会被连续的触发n次(n取[1,4])。我们发现这些连续事件都在一个很小的timespan里触发的,也就在12ms以内。于是我们在onScroll事件中使用setTimeout来启动一次有意义的数值变化,代码如下,分支false用来判断点击的方向。

None.gif
if ( NumericUpDown.ScrollBegin == 0 )
None.gif{  
None.gif    NumericUpDown.ScrollBegin = 
new Date().getTime();
None.gif    NumericUpDown.ChangeNumeric.Element = elmt;
None.gif    window.setTimeout(NumericUpDown.ChangeNumeric, 12);
None.gif}
None.gif
else
None.gif{
None.gif    
var time = 
new Date().getTime();
None.gif    
if ( NumericUpDown.ScrollDirection == 0 )
None.gif    {
None.gif         
var scrollOffset = NumericUpDown.ScrollTopValue - elmt.scrollTop;
None.gif         NumericUpDown.ScrollDirection = scrollOffset > 0 ? 1 : -1; 
None.gif         NumericUpDown.ScrollTopValue = elmt.scrollTop; 
None.gif    }
None.gif}

    控件使用一个DIV,一个SPAN和一个INPUT type='hidden'来实现,DIV的overflow-y设为scroll,SPAN用来显示当前的数值,INPUT type='hidden'用来存放控件当前的数值。

None.gif    
<
div 
tabindex
="0"
 Step
="1"
 Precision
="0"
 onscroll
="NumericUpDown.DoScroll(this)"
None.gif         style
="cursor: default; border: solid 1px red; overflow-y: scroll; width: 50;
None.gif         height: expression(this.all.tags('SPAN')[0].offsetHeight);"
>
None.gif         
<
span 
style
="display: block; white-space: nowrap; text-indent: 2;"
>1
span><input
None.gif             
type="hidden" id="Hidden1" value="1" />div>
   
初始化控件的时候,再动态添加两个SPAN分别到默认SPAN的两端,这是因为滚动条如果处在任何一个顶端(top或bottom)是不会触发onScroll事件的,也就是说要把默认那个SPAN放到DIV的正中间,前后在分别有一个SPAN。
None.gif elmt.Current = elmt.Input.value;
None.gif 
var current = parseInt(elmt.Current);
None.gif 
var step = parseInt(elmt.Step);
None.gif 
var previousSpan = NumericUpDown.CreateSpan();
None.gif previousSpan.innerText = current - step;
None.gif 
var nextSpan = NumericUpDown.CreateSpan();
None.gif nextSpan.innerText = current + step;
None.gif 
var currentSpan = elmt.all.tags('SPAN')[0];
None.gif currentSpan.insertAdjacentElement('beforeBegin', previousSpan);
None.gif currentSpan.insertAdjacentElement('afterEnd', nextSpan);
None.gif NumericUpDown.ScrollTo.CurrentSpan = currentSpan;
None.gif window.setTimeout(NumericUpDown.ScrollTo, 1);        
None.gif elmt.IsInitialized = 
true;
    
    
控件NumericUpDown代码为: 
ContractedBlock.gif<
script 
language="javascript">
dot.gif
script>
    
    由于在这个页面上注入代码太麻烦了,就把demo放到 了。虽然这个NumericUpDown自然的就可以支持键盘Up & Down和PageUp & PageDown,可是最后一个问题却真的没有招了,以至于我最终只能放弃这个尝试了。看看demo,框里的数字有些抖动是吧?这是系统的默认行为,而且点击的越快,抖的也越快,真的没有办法了
emsad.gif

    所以完成了也只能叫做Unusable版...

  本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

你可能感兴趣的文章
Psexec 远程执行文件 提示 拒绝访问
查看>>
我的友情链接
查看>>
ibdata1是什么?
查看>>
IT十八掌作业_java基础第十三天_IO
查看>>
ocfs2_inode_lock_full_nested()
查看>>
我的友情链接
查看>>
iOS原生条形码扫描
查看>>
Android软键盘的使用
查看>>
OSPF网络配置排错
查看>>
Centos6.5 Hadoop完全分布集群搭建详解
查看>>
参加51CTO学院软考培训,我通过啦!!!
查看>>
ASP.net 自定义添加404错误 页面
查看>>
在AdMob中介内创建横幅广告自定义事件
查看>>
51cto这个搜索值肿了 赶紧修改下
查看>>
中介者模式
查看>>
更改DNS脚本
查看>>
Mybatis源码阅读之二
查看>>
黑马程序员-Java基础知识预备之Java集合
查看>>
手机上的大数据:移动互联网的入口
查看>>
Can't connect to local MySQL server through socket
查看>>