前端框架 Avalon 有一个问题,即 在使用 ms-duplex 后,此 input 在 Windows 8.1 的 IE11 下无法正常使用输入法输入中文,这个问题在 Avalon 1.5.X 中一直存在且被复现。

既然无法直接修复,那么就使用 avalon.directive 自定义一个新的指令来简单地处理双向数据绑定。起名为 ms-model,名字来源于 Angular.

实现如下:

avalon.directive("model", {init: function (binding) {// binding 为指令初始化时注入对象.init(binding)();},// 此方法类似 Get / Set, 在控制器使用 $watch 监视 (binding.expr, 即 ms-model="expr") 时触发, 可在此做一些杂七杂八的事情.update: function (newVal, oldVal) {// this 为 init 中的 bingding 对象.this.element.value = newVal;}
});// Definition: ms-model.
function init (binding) {var thisElement = binding.element;  // 指令所在的节点.var directiveValue = binding.expr;  // 指令绑定的属性.var imeIgnored = false;  // 输入法忽略控制标识.// 初始化赋值. 必须推入任务队列才生效.setTimeout(function () {thisElement.value = binding.oldValue !== undefined ? binding.oldValue : "";  // 未赋值进行清空, 防止 IE / Edge 缓存.}, 1);// Definition: Input 事件.var inputEvent = function (event) {if (imeIgnored) { return; }// vmodels 是指令所在的控制器的数组, 看起来是按照 [孙, 子, 父] 的冒泡顺序排序, 但未肯定.// ms-duplex 只处理了指令所在的最近的控制器的数值, 在此也只处理 vmodels[0].eval('binding.vmodels[0].' + directiveValue + ' = thisElement.value;');   // 使用 eval 解决多层嵌套问题.};return function () {// 在使用输入法的时候不进行数据同步.// 进入输入法状态时锁定控制标识.avalon.bind(thisElement, "compositionstart", function () {imeIgnored = true;});// 输入法恢复时释放控制标识.avalon.bind(thisElement, "compositionend", function () {imeIgnored = false;inputEvent();  // Fixing for Edge, Edge 的日语输入法的 input 事件在 compositionend 之前执行, 而其他浏览器包括 IE11 全是 compositionend 之后, 需要手动触发一次.});// 设置 Input 事件.avalon.bind(thisElement, "input", inputEvent, false);// 修复 IE 问题.if (window.ScriptEngine && window.ScriptEngine()) {// 修复 IE9 的 Backspace / Delete 剪切不触发 Input 事件的问题.if (navigator.appVersion.indexOf("MSIE 9.0") > -1) {avalon.bind(thisElement, "cut", function () {setTimeout(inputEvent, 1);  // 必须推入任务队列中执行才生效.});}// IE 额外注册 KeyUp 进行数据绑定来避免输入法无效的问题.avalon.bind(thisElement, "keyup", function (event) {event = event || window.event;if (event.keyCode === 17 || event.keyCode === 18 || event.ctrlKey || event.shiftKey || event.altKey) { return; }inputEvent();});}}
}

新建指令避开 Avalon 的 ms-duplex 的问题相关推荐

  1. 解释hy(Xcms)内容管理系统中,后台manager文件夹中所有ftl页面中指令标签的调用,全部都用@ms.打头的原因

    这几天在研究hy中标签库的写法(类似于freemarker),对于他的后台页面都是ftl格式的,我非常好奇, 大概看完了所有manager文件下的代码,于是便产生了一个疑问,就是它定义的所有标签必须用 ...

  2. 【xyplorer】通过右键新建word文件

    xyplorer右键无法新建word文件 xyplorer相比系统自带的文件管理器有诸多先进功能,但也有一些不便之处. 就我个人的短期使用经历来看,最不便的当属右键新建指令只有空文件夹.空txt和一些 ...

  3. iphone 快捷指令打开 行程码

    每次打开微信,打开小程序,找行程码是不是很烦. 可以用快捷指令 iphone手机背面轻轻点两下 或 三下打开行程码. 首先现在打开行程码最多,最方便的是 微信小程序.然而现在无法用快捷指令打开小程序. ...

  4. vue自定义指令---输入框禁止输入特殊字符

    在输入框中经常要限制它的可输入范围,一般都是调用onChange事件,然后通过正则表达式来处理输入的内容,这样代码量比较大而且不好维护,所以我们需要自定义一个指令来解决这问题. 新建指令文件 impo ...

  5. asp.net ajax工具箱,asp.net(c#) MS AJAX的安装

    见ASP.NET( 然后在ASP.NET网站上找到了在线的文档,并学习了几个控件的简单应用,感觉还瞒是不错的.然后兴致勃勃的回到ASP.NET网站Learn栏目下观看AJAX视频(网址:http:// ...

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

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

  7. java thread等特,进阶之路|奇妙的Thread之旅

    学习导图: 一.为什么要学习Thread? 在Android中,几乎完全采用了Java中的线程机制.线程是最小的调度单位,在很多情况下为了使APP更加流程地运行,我们不可能将很多事情都放在主线程上执行 ...

  8. 游戏服务器框架概括分析

    游戏服务器框架概括分析 关注公众号 风色年代(itfantasycc) 500G游戏开发资料随便拿! 这篇blog题目涉及的范围真大!以至于在这里需要先写一篇前言把范围缩小.选择写这样一个系列的文章, ...

  9. 小米小爱,ESP8266,点灯,WOL唤醒电脑

    一. 需求: 通过小爱让电脑开机(需要电脑主板支持) 二. 简单流程 语音唤醒小爱–>点灯–>esp8266–>发送udp请求电脑–>开机 三.文档 点灯文档:https:// ...

最新文章

  1. 【iOS官方文档翻译】iOS蓝牙的基本概念
  2. 设计模式------代理模式
  3. 接口响应的Response Header打印不出全部值问题
  4. (转)java中的 | ^ 分别是什么?
  5. linux下安装配置DHCP服务器
  6. 有关LinkedList常用方法的源码解析
  7. java选择安装路径的功能怎么实现_水槽怎么选择,从安装方式,材质功能,江水平给你一次性说清楚...
  8. 完了!Windows弱爆了!Linux才是程序员的首选!程序员:好用!
  9. Visual Basic 2005 中的程式語言加強功能
  10. 怎样开图纸便宜_在县城开一家儿童乐园怎么样?开多大面积合适?投资需要多少钱?...
  11. 如何下载火山安卓软件开发平台
  12. visio机柜设备图标_弱电各个设备安装设计大样图,可编辑!(CAD版本)
  13. UL -758_2022电器布线电线电缆安全标准,刚刚发行最新版
  14. xcode archive 去掉dsym文件和添加dsym文件
  15. charles抓包https证书下载
  16. git did not exit cleanly exit code 128
  17. 以数赋能,中国系统让数据治理脱虚入实
  18. 设计模式基础之类与类图
  19. moveit perception
  20. 软件测试行业薪资排名第五!一线城市,月薪多少才够上了及格线?

热门文章

  1. js 点击最后一个 和倒数第二个_精选一组趣知识;最后一个节目是压轴还是压台...
  2. hadoop官方文档_hadoop体系简介
  3. 大一大专计算机考试题型,大专,计算机一级考试考什么内容,麻烦详细点,谢谢。...
  4. python 字典的值是列表_python实现求和python如何通过列表中字典的值对列表进行排序...
  5. python sub 不区分大小写_解决Python列表字符不区分大小写的问题
  6. C语言变参函数的实现,C语言的那些小秘密之变参函数的实现
  7. python exe运行报 编码错误_python运行显示编码错误
  8. 【CF375D】Trees and Queries——树上启发式合并
  9. Autowired byType 与 byName 策略
  10. CF1010F Tree