之前的章节许多示例代码也或多或少地展示了如何使用ms-click来绑定事件了。能直接在模板上绑定是事件,这也是静态模板与动态绑定的一大区别。ms-click不是简单的onclick的别名,它在内部屏蔽了浏览器的差异,并且对许多浏览器暂时不支持的事件做了兼容处理。

总的来说,事件绑定是使用ms-on-☆绑定来实现,但avalon也提供了许多快捷方式,让用户能直接以ms-eventName调用那些常用事件,如下

animationend、 blur、 change、 input、 click、 dblclick、 focus、 keydown、 keypress、 keyup、 mousedown、 mouseenter、 mouseleave、 mousemove、 mouseout、 mouseover、 mouseup、 scan、 scroll、 submit

事件绑定的属性值的格式,必须是函数名或函数名后+小括号(小括号里面添加参数)。

avalon的事件绑定支持多投事件机制(同一个元素可以绑定N个同种事件,如ms-click=fn, ms-click-1=fn2, ms-click-2=fn3),支持传参(默认第一个参数为事件对象,如果第一个位置被占了,我们可以在其他位置使用$event引用事件对象。)

<!DOCTYPE HTML>
<html><head><title>ms-on</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge" /> <script src="avalon.js" ></script><script>var model = avalon.define({$id: "test",firstName: "司徒",array: ["aaa", "bbb", "ccc"],argsClick: function(e, a, b) {alert([].slice.call(arguments).join(" "))},loopClick: function(a, e) {alert(a + "  " + e.type)},status: "",callback: function(e) {model.status = e.type},field: "",check: function(e) {model.field = this.value + "  " + e.type},submit: function() {var data = model.$modelif (window.JSON) {setTimeout(function() {alert(JSON.stringify(data))})}}})</script></head><body><fieldset ms-controller="test"><legend>有关事件回调传参</legend><div ms-mouseenter="callback" ms-mouseleave="callback">{{status}}<br/><input ms-on-input="check"/>{{field}}</div><div ms-click="argsClick($event, 100, firstName)">点我</div><div ms-each-el="array" ><p ms-click="loopClick(el, $event)">{{el}}</p></div><button ms-click="submit">点我</button></fieldset></body>
</html>

<!DOCTYPE HTML>
<html><head><title>ms-on</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge" /> <script src="avalon.js" ></script><script>var count = 0var model = avalon.define({$id: "multi-click",str1: "1",str2: "2",str3: "3",click0: function() {model.str1 = "xxxxxxxxx" + (count++)},click1: function() {model.str2 = "xxxxxxxxx" + (count++)},click2: function() {model.str3 = "xxxxxxxxx" + (count++)}})</script></head><body><fieldset><legend>一个元素绑定多个同种事件的回调</legend><div ms-controller="multi-click"><div ms-click="click0" ms-click-1="click1" ms-click-2="click2" >请点我</div><div>{{str1}}</div><div>{{str2}}</div><div>{{str3}}</div></div></fieldset></body>
</html>

<!DOCTYPE HTML>
<html><head><title>ms-on</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge" /> <script src="avalon.js" ></script><script>avalon.define({$id: "xxx",fn: function() {console.log("11111111")},fn1: function() {console.log("2222222")},fn2: function() {console.log("3333333")}})</script></head><body><div ms-controller="xxx" ms-on-mouseenter-3="fn"ms-on-mouseenter-2="fn1"ms-on-mouseenter-1="fn2"style="width:100px;height:100px;background: red;"></div></body>
</html>

avalon已经对ms-mouseenter, ms-mouseleave进行修复,可以在这里与这里了解这两个事件。到chrome30时,所有浏览器都原生支持这两个事件。

<!DOCTYPE html> <html><head><title>ms-mouseenter, ms-mouseleave</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge" /> <script src="avalon.js"></script><script>avalon.define({$id: "test",fn1: function(e) {console.log(e.type)console.log(this)},fn2: function(e) {console.log(e.type)console.log(this)}})</script></head><body ms-controller="test"><div ms-mouseenter="fn1" ms-mouseleave="fn2" style="background: red;width:200px;height: 200px;padding:20px;"><div style="background: blue;width:160px;height: 160px;margin:20px;"></div></div></body> </html>

最后是mousewheel事件的修改,主要问题是出现firefox上,它死活也不愿意支持mousewheel,在avalon里是用DOMMouseScroll或wheel实现模拟的。我们在事件对象通过wheelDelta属性是否为正数判定它在向上滚动。

<!DOCTYPE html>
<html><head><title>ms-on-mousewheel</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge" /> <script src="avalon.js"></script><script>var model = avalon.define({$id: "test",text: "",callback: function(e) {model.text = e.wheelDelta + "  " + e.type}})</script></head><body ms-controller="test"><div ms-on-mousewheel="callback" id="aaa" style="background: red;width:200px;height: 200px;">{{text}}</div></body>
</html>

此外avalon还对input,animationend事件进行修复,大家也可以直接用avalon.bind, avalon.fn.bind来绑定这些事件。但建议都用ms-on绑定来处理。

迷你MVVM框架 avalonjs 学习教程14、事件绑定相关推荐

  1. 迷你MVVM框架 avalonjs 学习教程20、路由系统

    迷你MVVM框架 avalonjs 学习教程20.路由系统 时间 2014-10-28 14:44:00  Ruby's Louvre 原文  http://www.cnblogs.com/rubyl ...

  2. 迷你MVVM框架 avalonjs 学习教程6、插入移除处理

    ms-if是属于流程绑定的一种,如果表达式为真值那么就将当前元素输出页面,不是就将它移出DOM树.它的效果与上一章节的ms-visible效果看起来相似的,但它会影响到:empty伪类,并能更节约性能 ...

  3. 迷你MVVM框架 avalonjs 入门教程(司徒正美)

    迷你MVVM框架 avalonjs 入门教程 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定属性与动态模板 作用域绑定(ms-controller, ms-important) 模板 ...

  4. 迷你MVVM框架 avalonjs 入门教程

    api大全 OniUI组件库 学习教程 视频教程: 地址1 地址2 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定 作用域绑定(ms-controller, ms-important ...

  5. 迷你MVVM框架 avalonjs 0.71发布

    本版本感谢@黄轩,@月王,@soon,提出一些BUG与功能改进. 首先是事件回调的return false问题,标准浏览器的addEventListener的回调不处理返回值,因此我们还是得fix一下 ...

  6. crm开源系统 tp框架_thinkphp6学习教程与源码 tp6开源CMS系统源码研究

    thinkphp6最新正式版框架上市已经有一段时间了,从官方的介绍来看,tp6的框架和tp5有很大的区别,完全重新改写了底层架构代码和逻辑,所以不支持thinkphp5的无缝升级,也就是说如果你之前的 ...

  7. 日积(Running)月累(ZSSURE):WCF学习之“通过事件绑定控制WinForm宿主程序主界面控件”

    背景: WCF服务需要寄宿到相应的可运行进程中执行,常见的有四种寄宿,分别是控制台程序.WinForm程序.IIS和Windows服务.之前学习老A博客和<WCF全面解析>时最常用到的是控 ...

  8. Mr.J-- jQuery学习笔记(九)--事件绑定移除冒泡

    目录 事件绑定 页面渲染 eventName(fn) on(eventName, fn) 事件移除 定义和用法 语法 $(selector).off(event,selector,function(e ...

  9. [JQuery 学习笔记] 解除事件绑定 unbind()

    unbind()  : 解除事件绑定 <!DOCTYPE html> <html lang="en"> <head><meta chars ...

最新文章

  1. anaconda更换镜像源
  2. postman代码没有问题,但是文件上传失败
  3. 上行短信 写入mysql_7、上行短信处理服务 -功能详细设计 --短信平台
  4. 每天一道LeetCode-----有序数组循环右移n位后,寻找最小值,数组中可能包含重复元素
  5. QMsgPack的用法DEMO
  6. P7518-[省选联考2021A/B卷]宝石【主席树,二分】
  7. 无限滚动重置服务器,简单无限滚动的实现
  8. oracle 12c sql图形化,Oracle 12c PL/SQL程序设计终极指南
  9. 鸟叔linux私房菜基础篇简体,鸟叔的Linux私房菜基础篇-学习笔记(一)
  10. 关于IDEA代码的整理以及函数
  11. 解决用Python对Sqlite进行数据更新比较慢的一种方法
  12. php 微盘系统教程,新版微盘API接口调用方法
  13. 哨兵2号波段_Redis 哨兵使用以及在 Laravel 中的配置
  14. apk当安装程序将文件复制到手机自带的指定文件夹
  15. jetty的安装,优化
  16. 【PCIe】【翻译】AER 内核驱动 《pcieaer-howto》PCI Express高级错误报告驱动程序指南
  17. 案例分析:传统媒体如何借力微信平台推广
  18. 全国地址json android,全国城市+四级城市地址+邮编+区号+经纬度json版
  19. Chrome截取长屏图片
  20. 轻型货车悬架系统的设计(设计说明书+CAD图纸+开题报告+任务书+答辩相关材料)

热门文章

  1. 错过CVPR 2017?绝对不能错过GAIR大讲堂——上海交大专场开启报名
  2. POJ2299 Ultra-QuickSort
  3. Android 开发第四弹:围住神经猫(简单Demo)
  4. 一个供应商只允许一个报价单
  5. 脚本事件中心与事件订阅器
  6. 用Ajax 构建关键任务的企业级Web 应用 ——《深入 Ajax :架构与最佳实践》
  7. IhttpHandler
  8. Neutron — Hierarchical Port Binding(层次化端口绑定)
  9. Cinder LVM Oversubscription in thin provisioning
  10. Python Module_Socket_网络编程